📄 airspacerenderer.java
字号:
gl.glDepthFunc(GL.GL_LEQUAL);
}
protected void endRendering(DrawContext dc)
{
if (dc == null)
{
String message = Logging.getMessage("nullValue.DrawContextIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (dc.getGL() == null)
{
String message = Logging.getMessage("nullValue.DrawingContextGLIsNull");
Logging.logger().severe(message);
throw new IllegalStateException(message);
}
GL gl = dc.getGL();
gl.glPopAttrib();
gl.glPopClientAttrib();
}
protected void bindPickableObject(DrawContext dc, Airspace airspace, PickSupport pickSupport)
{
java.awt.Color pickColor = dc.getUniquePickColor();
int colorCode = pickColor.getRGB();
dc.getGL().glColor3ub((byte) pickColor.getRed(), (byte) pickColor.getGreen(), (byte) pickColor.getBlue());
if (airspace instanceof Locatable)
{
pickSupport.addPickableObject(colorCode, airspace, ((Locatable) airspace).getPosition(), false);
}
else
{
pickSupport.addPickableObject(pickColor.getRGB(), airspace);
}
}
//**************************************************************//
//******************** Geometry Rendering ********************//
//**************************************************************//
public void drawGeometry(DrawContext dc, int mode, int count, int type, Buffer elementBuffer, Geometry geom)
{
if (dc == null)
{
String message = Logging.getMessage("nullValue.DrawContextIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (elementBuffer == null)
{
String message = "nullValue.ElementBufferIsNull";
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (geom == null)
{
String message = "nullValue.AirspaceGeometryIsNull";
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (geom.getBuffer(Geometry.VERTEX) == null)
{
String message = "nullValue.VertexBufferIsNull";
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
GL gl = dc.getGL();
int minElementIndex, maxElementIndex;
int size, glType, stride;
Buffer vertexBuffer, normalBuffer;
size = geom.getSize(Geometry.VERTEX);
glType = geom.getGLType(Geometry.VERTEX);
stride = geom.getStride(Geometry.VERTEX);
vertexBuffer = geom.getBuffer(Geometry.VERTEX);
gl.glVertexPointer(size, glType, stride, vertexBuffer);
normalBuffer = null;
if (!dc.isPickingMode())
{
if (this.isEnableLighting())
{
normalBuffer = geom.getBuffer(Geometry.NORMAL);
if (normalBuffer == null)
{
gl.glDisableClientState(GL.GL_NORMAL_ARRAY);
}
else
{
glType = geom.getGLType(Geometry.NORMAL);
stride = geom.getStride(Geometry.NORMAL);
gl.glNormalPointer(glType, stride, normalBuffer);
}
}
}
// On some hardware, using glDrawRangeElements allows vertex data to be prefetched. We know the minimum and
// maximum index values that are valid in elementBuffer (they are 0 and vertexCount-1), so it's harmless
// to use this approach and allow the hardware to optimize.
minElementIndex = 0;
maxElementIndex = geom.getCount(Geometry.VERTEX) - 1;
gl.glDrawRangeElements(mode, minElementIndex, maxElementIndex, count, type, elementBuffer);
if (!dc.isPickingMode())
{
if (this.isEnableLighting())
{
if (normalBuffer == null)
gl.glEnableClientState(GL.GL_NORMAL_ARRAY);
}
this.logGeometryStatistics(dc, geom);
}
}
public void drawGeometry(DrawContext dc, Geometry geom)
{
if (dc == null)
{
String message = Logging.getMessage("nullValue.DrawContextIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (geom == null)
{
String message = "nullValue.AirspaceGeometryIsNull";
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (geom.getBuffer(Geometry.ELEMENT) == null)
{
String message = "nullValue.ElementBufferIsNull";
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
int mode, count, type;
Buffer elementBuffer;
mode = geom.getMode(Geometry.ELEMENT);
count = geom.getCount(Geometry.ELEMENT);
type = geom.getGLType(Geometry.ELEMENT);
elementBuffer = geom.getBuffer(Geometry.ELEMENT);
this.drawGeometry(dc, mode, count, type, elementBuffer, geom);
}
public void drawGeometry(DrawContext dc, Geometry elementGeom, Geometry vertexGeom)
{
if (dc == null)
{
String message = Logging.getMessage("nullValue.DrawContextIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (elementGeom == null)
{
String message = "nullValue.ElementGeometryIsNull";
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (elementGeom.getBuffer(Geometry.ELEMENT) == null)
{
String message = "nullValue.ElementBufferIsNull";
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (vertexGeom == null)
{
String message = "nullValue.VertexGeometryIsNull";
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
int mode, count, type;
Buffer elementBuffer;
mode = elementGeom.getMode(Geometry.ELEMENT);
count = elementGeom.getCount(Geometry.ELEMENT);
type = elementGeom.getGLType(Geometry.ELEMENT);
elementBuffer = elementGeom.getBuffer(Geometry.ELEMENT);
this.drawGeometry(dc, mode, count, type, elementBuffer, vertexGeom);
}
//**************************************************************//
//******************** Rendering Support *********************//
//**************************************************************//
public void setBlending(DrawContext dc)
{
if (dc == null)
{
String message = Logging.getMessage("nullValue.DrawContextIsNull");
Logging.logger().severe(message);
throw new IllegalStateException(message);
}
if (dc.getGL() == null)
{
String message = Logging.getMessage("nullValue.DrawingContextGLIsNull");
Logging.logger().severe(message);
throw new IllegalStateException(message);
}
GL gl = dc.getGL();
if (this.isUseEXTBlendFuncSeparate())
this.setHaveEXTBlendFuncSeparate(gl.isExtensionAvailable(EXT_BLEND_FUNC_SEPARATE_STRING));
gl.glEnable(GL.GL_ALPHA_TEST);
gl.glAlphaFunc(GL.GL_GREATER, 0.0f);
gl.glEnable(GL.GL_BLEND);
// The separate blend function correctly handles regular (non-premultiplied) colors. We want
// Cd = Cs*As + Cf*(1-As)
// Ad = As + Af*(1-As)
// So we use GL_EXT_blend_func_separate to specify different blending factors for source color and source
// alpha.
if (this.isUseEXTBlendFuncSeparate() && this.isHaveEXTBlendFuncSeparate())
{
gl.glBlendFuncSeparate(
GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA, // rgb blending factors
GL.GL_ONE, GL.GL_ONE_MINUS_SRC_ALPHA); // alpha blending factors
}
// Fallback to a single blending factor for source color and source alpha. The destination alpha will be
// incorrect.
else
{
gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); // rgba blending factors
}
}
public void setLighting(DrawContext dc)
{
if (dc == null)
{
String message = Logging.getMessage("nullValue.DrawContextIsNull");
Logging.logger().severe(message);
throw new IllegalStateException(message);
}
if (dc.getGL() == null)
{
String message = Logging.getMessage("nullValue.DrawingContextGLIsNull");
Logging.logger().severe(message);
throw new IllegalStateException(message);
}
GL gl = dc.getGL();
gl.glEnable(GL.GL_LIGHTING);
setLightModel(gl);
setShadeModel(gl);
gl.glEnable(GL.GL_LIGHT0);
setLightMaterial(gl, GL.GL_LIGHT0, this.lightMaterial);
setLightDirection(gl, GL.GL_LIGHT0, this.lightDirection);
}
protected static void setLightModel(GL gl)
{
if (gl == null)
{
String message = Logging.getMessage("nullValue.GLIsNull");
Logging.logger().severe(message);
throw new IllegalStateException(message);
}
float[] modelAmbient = new float[4];
modelAmbient[0] = 1.0f;
modelAmbient[1] = 1.0f;
modelAmbient[2] = 1.0f;
modelAmbient[3] = 0.0f;
gl.glLightModelfv(GL.GL_LIGHT_MODEL_AMBIENT, modelAmbient, 0);
gl.glLightModeli(GL.GL_LIGHT_MODEL_LOCAL_VIEWER, GL.GL_TRUE);
gl.glLightModeli(GL.GL_LIGHT_MODEL_TWO_SIDE, GL.GL_FALSE);
}
protected static void setShadeModel(GL gl)
{
if (gl == null)
{
String message = Logging.getMessage("nullValue.GLIsNull");
Logging.logger().severe(message);
throw new IllegalStateException(message);
}
gl.glShadeModel(GL.GL_SMOOTH);
}
protected static void setLightMaterial(GL gl, int light, Material material)
{
if (gl == null)
{
String message = Logging.getMessage("nullValue.GLIsNull");
Logging.logger().severe(message);
throw new IllegalStateException(message);
}
if (material == null)
{
String message = Logging.getMessage("nullValue.MaterialIsNull");
Logging.logger().severe(message);
throw new IllegalStateException(message);
}
// The alpha value at a vertex is taken only from the diffuse material's alpha channel, without any
// lighting computations applied. Therefore we specify alpha=0 for all lighting ambient, specular and
// emission values. This will have no effect on material alpha.
float[] ambient = new float[4];
float[] diffuse = new float[4];
float[] specular = new float[4];
material.getDiffuse().getRGBColorComponents(diffuse);
material.getSpecular().getRGBColorComponents(specular);
ambient[3] = diffuse[3] = specular[3] = 0.0f;
gl.glLightfv(light, GL.GL_AMBIENT, ambient, 0);
gl.glLightfv(light, GL.GL_DIFFUSE, diffuse, 0);
gl.glLightfv(light, GL.GL_SPECULAR, specular, 0);
}
protected static void setLightDirection(GL gl, int light, Vec4 direction)
{
if (gl == null)
{
String message = Logging.getMessage("nullValue.GLIsNull");
Logging.logger().severe(message);
throw new IllegalStateException(message);
}
if (direction == null)
{
String message = Logging.getMessage("nullValue.DirectionIsNull");
Logging.logger().severe(message);
throw new IllegalStateException(message);
}
// Setup the light as a directional light coming from the viewpoint. This requires two state changes
// (a) Set the light position as direction x, y, z, and set the w-component to 0, which tells OpenGL this is
// a directional light.
// (b) Invoke the light position call with the identity matrix on the modelview stack. Since the position
// is transfomed by the
Vec4 vec = direction.normalize3();
float[] params = new float[4];
params[0] = (float) vec.x;
params[1] = (float) vec.y;
params[2] = (float) vec.z;
params[3] = 0.0f;
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glPushMatrix();
gl.glLoadIdentity();
gl.glLightfv(light, GL.GL_POSITION, params, 0);
gl.glPopMatrix();
}
protected void logGeometryStatistics(DrawContext dc, Geometry geom)
{
if (dc == null)
{
String message = Logging.getMessage("nullValue.DrawContextIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
if (geom == null)
{
String message = Logging.getMessage("nullValue.GeometryIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
int geomCount = 0;
int vertexCount = 0;
Iterator<PerformanceStatistic> iter = dc.getPerFrameStatistics().iterator();
while (iter.hasNext())
{
PerformanceStatistic stat = iter.next();
if (PerformanceStatistic.AIRSPACE_GEOMETRY_COUNT.equals(stat.getKey()))
{
geomCount += (Integer) stat.getValue();
iter.remove();
}
if (PerformanceStatistic.AIRSPACE_VERTEX_COUNT.equals(stat.getKey()))
{
vertexCount += (Integer) stat.getValue();
iter.remove();
}
}
geomCount += 1;
vertexCount += geom.getCount(Geometry.VERTEX);
dc.setPerFrameStatistic(PerformanceStatistic.AIRSPACE_GEOMETRY_COUNT, "Airspace Geometry Count", geomCount);
dc.setPerFrameStatistic(PerformanceStatistic.AIRSPACE_VERTEX_COUNT, "Airspace Vertex Count", vertexCount);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -