package com.brackeen.javagamebook.graphics3D;
import java.awt.*;
import java.awt.image.*;
import java.util.HashMap;
import com.brackeen.javagamebook.math3D.*;
import com.brackeen.javagamebook.graphics3D.texture.*;
/**
The FastTexturedPolygonRenderer is a PolygonRenderer that
efficiently renders Textures.
*/
public class FastTexturedPolygonRenderer extends PolygonRenderer {
public static final int SCALE_BITS = 12;
public static final int SCALE = 1 << SCALE_BITS;
public static final int INTERP_SIZE_BITS = 4;
public static final int INTERP_SIZE = 1 << INTERP_SIZE_BITS;
protected Vector3D a = new Vector3D();
protected Vector3D b = new Vector3D();
protected Vector3D c = new Vector3D();
protected Vector3D viewPos = new Vector3D();
protected BufferedImage doubleBuffer;
protected short[] doubleBufferData;
protected HashMap scanRenderers;
public FastTexturedPolygonRenderer(Transform3D camera,
ViewWindow viewWindow)
{
this(camera, viewWindow, true);
}
public FastTexturedPolygonRenderer(Transform3D camera,
ViewWindow viewWindow, boolean clearViewEveryFrame)
{
super(camera, viewWindow, clearViewEveryFrame);
}
protected void init() {
destPolygon = new TexturedPolygon3D();
scanConverter = new ScanConverter(viewWindow);
// create renders for each texture (HotSpot optimization)
scanRenderers = new HashMap();
scanRenderers.put(PowerOf2Texture.class,
new PowerOf2TextureRenderer());
scanRenderers.put(ShadedTexture.class,
new ShadedTextureRenderer());
scanRenderers.put(ShadedSurface.class,
new ShadedSurfaceRenderer());
}
public void startFrame(Graphics2D g) {
// initialize buffer
if (doubleBuffer == null ||
doubleBuffer.getWidth() != viewWindow.getWidth() ||
doubleBuffer.getHeight() != viewWindow.getHeight())
{
doubleBuffer = new BufferedImage(
viewWindow.getWidth(), viewWindow.getHeight(),
BufferedImage.TYPE_USHORT_565_RGB);
//doubleBuffer = g.getDeviceConfiguration().createCompatibleImage(
//viewWindow.getWidth(), viewWindow.getHeight());
DataBuffer dest =
doubleBuffer.getRaster().getDataBuffer();
doubleBufferData = ((DataBufferUShort)dest).getData();
}
// clear view
if (clearViewEveryFrame) {
for (int i=0; i<doubleBufferData.length; i++) {
doubleBufferData[i] = 0;
}
}
}
public void endFrame(Graphics2D g) {
// draw the double buffer onto the screen
g.drawImage(doubleBuffer, viewWindow.getLeftOffset(),
viewWindow.getTopOffset(), null);
}
protected void drawCurrentPolygon(Graphics2D g) {
if (!(sourcePolygon instanceof TexturedPolygon3D)) {
// not a textured polygon - return
return;
}
TexturedPolygon3D poly = (TexturedPolygon3D)destPolygon;
Texture texture = poly.getTexture();
ScanRenderer scanRenderer = (ScanRenderer)
scanRenderers.get(texture.getClass());
scanRenderer.setTexture(texture);
Rectangle3D textureBounds = poly.getTextureBounds();
a.setToCrossProduct(textureBounds.getDirectionV(),
textureBounds.getOrigin());
b.setToCrossProduct(textureBounds.getOrigin(),
textureBounds.getDirectionU());
c.setToCrossProduct(textureBounds.getDirectionU(),
textureBounds.getDirectionV());
int y = scanConverter.getTopBoundary();
viewPos.y = viewWindow.convertFromScreenYToViewY(y);
viewPos.z = -viewWindow.getDistance();
while (y<=scanConverter.getBottomBoundary()) {
ScanConverter.Scan scan = scanConverter.getScan(y);
if (scan.isValid()) {
viewPos.x = viewWindow.
convertFromScreenXToViewX(scan.left);
int offset = (y - viewWindow.getTopOffset()) *
viewWindow.getWidth() +
(scan.left - viewWindow.getLeftOffset());
scanRenderer.render(offset, scan.left, scan.right);
}
y++;
viewPos.y--;
}
}
/**
The ScanRenderer class is an abstract inner class of
FastTexturedPolygonRenderer that provides an interface for
rendering a horizontal scan line.
*/
public abstract class ScanRenderer {
protected Texture currentTexture;
public void setTexture(Texture texture) {
this.currentTexture = texture;
}
public abstract void render(int offset,
int left, int right);
}
//================================================
// FASTEST METHOD: no texture (for comparison)
//================================================
public class Method0 extends ScanRenderer {
public void render(int offset, int left, int right) {
for (int x=left; x<=right; x++) {
doubleBufferData[offset++] = (short)0x0007;
}
}
}
//================================================
// METHOD 1: access pixel buffers directly
// and use textures sizes that are a power of 2
//================================================
public class Method1 extends ScanRenderer {
public void render(int offset, int left, int right) {
for (int x=left; x<=right; x++) {
int tx = (int)(a.getDotProduct(viewPos) /
c.getDotProduct(viewPos));
int ty = (int)(b.getDotProduct(viewPos) /
c.getDotProduct(viewPos));
doubleBufferData[offset++] =
currentTexture.getColor(tx, ty);
viewPos.x++;
}
}
}
//================================================
// METHOD 2: avoid redundant calculations
//================================================
public class Method2 extends ScanRenderer {
public void render(int offset, int left, int right) {
float u = a.getDotProduct(viewPos);
float v = b.getDotProduct(viewPos);
float z = c.getDotProduct(viewPos);
float du = a.x;
float dv = b.x;
float dz = c.x;
for (int x=left; x<=right; x++) {
doubleBufferData[offset++] =
currentTexture.getColor(
(int)(u/z), (int)(v/z));
u+=du;
v+=dv;
z+=dz;
}
}
}
//================================================
// METHOD 3: use ints instead of floats
//================================================
public class Method3 extends ScanRenderer {
public void render(int offset, int left, int right) {
int u = (int)(SCALE * a.getDotProduct(viewPos));
int v = (int)(SCALE * b.getDotProduct(viewPos));
int z = (int)(SCALE * c.getDotProduct(viewPos));
int du = (int)(SCALE * a.x);
int dv = (int)(SCALE * b.x);
int dz = (int)(SCALE * c.x);
for (int x=left; x<=right; x++) {
doubleBufferData[offset++] =
currentTexture.getColor(u/z, v/z);
u+=du;
v+=dv;
z+=dz;
}
}
}
//================================================
// METHOD 4: reduce the number of divides
// (interpolate every 16 pixels)
// Also, apply a VM optimization by referrin
没有合适的资源?快使用搜索试试~ 我知道了~
JAVA 3D 游戏愿码
共1227个文件
java:754个
png:348个
obj:39个
需积分: 11 41 下载量 165 浏览量
2008-07-18
15:34:13
上传
评论
收藏 4.16MB RAR 举报
温馨提示
JAVA 3D 游戏愿码
资源详情
资源评论
资源推荐
收起资源包目录
JAVA 3D 游戏愿码 (1227个子文件)
JCmd.bat 183B
cmd.bat 5B
level1.bsh 3KB
main.bsh 1KB
splash.gif 12KB
icon.gif 2KB
.htaccess 42B
HOPE.ICO 766B
AUTORUN.INF 24B
log4j-1.2.6.jar 342KB
bsh-core-1.2b7.jar 122KB
FastTexturedPolygonRenderer.java 16KB
FastTexturedPolygonRenderer.java 16KB
FastTexturedPolygonRenderer.java 16KB
FastTexturedPolygonRenderer.java 16KB
FastTexturedPolygonRenderer.java 16KB
FastTexturedPolygonRenderer.java 16KB
FastTexturedPolygonRenderer.java 16KB
FastTexturedPolygonRenderer.java 16KB
ShadedSurface.java 16KB
ShadedSurface.java 16KB
ShadedSurface.java 16KB
ShadedSurface.java 16KB
ShadedSurface.java 16KB
ShadedSurface.java 16KB
ShadedSurface.java 16KB
ShadedSurface.java 16KB
ZBufferedRenderer.java 14KB
ZBufferedRenderer.java 14KB
ZBufferedRenderer.java 14KB
ZBufferedRenderer.java 14KB
ZBufferedRenderer.java 14KB
ZBufferedRenderer.java 14KB
ZBufferedRenderer.java 14KB
CollisionDetection.java 14KB
CollisionDetection.java 14KB
CollisionDetection.java 14KB
CollisionDetection.java 14KB
CollisionDetection.java 14KB
AIBot.java 14KB
AIBot.java 14KB
GameManager.java 13KB
MapLoader.java 12KB
MainGameState.java 12KB
GameObject.java 12KB
RoomDef.java 12KB
RoomDef.java 12KB
RoomDef.java 12KB
RoomDef.java 12KB
RoomDef.java 12KB
RoomDef.java 12KB
InputManager.java 12KB
MapLoader.java 12KB
MapLoader.java 12KB
MapLoader.java 12KB
MapLoader.java 12KB
MapLoader.java 12KB
InputManager.java 12KB
InputManager.java 12KB
InputManager.java 12KB
InputManager.java 12KB
InputManager.java 12KB
InputManager.java 12KB
InputManager.java 12KB
InputManager.java 12KB
InputManager.java 12KB
InputManager.java 12KB
InputManager.java 12KB
InputManager.java 12KB
InputManager.java 12KB
Simple3DTest2.java 11KB
MovingTransform3D.java 11KB
MovingTransform3D.java 11KB
MovingTransform3D.java 11KB
MovingTransform3D.java 11KB
MovingTransform3D.java 11KB
MovingTransform3D.java 11KB
MovingTransform3D.java 11KB
GameCore3D.java 11KB
GameCore3D.java 11KB
GameCore3D.java 11KB
BSPTreeBuilder.java 11KB
BSPTreeBuilder.java 11KB
BSPTreeBuilder.java 11KB
BSPTreeBuilder.java 11KB
BSPTreeBuilder.java 11KB
BSPTreeBuilder.java 11KB
Polygon3D.java 11KB
Polygon3D.java 11KB
Polygon3D.java 11KB
Polygon3D.java 11KB
Polygon3D.java 11KB
Polygon3D.java 11KB
Polygon3D.java 11KB
Polygon3D.java 11KB
SoundManager.java 10KB
SoundManager.java 10KB
SoundManager.java 10KB
SoundManager.java 10KB
SoundManager.java 10KB
共 1227 条
- 1
- 2
- 3
- 4
- 5
- 6
- 13
liukefu2010
- 粉丝: 1
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 高等数学第一章第二节数列的极限
- Python 版冒泡排序算法源代码
- tensorflow-gpu-2.7.2-cp38-cp38-manylinux2010-x86-64.whl
- tensorflow-2.7.3-cp39-cp39-manylinux2010-x86-64.whl
- tensorflow-2.7.2-cp39-cp39-manylinux2010-x86-64.whl
- Python版本快速排序源代码
- Python 语言版的快速排序算法实现
- 450815388207377安卓_base.apk
- 超微主板 X9DRE-TF+ bios 支持 nvme启动
- 基于Python通过下载气象数据和插值拟合离散数据曲线实现对寒潮过程的能量分析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0