package com.brackeen.javagamebook.graphics3D; import java.awt.*; import java.awt.image.*; import com.brackeen.javagamebook.math3D.*; public class SolidZBufferedRenderer extends PolygonRenderer { /** The minimum distance for z-buffering. Larger values give more accurate calculations for further distances. */ protected static final int MIN_DISTANCE = 12; protected ZBuffer zBuffer; // used for calculating depth protected float w; 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 c = new Vector3D(); protected Vector3D viewPos = new Vector3D(); protected BufferedImage doubleBuffer; protected short[] doubleBufferData; ScanRenderer scanRenderer; public SolidZBufferedRenderer(Transform3D camera, ViewWindow viewWindow) { super(camera, viewWindow, true); } protected void init() { destPolygon = new SolidPolygon3D(); scanConverter = new ScanConverter(viewWindow); scanRenderer = new Method1(); } public void startFrame(Graphics2D g) { super.startFrame(g); // initialize depth buffer if (zBuffer == null || zBuffer.getWidth() != viewWindow.getWidth() || zBuffer.getHeight() != viewWindow.getHeight()) { zBuffer = new ZBuffer( viewWindow.getWidth(), viewWindow.getHeight()); } else if (clearViewEveryFrame) { zBuffer.clear(); } // 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> SCALE_BITS))) { doubleBufferData[offset] = (short) ((SolidPolygon3D)destPolygon).getColor().getRGB(); } offset++; depth+=dDepth; } } } }