From 4a5b9e0b9ecc97203d4089ca0cd0d6df8c76bf1c Mon Sep 17 00:00:00 2001 From: Normand Briere <nbriere@noware.ca> Date: Mon, 22 Apr 2019 17:29:27 -0400 Subject: [PATCH] Fix theRenderer --- CameraPane.java | 614 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 556 insertions(+), 58 deletions(-) diff --git a/CameraPane.java b/CameraPane.java index 36fbe8d..b54e1a7 100644 --- a/CameraPane.java +++ b/CameraPane.java @@ -149,12 +149,11 @@ defaultcaps.setAccumBlueBits(16); defaultcaps.setAccumAlphaBits(16); } - static CameraPane theRenderer; - + void SetAsGLRenderer(boolean b) { isRenderer = b; - theRenderer = this; + Globals.theRenderer = this; } CameraPane(Object3D o, Camera cam, boolean withcontext) @@ -191,6 +190,11 @@ } /// INTERFACE + + public boolean IsBoxMode() + { + return BOXMODE; + } public void ClearDepth() { @@ -231,9 +235,14 @@ return this.ambientOcclusion; } + public boolean IsDebugSelection() + { + return DEBUG_SELECTION; + } + public boolean IsFrozen() { - boolean selectmode = this.DrawMode() == SELECTION || CameraPane.DEBUG_SELECTION; + boolean selectmode = this.DrawMode() == SELECTION || this.IsDebugSelection(); return !selectmode && cameracount == 0; // != 0; } @@ -254,9 +263,19 @@ return lightCamera; } + public Camera ManipCamera() + { + return manipCamera; + } + public Camera RenderCamera() { return renderCamera; + } + + public Camera[] Cameras() + { + return cameras; } public void PushMaterial(Object3D obj, boolean selected) @@ -403,7 +422,7 @@ javax.media.opengl.GL gl = display.GetGL(); - boolean selectmode = display.DrawMode() == display.SELECTION || CameraPane.DEBUG_SELECTION; + boolean selectmode = display.DrawMode() == display.SELECTION || display.IsDebugSelection(); //System.out.println("p = " + pv + "; q = " + qv + "; r = " + rv); if (!selectmode) // display.drawMode != display.SELECTION) // && display.drawMode != display.SHADOW) // (attributes & FILL) != 0) @@ -566,6 +585,480 @@ } } + /** + * <code>draw</code> renders a <code>TriMesh</code> object including + * it's normals, colors, textures and vertices. + * + * @see Renderer#draw(TriMesh) + * @param tris + * the mesh to render. + */ + public void DrawParticles(TriMesh geo, Object3D shape, boolean selected, boolean rotate) // TriMesh tris) + { + CameraPane display = this; + + float r = display.modelParams0[0]; + float g = display.modelParams0[1]; + float b = display.modelParams0[2]; + float opacity = display.modelParams5[1]; + + //final GL gl = GLU.getCurrentGL(); + GL gl = display.GetGL(); // getGL(); + + FloatBuffer vertBuf = geo.vertBuf; + + int v = vertBuf.capacity(); + + int count = 0; + + boolean cf = gl.glIsEnabled(gl.GL_CULL_FACE); + gl.glEnable(gl.GL_CULL_FACE); + // gl.glScalef(1.0f/1024,1.0f/1024,1.0f/1024); + for (int i=0; i<v/3; i++) + { + int index3 = i*3; + + if (geo.sizeBuf.get(index3+1) == 0) + continue; + + count++; + + int index4 = i*4; + + float tx = vertBuf.get(index3); + float ty = vertBuf.get(index3+1); + float tz = vertBuf.get(index3+2); + + // if (tx == 0 && ty == 0 && tz == 0) + // continue; + + gl.glMatrixMode(gl.GL_TEXTURE); + gl.glPushMatrix(); + + float[] texmat = geo.texmat; + texmat[12] = texmat[13] = texmat[14] = i; + + gl.glMultMatrixf(texmat, 0); + + gl.glMatrixMode(gl.GL_MODELVIEW); + gl.glPushMatrix(); + + gl.glTranslatef(tx,ty,tz); + + if (rotate) + gl.glRotatef(i, 0, 1, 0); + + float size = geo.sizeBuf.get(index3) / 100; + gl.glScalef(size,size,size); + + float cr = geo.colorBuf.get(index4); + float cg = geo.colorBuf.get(index4+1); + float cb = geo.colorBuf.get(index4+2); + float ca = geo.colorBuf.get(index4+3); + + display.modelParams0[0] = r * cr; + display.modelParams0[1] = g * cg; + display.modelParams0[2] = b * cb; + + display.modelParams5[1] = opacity * ca; + + gl.glProgramEnvParameter4fvARB(gl.GL_FRAGMENT_PROGRAM_ARB, 0, display.modelParams0, 0); + gl.glProgramEnvParameter4fvARB(gl.GL_FRAGMENT_PROGRAM_ARB, 5, display.modelParams5, 0); + + RandomNode.globalseed = (int)geo.sizeBuf.get(index3+2); // i; + RandomNode.globalseed2 = RandomNode.globalseed; + +// gl.glColor4f(cr,cg,cb,ca); + // gl.glScalef(1024/16,1024/16,1024/16); + shape.Draw/*Node*/(display,null,selected,false); // blocked + // gl.glScalef(16.0f/1024,16.0f/1024,16.0f/1024); + //gl.glTranslatef(-tx,-ty,-tz); + gl.glPopMatrix(); + + gl.glMatrixMode(gl.GL_TEXTURE); + gl.glPopMatrix(); + } + // gl.glScalef(1024,1024,1024); + if (!cf) + gl.glDisable(gl.GL_CULL_FACE); + + display.modelParams0[0] = r; + display.modelParams0[1] = g; + display.modelParams0[2] = b; + + display.modelParams5[1] = opacity; + + gl.glProgramEnvParameter4fvARB(gl.GL_FRAGMENT_PROGRAM_ARB, 0, display.modelParams0, 0); + gl.glProgramEnvParameter4fvARB(gl.GL_FRAGMENT_PROGRAM_ARB, 5, display.modelParams5, 0); + + gl.glMatrixMode(gl.GL_MODELVIEW); + +// System.err.println("total = " + v/3 + "; displayed = " + count); + if (true) + return; + +//// if (!tris.predraw(this)) +//// { +//// return; +//// } +//// if (Debug.stats) +//// { +//// StatCollector.addStat(StatType.STAT_TRIANGLE_COUNT, tris.getTriangleCount()); +//// StatCollector.addStat(StatType.STAT_VERTEX_COUNT, tris.getVertexCount()); +//// StatCollector.addStat(StatType.STAT_GEOM_COUNT, 1); +//// } +//// +//// if (tris.getDisplayListID() != -1) +//// { +//// renderDisplayList(tris); +//// return; +//// } +//// +//// if (!generatingDisplayList) +//// { +//// applyStates(tris.states, tris); +//// } +//// if (Debug.stats) +//// { +//// StatCollector.startStat(StatType.STAT_RENDER_TIMER); +//// } +//// boolean transformed = doTransforms(tris); +// +// int glMode = GL.GL_TRIANGLES; +// switch (getMode()) +// { +// case Triangles: +// glMode = GL.GL_TRIANGLES; +// break; +// case Strip: +// glMode = GL.GL_TRIANGLE_STRIP; +// break; +// case Fan: +// glMode = GL.GL_TRIANGLE_FAN; +// break; +// } +// +// if (!predrawGeometry(gl)) +// { +// // make sure only the necessary indices are sent through on old +// // cards. +// IntBuffer indices = this.getIndexBuffer(); +// if (indices == null) +// { +// logger.severe("missing indices on geometry object: " + this.toString()); +// } else +// { +// indices.rewind(); +// indices.limit(this.getMaxIndex()); +// +// gl.glDrawElements(glMode, indices.limit(), GL.GL_UNSIGNED_INT, indices); // TODO Check <count> and assumed <type> of GL_UNSIGNED_INT +// +// indices.clear(); +// } +// } else +// { +// gl.glDrawElements(glMode, this.getIndexBuffer().limit(), +// GL.GL_UNSIGNED_INT, 0); +// } +// +//// postdrawGeometry(tris); +//// if (transformed) +//// { +//// undoTransforms(tris); +//// } +//// +//// if (Debug.stats) +//// { +//// StatCollector.endStat(StatType.STAT_RENDER_TIMER); +//// } +//// tris.postdraw(this); + } + + static Camera localcamera = new Camera(); + static cVector from = new cVector(); + static cVector to = new cVector(); + + public void PrepOcclusion(BoundaryRep br, double[][] transform) + { + CameraPane cp = this; + + Camera keep = cp.RenderCamera(); + cp.renderCamera = localcamera; + + if (br.trimmed) + { + float[] colors = new float[br.positions.length / 3]; + + int i3 = 0; + for (int i = 0; i < br.positions.length / 3; i++, i3 += 3) + { + if (br.normals[i3] == 0 && br.normals[i3+1] == 0 && br.normals[i3+2] == 0) + continue; + + from.set(br.positions[i3], br.positions[i3 + 1], br.positions[i3 + 2]); + to.set(br.positions[i3] + br.normals[i3], + br.positions[i3 + 1] + br.normals[i3 + 1], + br.positions[i3 + 2] + br.normals[i3 + 2]); + LA.xformPos(from, transform, from); + LA.xformPos(to, transform, to); // RIGID ONLY + localcamera.setAim(from, to); + + CameraPane.occlusionbuffer.display(); + + if (CameraPane.DEBUG_OCCLUSION) + cp.display(); // debug + + colors[i] = cp.vertexOcclusion.r; + //colors[i3 + 1] = cp.vertexOcclusion.g; + //colors[i3 + 2] = cp.vertexOcclusion.b; + + if ((i % 100) == 0 && i != 0) + { + Globals.theRenderer.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + //System.out.println("Color = " + cp.vertexOcclusion.r + ", " + cp.vertexOcclusion.g + ", " + cp.vertexOcclusion.b + "; " + (int)(100.0*i/(positions.length/3)) + "% done"); + System.out.println((int) (100.0 * i / (br.positions.length / 3)) + "% (" + i + " of " + (br.positions.length / 3) + ")"); + } + } + + br.colors = colors; + } + else + { + for (int i = 0; i < br.VertexCount(); i++) + { + Vertex v = br.GetVertex(i); + + if (v.norm == null || v.norm.x == 0 && v.norm.y == 0 && v.norm.z == 0) + continue; + + from.set(v.x, v.y, v.z); + to.set(v.x+v.norm.x, v.y+v.norm.y, v.z+v.norm.z); + LA.xformPos(from, transform, from); + LA.xformPos(to, transform, to); // RIGID ONLY + localcamera.setAim(from, to); + + CameraPane.occlusionbuffer.display(); + + if (CameraPane.DEBUG_OCCLUSION) + cp.display(); // debug + + v.AO = cp.vertexOcclusion.r; + + if ((i % 100) == 0 && i != 0) + { + Globals.theRenderer.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + //System.out.println("Color = " + cp.vertexOcclusion.r + ", " + cp.vertexOcclusion.g + ", " + cp.vertexOcclusion.b + "; " + (int)(100.0*i/(positions.length/3)) + "% done"); + System.out.println((int) (100.0 * i / br.VertexCount()) + "% (" + i + " of " + br.VertexCount() + ")"); + } + } + } + + //System.out.println("done."); + + cp.renderCamera = keep; + } + + void DrawPointFLow(PointFlow pointFlow, Object3D /*Composite*/ root, boolean selected, boolean blocked) + { + CameraPane display = this; + pointFlow.CreateHT(); + + float r = display.modelParams0[0]; + float g = display.modelParams0[1]; + float b = display.modelParams0[2]; + float opacity = display.modelParams5[1]; + + //final GL gl = GLU.getCurrentGL(); + GL gl = display.GetGL(); // getGL(); + + int s = pointFlow.points.size(); + + boolean cf = gl.glIsEnabled(gl.GL_CULL_FACE); + gl.glEnable(gl.GL_CULL_FACE); + + for (int i=s; --i>=0;) + //for (int i=0; i<s; i++) + { + cVector v = pointFlow.points.get(i); + + double mindist = Double.MAX_VALUE; + + double size = pointFlow.minimumSize; + + double distancenext = 0; + + if (i > 0) + { + cVector w = pointFlow.points.get(i-1); + + double dist = w.distance(v); + + distancenext = dist; + + if (mindist > dist) + { + mindist = dist; + size = mindist*pointFlow.resizefactor; + } + } + + if (i < s-1) + { + cVector w = pointFlow.points.get(i+1); + + double dist = w.distance(v); + + if (mindist > dist) + { + mindist = dist; + size = mindist*pointFlow.resizefactor; + } + } + + if (size < pointFlow.minimumSize) + size = pointFlow.minimumSize; + if (size > pointFlow.maximumSize) + size = pointFlow.maximumSize; + + double tx = v.x; + double ty = v.y; + double tz = v.z; + + // if (tx == 0 && ty == 0 && tz == 0) + // continue; + + gl.glMatrixMode(gl.GL_TEXTURE); + gl.glPushMatrix(); + pointFlow.texmat[12] = pointFlow.texmat[13] = pointFlow.texmat[14] = i; + + gl.glMultMatrixf(pointFlow.texmat, 0); + + gl.glMatrixMode(gl.GL_MODELVIEW); + gl.glPushMatrix(); + + gl.glTranslated(tx,ty,tz); + + gl.glScaled(size,size,size); + +// float cr = colorBuf.get(index4); +// float cg = colorBuf.get(index4+1); +// float cb = colorBuf.get(index4+2); +// float ca = colorBuf.get(index4+3); +// +// display.modelParams0[0] = r * cr; +// display.modelParams0[1] = g * cg; +// display.modelParams0[2] = b * cb; +// +// display.modelParams5[1] = opacity * ca; +// +// gl.glProgramEnvParameter4fvARB(gl.GL_FRAGMENT_PROGRAM_ARB, 0, display.modelParams0, 0); +// gl.glProgramEnvParameter4fvARB(gl.GL_FRAGMENT_PROGRAM_ARB, 5, display.modelParams5, 0); +// +// RandomNode.globalseed = (int)sizeBuf.get(index3+2); // i; +// RandomNode.globalseed2 = RandomNode.globalseed; +// +//// gl.glColor4f(cr,cg,cb,ca); +// // gl.glScalef(1024/16,1024/16,1024/16); + pointFlow.geo.Draw/*Node*/(display,null,selected, blocked); + + gl.glPopMatrix(); + + double step = size/4; // + + if (i == 0 || size == 0 || distancenext > 8*size || distancenext < step) + continue; + + int nbsteps = (int)(distancenext/step); + + step = distancenext/nbsteps; + + cVector next = pointFlow.points.get(i-1); + + tmp.set(next); + tmp.sub(v); + tmp.normalize(); + tmp.mul(step); + + // calculate next size + mindist = Double.MAX_VALUE; + + double nextsize = pointFlow.minimumSize; + + if (i > 1) + { + cVector w = pointFlow.points.get(i-2); + + double dist = w.distance(next); + + if (mindist > dist) + { + mindist = dist; + nextsize = mindist*pointFlow.resizefactor; + } + } + + double dist = v.distance(next); + + if (mindist > dist) + { + mindist = dist; + nextsize = mindist*pointFlow.resizefactor; + } + + if (nextsize < pointFlow.minimumSize) + nextsize = pointFlow.minimumSize; + if (nextsize > pointFlow.maximumSize) + nextsize = pointFlow.maximumSize; + // + + double count = 0; + + while (distancenext > 0.000000001) // step + { + gl.glPushMatrix(); + + gl.glTranslated(tx + tmp.x*count, ty + tmp.y*count, tz + tmp.z*count); + + double K = count/nbsteps; + + double intersize = K*nextsize + (1-K)*size; + + gl.glScaled(intersize,intersize,intersize); + + pointFlow.geo.Draw/*Node*/(display,null,selected,blocked); + + count++; + + distancenext -= step; + + gl.glPopMatrix(); + } + + if (count != nbsteps) + assert(count == nbsteps); + + // gl.glScalef(16.0f/1024,16.0f/1024,16.0f/1024); + //gl.glTranslatef(-tx,-ty,-tz); + + gl.glMatrixMode(gl.GL_TEXTURE); + gl.glPopMatrix(); + } + + if (!cf) + gl.glDisable(gl.GL_CULL_FACE); + +// display.modelParams0[0] = r; +// display.modelParams0[1] = g; +// display.modelParams0[2] = b; +// +// display.modelParams5[1] = opacity; +// +// gl.glProgramEnvParameter4fvARB(gl.GL_FRAGMENT_PROGRAM_ARB, 0, display.modelParams0, 0); +// gl.glProgramEnvParameter4fvARB(gl.GL_FRAGMENT_PROGRAM_ARB, 5, display.modelParams5, 0); + + gl.glMatrixMode(gl.GL_MODELVIEW); + } + /// INTERFACE void SetColor(Object3D obj, Vertex p0) @@ -1129,7 +1622,7 @@ static int camerachangeframe; - boolean SetCamera(Camera cam) + public boolean SetCamera(Camera cam) { // may 2014 if (cam == cameras[0] || cam == cameras[1]) // return false; @@ -1257,12 +1750,27 @@ mainDL ^= true; } - void ToggleTexture() + void ToggleFullScreen() + { + FULLSCREEN ^= true; + } + + void ToggleCrowd() + { + Globals.CROWD ^= true; + } + + void ToggleLocal() + { + LOCALTRANSFORM ^= true; + } + + public void ToggleTexture() { textureon ^= true; } - void ToggleLive() + public void ToggleLive() { Globals.setLIVE(Globals.isLIVE() ^ true); @@ -1274,92 +1782,67 @@ repaint(); // start loop // may 2013 } - void ToggleSupport() + public void ToggleSupport() { SUPPORT ^= true; } - void ToggleAbort() + public void ToggleAbort() { ABORTMODE ^= true; } - void ToggleFullScreen() - { - FULLSCREEN ^= true; - } - - void ToggleCrowd() - { - Globals.CROWD ^= true; - } - - void ToggleInertia() + public void ToggleInertia() { INERTIA ^= true; } - void ToggleLocal() - { - LOCALTRANSFORM ^= true; - } - - void ToggleFast() + public void ToggleFast() { FAST ^= true; } - void ToggleSlowPose() + public void ToggleSlowPose() { SLOWPOSE ^= true; } - void ToggleFootContact() - { - FOOTCONTACT ^= true; - } - - void ToggleBoxMode() + public void ToggleBoxMode() { BOXMODE ^= true; } - void ToggleSmoothFocus() + public void ToggleSmoothFocus() { SMOOTHFOCUS ^= true; } - void ToggleImageFlip() + public void ToggleImageFlip() { IMAGEFLIP ^= true; } - void ToggleSpeakerMocap() + public void ToggleSpeakerMocap() { SPEAKERMOCAP ^= true; } - void ToggleSpeakerCamera() + public void ToggleSpeakerCamera() { SPEAKERCAMERA ^= true; } - void ToggleSpeakerFocus() + public void ToggleSpeakerFocus() { SPEAKERFOCUS ^= true; } - void ToggleDebug() - { - DEBUG ^= true; - } - - void ToggleFrustum() + public void ToggleFrustum() { FRUSTUM ^= true; } - void ToggleTrack() + public void ToggleTrack() { TRACK ^= true; if (TRACK) @@ -1378,25 +1861,35 @@ repaint(); } - void ToggleTrackOnce() + public void ToggleTrackOnce() { TRACKONCE ^= true; } - void ToggleShadowTrack() + public void ToggleShadowTrack() { SHADOWTRACK ^= true; repaint(); } - void ToggleOeil() + public void ToggleOeil() { OEIL ^= true; } - void ToggleOeilOnce() + public void ToggleOeilOnce() { OEILONCE ^= true; + } + + void ToggleFootContact() + { + FOOTCONTACT ^= true; + } + + void ToggleDebug() + { + DEBUG ^= true; } void ToggleLookAt() @@ -7458,7 +7951,7 @@ return texture!=null?texture.texture:null; } - com.sun.opengl.util.texture.TextureData GetTextureData(String tex, boolean bump, int resolution) + public com.sun.opengl.util.texture.TextureData GetTextureData(String tex, boolean bump, int resolution) { CacheTexture texture = GetCacheTexture(tex, bump, resolution); @@ -10146,7 +10639,7 @@ fragmentMode |= (lightslot - 64) << 2; // 1; // first bit is available for aniso //System.out.println("fragmentMode = " + fragmentMode); - if (DrawMode() == DEFAULT || DrawMode() == SELECTION || DEBUG_SELECTION) + if (DrawMode() == DEFAULT || DrawMode() == SELECTION || IsDebugSelection()) { /* if (CULLFACE || (ambientOcclusion && OCCLUSION_CULLING)) @@ -10447,7 +10940,7 @@ callist = gl.glGenLists(1); } - boolean selectmode = DrawMode() == SELECTION || CameraPane.DEBUG_SELECTION; + boolean selectmode = DrawMode() == SELECTION || IsDebugSelection(); boolean active = !selectmode; // DrawMode() != SELECTION; // mouseDown; @@ -12922,6 +13415,11 @@ cVector tmp2 = new cVector(); boolean isMoving; + public cVector TargetLookAt() + { + return targetLookAt; + } + class PingThread extends Thread { boolean jump; @@ -13653,7 +14151,7 @@ SetMouseMode(modifiers); } - theRenderer.keyPressed(key); + Globals.theRenderer.keyPressed(key); } int kompactbit = 4; // power bit @@ -13665,7 +14163,7 @@ float SATPOW = 1; // 2; // 0.5f; float BRIPOW = 1; // 0.5f; // 0.5f; - void keyPressed(int key) + public void keyPressed(int key) { if (key >= '0' && key <= '5') clampbit = (key-'0'); @@ -14102,6 +14600,7 @@ } //System.out.println("shaper_fovy = " + manipCamera.shaper_fovy); } + static double OCCLUSIONBOOST = 1; // 0.5; void keyReleased(int key, int modifiers) @@ -14113,7 +14612,7 @@ } } - protected void processKeyEvent(KeyEvent e) + public void processKeyEvent(KeyEvent e) { switch (e.getID()) { @@ -15772,7 +16271,6 @@ class AntialiasBuffer implements GLEventListener { - CameraPane parent = null; AntialiasBuffer(CameraPane p) @@ -16165,7 +16663,7 @@ } } - static void DrawPoints(CameraPane cpane) + static void DrawPoints(iCameraPane cpane) { for (int i=0; i<8; i++) // first and last are red { -- Gitblit v1.6.2