📄 jogltrianglemeshrenderer.java
字号:
//===========================================================================//=-------------------------------------------------------------------------=//= Module history: =//= - August 8 2005 - David Diaz, Lina Rojas, Gabriel Sarmiento: Original =//= base version =//= - August 7 2006 - Oscar Chavarro: re-structured and tested =//= - November 13 2006 - Oscar Chavarro: re-structured and tested =//===========================================================================package vsdk.toolkit.render.jogl;// Basic Java classesimport java.util.ArrayList;// JOGL classesimport javax.media.opengl.GL;// VitralSDK classesimport vsdk.toolkit.common.ColorRgb;import vsdk.toolkit.common.VSDK;import vsdk.toolkit.common.Vertex;import vsdk.toolkit.common.Vector3D;import vsdk.toolkit.common.RendererConfiguration;import vsdk.toolkit.media.Image;import vsdk.toolkit.environment.geometry.TriangleMesh;import vsdk.toolkit.environment.Material;public class JoglTriangleMeshRenderer extends JoglRenderer { /** @todo program this! */ public static void drawWithSelection(GL gl, TriangleMesh mesh, RendererConfiguration quality, boolean flip, ArrayList<int[]> selectedTriangles) { draw(gl, mesh, quality, flip); } /** Generate OpenGL/JOGL primitives needed for the rendering of recieved Geometry object. @todo Handle PHONG and BUMPMAPPING cases, via vertex/program shaders */ public static void draw(GL gl, TriangleMesh mesh, RendererConfiguration quality, boolean flip) { boolean withTextures = false; if ( mesh.getTextures() != null && mesh.getTextures().length > 0 ) { withTextures = true; } gl.glEnable(gl.GL_NORMALIZE); //----------------------------------------------------------------- if ( quality.isBumpMapSet() ) { // Prepare bump mapping and shaders... ; } if ( quality.isSurfacesSet() ) { // This line doesn't make sense (as it will later reactivated), // but it is needed in some graphics cards/driver/os combinations // like AMD Athlon64 running 32 bit Fedora Core 6 with Nvidia C51 gl.glDisable(gl.GL_LIGHTING); // JoglGeometryRenderer.prepareSurfaceQuality(gl, quality); gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_FILL); gl.glPolygonOffset(0.0f, 0.0f); if ( quality.isTextureSet() && withTextures ) { // drawSurfacesWithTexture can enable GL_TEXTURE_2D drawSurfacesWithTexture(gl, mesh, flip); } else { drawSurfacesWithoutTexture(gl, mesh, flip); } } if ( quality.isWiresSet() ) { gl.glDisable(gl.GL_LIGHTING); gl.glDisable(gl.GL_CULL_FACE); gl.glShadeModel(gl.GL_FLAT); gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_LINE); gl.glEnable(gl.GL_POLYGON_OFFSET_LINE); gl.glPolygonOffset(-0.5f, 0.0f); gl.glLineWidth(1.0f); // Warning: Change with configured color for borders ColorRgb c = quality.getWireColor(); gl.glColor3d(c.r, c.g, c.b); gl.glDisable(gl.GL_TEXTURE_2D); // Warning: pending definition of this behavior... drawSurfacesWithoutTexture(gl, mesh, flip);/* if ( quality.isTextureSet() && withTextures ) { // drawSurfacesWithTexture can enable GL_TEXTURE_2D drawSurfacesWithTexture(gl, mesh, flip); } else { drawSurfacesWithoutTexture(gl, mesh, flip); }*/ } //- Drawing control of elements with no surface ------------------- if ( quality.isPointsSet() ) { drawPoints(gl, mesh); } if ( quality.isNormalsSet() ) { drawVertexNormals(gl, mesh); } if ( quality.isTrianglesNormalsSet() ) { drawTriangleNormals(gl, mesh); } if ( quality.isBoundingVolumeSet() ) { JoglGeometryRenderer.drawMinMaxBox(gl, mesh, quality); } if ( quality.isSelectionCornersSet() ) { JoglGeometryRenderer.drawSelectionCorners(gl, mesh, quality); } } private static void drawPoints(GL gl, TriangleMesh mesh) { gl.glDisable(gl.GL_LIGHTING); gl.glDisable(gl.GL_TEXTURE_2D); // Warning: Change with configured color for point gl.glColor3d(1, 0, 0); gl.glPointSize(2.0f); gl.glBegin(gl.GL_POINTS); for ( int i = 0; i < mesh.getVertexes().length; i++ ) { gl.glVertex3d(mesh.getVertexAt(i).getPosition().x, mesh.getVertexAt(i).getPosition().y, mesh.getVertexAt(i).getPosition().z); } gl.glEnd(); } private static void drawVertexNormals(GL gl, TriangleMesh mesh) { gl.glDisable(gl.GL_LIGHTING); gl.glDisable(gl.GL_TEXTURE_2D); // Warning: Change with configured color for vertex normals gl.glColor3d(1, 1, 0); gl.glLineWidth(1.0f); gl.glBegin(gl.GL_LINES); for ( int i = 0; i < mesh.getTriangles().length; i++ ) { Vertex vertex = mesh.getVertexAt(mesh.getTriangleAt(i).getPoint0()); JoglGeometryRenderer.drawVertexNormal(gl, vertex); vertex = mesh.getVertexAt(mesh.getTriangleAt(i).getPoint1()); JoglGeometryRenderer.drawVertexNormal(gl, vertex); vertex = mesh.getVertexAt(mesh.getTriangleAt(i).getPoint2()); JoglGeometryRenderer.drawVertexNormal(gl, vertex); } gl.glEnd(); } private static void drawTriangleNormals(GL gl, TriangleMesh m) { double l = 0.15; gl.glDisable(gl.GL_LIGHTING); gl.glDisable(gl.GL_TEXTURE_2D); // Warning: Change with configured color for surface normals gl.glColor3d(0.9, 0.9, 0.5); gl.glLineWidth(2.0f); gl.glBegin(gl.GL_LINES); for ( int i = 0; i < m.getTriangles().length; i++ ) { double cx = m.getVertexAt(m.getTriangleAt(i).getPoint0()).getPosition().x; cx += m.getVertexAt(m.getTriangleAt(i).getPoint1()).getPosition().x; cx += m.getVertexAt(m.getTriangleAt(i).getPoint2()).getPosition().x; double cy = m.getVertexAt(m.getTriangleAt(i).getPoint0()).getPosition().y; cy += m.getVertexAt(m.getTriangleAt(i).getPoint1()).getPosition().y; cy += m.getVertexAt(m.getTriangleAt(i).getPoint2()).getPosition().y; double cz = m.getVertexAt(m.getTriangleAt(i).getPoint0()).getPosition().z; cz += m.getVertexAt(m.getTriangleAt(i).getPoint1()).getPosition().z; cz += m.getVertexAt(m.getTriangleAt(i).getPoint2()).getPosition().z; cx /= 3; cy /= 3; cz /= 3; gl.glVertex3d(cx, cy, cz); gl.glVertex3d(cx + m.getTriangleAt(i).normal.x * l, cy + m.getTriangleAt(i).normal.y * l, cz + m.getTriangleAt(i).normal.z * l); } gl.glEnd(); } private static void drawSurfacesWithoutTexture(GL gl, TriangleMesh mesh, boolean flipNormals) { //----------------------------------------------------------------- // Warning: Shoult this be here? or not ... // Just in case using external texture... gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR); gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR); gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_REPEAT); gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_T, gl.GL_REPEAT); gl.glTexEnvf(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE); //----------------------------------------------------------------- if ( mesh.getTriangles() == null ) { VSDK.reportMessage(null, VSDK.WARNING, "JoglTriangleMeshRenderer.activate", "Trying to draw mesh without triangles?");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -