From 6c2c00ee7f33ec46f79eba11c349f766cb207ec0 Mon Sep 17 00:00:00 2001 From: Normand Briere <nbriere@noware.ca> Date: Mon, 29 Apr 2019 10:39:23 -0400 Subject: [PATCH] Material pane --- CameraPane.java | 503 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 437 insertions(+), 66 deletions(-) diff --git a/CameraPane.java b/CameraPane.java index fc57173..296ba69 100644 --- a/CameraPane.java +++ b/CameraPane.java @@ -86,12 +86,14 @@ static boolean FULLSCREEN = false; static boolean SUPPORT = true; static boolean INERTIA = true; -static boolean FAST = false; +static boolean FAST = true; // false; static boolean SLOWPOSE = false; static boolean FOOTCONTACT = true; static int tickcount = 0; // slow pose issue +static boolean BUTTONLESSWHEEL = false; +static boolean ZOOMBOXMODE = false; static boolean BOXMODE = false; static boolean IMAGEFLIP = false; static boolean SMOOTHFOCUS = false; @@ -150,12 +152,10 @@ defaultcaps.setAccumAlphaBits(16); } - static CameraPane theRenderer; - void SetAsGLRenderer(boolean b) { isRenderer = b; - theRenderer = this; + Globals.theRenderer = this; } CameraPane(Object3D o, Camera cam, boolean withcontext) @@ -193,9 +193,43 @@ /// INTERFACE + public javax.media.opengl.GL GetGL0() + { + return null; + } + + public int GenList() + { + javax.media.opengl.GL gl = GetGL(); + return gl.glGenLists(1); + } + + public void NewList(int id) + { + javax.media.opengl.GL gl = GetGL(); + gl.glNewList(id, gl.GL_COMPILE); //_AND_EXECUTE); + } + + public void CallList(int id) + { + javax.media.opengl.GL gl = GetGL(); + gl.glCallList(id); + } + + public void EndList() + { + javax.media.opengl.GL gl = GetGL(); + gl.glEndList(); + } + public boolean IsBoxMode() { return BOXMODE; + } + + public boolean IsZoomBoxMode() + { + return ZOOMBOXMODE; } public void ClearDepth() @@ -816,7 +850,7 @@ if ((i % 100) == 0 && i != 0) { - CameraPane.theRenderer.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + 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) + ")"); } @@ -848,7 +882,7 @@ if ((i % 100) == 0 && i != 0) { - CameraPane.theRenderer.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR)); + 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() + ")"); } @@ -1061,7 +1095,336 @@ gl.glMatrixMode(gl.GL_MODELVIEW); } + public void DrawBox(cVector min, cVector max) + { + javax.media.opengl.GL gl = GetGL(); + gl.glBegin(gl.GL_LINES); + + gl.glVertex3d(min.x, min.y, min.z); + gl.glVertex3d(min.x, min.y, max.z); + gl.glVertex3d(min.x, min.y, min.z); + gl.glVertex3d(min.x, max.y, min.z); + gl.glVertex3d(min.x, min.y, min.z); + gl.glVertex3d(max.x, min.y, min.z); + + gl.glVertex3d(max.x, max.y, max.z); + gl.glVertex3d(min.x, max.y, max.z); + gl.glVertex3d(max.x, max.y, max.z); + gl.glVertex3d(max.x, min.y, max.z); + gl.glVertex3d(max.x, max.y, max.z); + gl.glVertex3d(max.x, max.y, min.z); + + gl.glEnd(); + } + + public void DrawGeometry(BoundaryRep bRep, boolean flipV, boolean selectmode) + { + int[] strips = bRep.getRawIndices(); + + javax.media.opengl.GL gl = GetGL(); + + // TRIANGLE STRIP ARRAY + if (bRep.trimmed) + { + float[] v = bRep.getRawVertices(); + float[] n = bRep.getRawNormals(); + float[] c = bRep.getRawColors(); + float[] uv = bRep.getRawUVMap(); + + int count2 = 0; + int count3 = 0; + + if (n.length > 0) + { + for (int i = 0; i < strips.length; i++) + { + gl.glBegin(gl.GL_TRIANGLE_STRIP); + + /* + boolean locked = false; + float eps = 0.1f; + boolean wrap = CameraPane.UVWRAP; // true; // UV WRAP TEXTURE ISSUE: true = artifacts, false = nice + + int dot = 0; + + if ((dot&1) == 0) + dot |= (Math.abs(qv.s - pv.s) < eps && Math.abs(qv.t - pv.t) < eps) ? 3 : 1; + + if (wrap || (dot&2) != 0) // Math.abs(qv.s - pv.s) < eps && Math.abs(qv.t - pv.t) < eps) + gl.glTexCoord2f((float) qv.s, (float) qv.t); + else + { + locked = true; + gl.glTexCoord2f((float) pv.s, (float) pv.t); + } + //System.out.println("vertexq = " + qv.x + ", " + qv.y + ", " + qv.z); + gl.glVertex3f((float) qv.x, (float) qv.y, (float) qv.z); + if (hasnorm) + { + //System.out.println("normalr = " + rv.norm.x + ", " + rv.norm.y + ", " + rv.norm.z); + gl.glNormal3f((float) rv.norm.x, (float) rv.norm.y, (float) rv.norm.z); + } + + if ((dot&4) == 0) + dot |= (Math.abs(rv.s - pv.s) < eps && Math.abs(rv.t - pv.t) < eps) ? 12 : 4; + + if (wrap || !locked && (dot&8) != 0) + gl.glTexCoord2f((float) rv.s, (float) rv.t); + else + gl.glTexCoord2f((float) pv.s, (float) pv.t); + + f.dot = dot; + */ + + if (!selectmode) + { + if (n[count3] != 0 || n[count3 + 1] != 0 || n[count3 + 2] != 0) + { + gl.glNormal3f(n[count3], n[count3 + 1], n[count3 + 2]); + } else + { + gl.glNormal3f(0, 0, 1); + } + + if (c != null) + //System.out.println("glcolor = " + c[count3] + ", " + c[count3+1] + ", " + c[count3+2]); + { + gl.glColor4f(c[count3/3], c[count3/3 /* + 1*/], c[count3/3 /* + 2*/], 1); + } + } + if (flipV) + gl.glTexCoord2f(uv[count2], 1-uv[count2 + 1]); + else + gl.glTexCoord2f(uv[count2], uv[count2 + 1]); + //System.out.println("vertex1 = " + v[count3] + ", " + v[count3+1] + ", " + v[count3+2]); + gl.glVertex3f(v[count3], v[count3 + 1], v[count3 + 2]); + + count2 += 2; + count3 += 3; + if (!selectmode) + { + if (n[count3] != 0 || n[count3 + 1] != 0 || n[count3 + 2] != 0) + { + gl.glNormal3f(n[count3], n[count3 + 1], n[count3 + 2]); + } else + { + gl.glNormal3f(0, 0, 1); + } + if (c != null) + { + gl.glColor4f(c[count3/3], c[count3/3 /* + 1*/], c[count3/3 /* + 2*/], 1); + } + } + if (flipV) + gl.glTexCoord2f(uv[count2], 1-uv[count2 + 1]); + else + gl.glTexCoord2f(uv[count2], uv[count2 + 1]); + //System.out.println("vertex2 = " + v[count3] + ", " + v[count3+1] + ", " + v[count3+2]); + gl.glVertex3f(v[count3], v[count3 + 1], v[count3 + 2]); + + count2 += 2; + count3 += 3; + for (int j = 0; j < strips[i] - 2; j++) + { + //gl.glTexCoord2d(...); + if (!selectmode) + { + if (n[count3] != 0 || n[count3 + 1] != 0 || n[count3 + 2] != 0) + { + gl.glNormal3f(n[count3], n[count3 + 1], n[count3 + 2]); + } else + { + gl.glNormal3f(0, 0, 1); + } + if (c != null) + { + gl.glColor4f(c[count3/3], c[count3/3 /* + 1*/], c[count3/3 /* + 2*/], 1); + } + } + + if (flipV) + gl.glTexCoord2f(uv[count2], 1-uv[count2 + 1]); + else + gl.glTexCoord2f(uv[count2], uv[count2 + 1]); + //System.out.println("coord3 = " + uv[count2] + ", " + uv[count2+1]); + gl.glVertex3f(v[count3], v[count3 + 1], v[count3 + 2]); + count2 += 2; + count3 += 3; + } + + gl.glEnd(); + } + } + + assert count3 == v.length; + } + else // !trimmed + { + int count = 0; + for (int i = 0; i < strips.length; i++) + { + gl.glBegin(gl.GL_TRIANGLE_STRIP); + + Vertex p = bRep.GetVertex(bRep.indices[count++]); + Vertex q = bRep.GetVertex(bRep.indices[count++]); + + drawVertex(gl, p, flipV, selectmode); + drawVertex(gl, q, flipV, selectmode); + + for (int j = 0; j < strips[i] - 2; j++) + { + Vertex r = bRep.GetVertex(bRep.indices[count++]); + + // if (j%2 == 0) + // drawFace(p, q, r, display, null); + // else + // drawFace(p, r, q, display, null); + + // p = q; + // q = r; + drawVertex(gl, r, flipV, selectmode); + } + + gl.glEnd(); + } + } + } + + static cSpring.Point3D temp = new cSpring.Point3D(); + static cSpring.Point3D temp2 = new cSpring.Point3D(); + static cSpring.Point3D temp3 = new cSpring.Point3D(); + + public void DrawDynamicMesh(cMesh mesh) + { + GL gl = GetGL(); // getGL(); + + cSpring.PhysicsController3D Phys = mesh.Phys; + + gl.glDisable(gl.GL_LIGHTING); + + gl.glLineWidth(1); + gl.glColor3f(1,1,1); + gl.glBegin(gl.GL_LINES); + double scale = 0; + int count = 0; + for (int s=0; s<Phys.allSprings.size(); s++) + { + cSpring.Spring spring = Phys.allSprings.get(s); + if(s == 0) + { + //System.out.println(" spring : " + spring.a.position + "; " + spring.b.position); + } + if (mesh.showsprings) + { + temp.set(spring.a.position); + temp.add(spring.b.position); + temp.mul(0.5); + temp2.set(spring.a.position); + temp2.sub(spring.b.position); + temp2.mul(spring.restLength/2); + temp.sub(temp2); + gl.glVertex3f((float)temp.x, (float)temp.y, (float)temp.z); + temp.add(temp2); + temp.add(temp2); + gl.glVertex3f((float)temp.x, (float)temp.y, (float)temp.z); + } + + if (spring.isHandle) + continue; + + //if (scale < spring.restLength) + scale += spring.restLength; + count++; + } + gl.glEnd(); + + if (count == 0) + scale = 0.01; + else + scale /= count * 3; + + //scale = 0.25; + + if (mesh.ShowInfo()) + { + gl.glLineWidth(4); + for (int s=0; s<Phys.allNodes.size(); s++) + { + cSpring.DynamicNode node = Phys.allNodes.get(s); + if (node.mass == 0) + continue; + + int i = node.springs==null?-1:node.springs.size(); + gl.glColor3f((i>>2)&1,(i>>1)&1,i&1); + //temp.set(node.springForce.x, node.springForce.y, node.springForce.z); + //temp.normalize(); + //gl.glColor3d((temp.x+1)/2, (temp.y+1)/2, (temp.z+1)/2); + gl.glBegin(gl.GL_LINES); + gl.glVertex3d(node.position.x, node.position.y, node.position.z); + //gl.glVertex3d(node.position.x + node.normal.x*scale, node.position.y + node.normal.y*scale, node.position.z + node.normal.z*scale); + gl.glVertex3d(node.position.x + mesh.bRep.GetVertex(s).norm.x*scale, + node.position.y + mesh.bRep.GetVertex(s).norm.y*scale, + node.position.z + mesh.bRep.GetVertex(s).norm.z*scale); + gl.glEnd(); + } + + gl.glLineWidth(8); + for (int s=0; s<Phys.allNodes.size(); s++) + { + cSpring.DynamicNode node = Phys.allNodes.get(s); + + if (node.springs != null) + { + for (int i=0; i<node.springs.size(); i+=1) + { + cSpring.DynamicNode f = node.springs.get(i).GetOther(node); + + int c = i+1; + // c = node.springs.get(i).nbcopies; + + gl.glColor3f((c>>2)&1,(c>>1)&1,c&1); + gl.glBegin(gl.GL_LINES); + gl.glVertex3d(node.position.x, node.position.y, node.position.z); + gl.glVertex3d(f.position.x/3+node.position.x*2/3, f.position.y/3+node.position.y*2/3, f.position.z/3+node.position.z*2/3); + gl.glEnd(); + } + } + } + + gl.glLineWidth(1); + } + + gl.glEnable(gl.GL_LIGHTING); + } + /// INTERFACE + + public void StartTriangles() + { + javax.media.opengl.GL gl = GetGL(); + gl.glBegin(gl.GL_TRIANGLES); + } + + public void EndTriangles() + { + GetGL().glEnd(); + } + + void drawVertex(javax.media.opengl.GL gl, Vertex pv, boolean flipV, boolean selectmode) + { + if (!selectmode) + { + gl.glNormal3f((float) pv.norm.x, (float) pv.norm.y, (float) pv.norm.z); + gl.glColor4f(pv.AO, pv.AO, pv.AO, 1); + + if (flipV) + gl.glTexCoord2f((float) pv.s, 1-(float) pv.t); + else + gl.glTexCoord2f((float) pv.s, (float) pv.t); + } + + gl.glVertex3f((float) pv.x, (float) pv.y, (float) pv.z); + } void SetColor(Object3D obj, Vertex p0) { @@ -1256,12 +1619,12 @@ //col.getColorComponents(ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB), CameraPane.modelParams0); if (!material.multiply) { - display.color = color; + display.color = material.color; display.saturation = material.modulation; } else { - display.color *= color*2; + display.color *= material.color*2; display.saturation *= material.modulation*2; } @@ -1624,7 +1987,7 @@ static int camerachangeframe; - boolean SetCamera(Camera cam) + public boolean SetCamera(Camera cam) { // may 2014 if (cam == cameras[0] || cam == cameras[1]) // return false; @@ -1752,12 +2115,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); @@ -1769,92 +2147,72 @@ 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 ToggleZoomBoxMode() + { + ZOOMBOXMODE ^= true; + } + + 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) @@ -1873,25 +2231,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() @@ -7953,7 +8321,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); @@ -12379,7 +12747,7 @@ "MUL final.y, fragment.texcoord[0].x, c256;" + "FLR final.x, final.y;" + "SUB final.y, final.y, final.x;" + - "MUL final.x, final.x, c256i;" + + //"MUL final.x, final.x, c256i;" + "MOV final.z, zero.x;" + "MOV final.a, one.w;":"" ) + @@ -12387,7 +12755,7 @@ "MUL final.y, fragment.texcoord[0].y, c256;" + "FLR final.x, final.y;" + "SUB final.y, final.y, final.x;" + - "MUL final.x, final.x, c256i;" + + //"MUL final.x, final.x, c256i;" + "MOV final.z, zero.x;" + "MOV final.a, one.w;":"" ) + @@ -13167,6 +13535,7 @@ //System.err.println("Dtime = " + Dtime + "; units = " + e.getUnitsToScroll() + "; ratio (units/ms) = " + ratio); + if (BUTTONLESSWHEEL) if (Math.abs(ratio) < 0.1 || Math.abs(Dtime) == 0) // < 30) { return; @@ -13175,7 +13544,7 @@ boolean capsLocked = Toolkit.getDefaultToolkit().getLockingKeyState(KeyEvent.VK_CAPS_LOCK); // TIMER - if (!wheeltimer.isRunning() && e.getModifiersEx() == 0 && !capsLocked) // VR + if (ZOOMBOXMODE && !wheeltimer.isRunning() && e.getModifiersEx() == 0 && !capsLocked) // VR { keepboxmode = BOXMODE; keepsupport = SUPPORT; @@ -13392,11 +13761,11 @@ public void mouseDragged(MouseEvent e) { + //System.out.println("mouseDragged: " + e); if (isRenderer) movingcamera = true; //if (drawing) //return; - //System.out.println("mouseDragged: " + e); if ((e.getModifiersEx() & CTRL) != 0 || (e.getModifiersEx() & COMMAND) != 0) // || IsFrozen()) { @@ -13931,7 +14300,6 @@ public void mouseMoved(MouseEvent e) { //System.out.println("mouseMoved: " + e); - if (isRenderer) return; @@ -14153,7 +14521,7 @@ SetMouseMode(modifiers); } - theRenderer.keyPressed(key); + Globals.theRenderer.keyPressed(key); } int kompactbit = 4; // power bit @@ -14165,7 +14533,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'); @@ -14602,6 +14970,7 @@ } //System.out.println("shaper_fovy = " + manipCamera.shaper_fovy); } + static double OCCLUSIONBOOST = 1; // 0.5; void keyReleased(int key, int modifiers) @@ -14613,7 +14982,7 @@ } } - protected void processKeyEvent(KeyEvent e) + public void processKeyEvent(KeyEvent e) { switch (e.getID()) { @@ -14743,8 +15112,9 @@ protected void processMouseMotionEvent(MouseEvent e) { - //System.out.println("processMouseMotionEvent: " + mouseMode); - if (e.getButton() == MouseEvent.NOBUTTON && (mouseMode & SELECT) == 0) + //System.out.println("processMouseMotionEvent: " + mouseMode + " " + e.getModifiers() + " " + e.getModifiersEx() + " " + e.getButton()); + //if (e.getButton() == MouseEvent.NOBUTTON && (mouseMode & SELECT) == 0) + if ((e.getModifiers() & MouseEvent.BUTTON1_MASK) == 0 && (mouseMode & SELECT) == 0) { mouseMoved(e); } else @@ -16696,10 +17066,11 @@ static IntBuffer textbuffer = null; // IntBuffer.allocate(TEXT_WIDTH*8*8 * TEXT_HEIGHT); // Depth buffer format //private int depth_format; - static public void NextIndex(Object3D o, GL gl) + + public void NextIndex() { indexcount+=16; - gl.glColor3d(((indexcount >>> 16) & 255) / 255.0, ((indexcount >>> 8) & 255) / 255.0, ((indexcount) & 255) / 255.0); + GetGL().glColor3d(((indexcount >>> 16) & 255) / 255.0, ((indexcount >>> 8) & 255) / 255.0, ((indexcount) & 255) / 255.0); //objects[indexcount] = o; //System.out.println("indexcount = " + indexcount); } -- Gitblit v1.6.2