diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/Transform.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/Transform.java index 9c345134..26fadf0d 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/Transform.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/jogl/Transform.java @@ -196,6 +196,9 @@ public class Transform { * @return Cloned transform */ public Object clone() { - return new Transform(xmin, xmax, ymin, ymax, zmin, zmax); + Transform transform = new Transform(xmin, xmax, ymin, ymax, zmin, zmax); + transform.aspectType = this.aspectType; + + return transform; } } diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/render/jogl/MeshRender.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/render/jogl/MeshRender.java index cceb6392..998a3b56 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/render/jogl/MeshRender.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/render/jogl/MeshRender.java @@ -62,23 +62,29 @@ public class MeshRender extends JOGLGraphicRender { @Override public void setTransform(Transform transform) { - super.setTransform(transform); + boolean updateBuffer = true; + if (this.transform != null && this.transform.equals(transform)) + updateBuffer = false; - vertexPosition = meshGraphic.getVertexData(this.transform); - FloatBuffer vertexBuffer = GLBuffers.newDirectFloatBuffer(vertexPosition); - meshGraphic.calculateNormalVectors(vertexPosition); - FloatBuffer normalBuffer = GLBuffers.newDirectFloatBuffer(meshGraphic.getVertexNormal()); - int sizePosition = vertexBuffer.capacity() * Float.BYTES; - int sizeNormal = normalBuffer.capacity() * Float.BYTES; + super.setTransform((Transform) transform.clone()); - gl.glGenBuffers(1, vbo); - gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo.get(0)); - gl.glBufferData(GL.GL_ARRAY_BUFFER, sizePosition + sizeNormal, - ByteBuffer.allocateDirect(sizePosition + sizeNormal).asFloatBuffer(), GL.GL_STATIC_DRAW); - gl.glBufferSubData(GL.GL_ARRAY_BUFFER, 0, vertexBuffer.capacity() * Float.BYTES, vertexBuffer); - gl.glBufferSubData(GL.GL_ARRAY_BUFFER, vertexBuffer.capacity() * Float.BYTES, - normalBuffer.capacity() * Float.BYTES, normalBuffer); - gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0); + if (updateBuffer) { + vertexPosition = meshGraphic.getVertexData(this.transform); + FloatBuffer vertexBuffer = GLBuffers.newDirectFloatBuffer(vertexPosition); + meshGraphic.calculateNormalVectors(vertexPosition); + FloatBuffer normalBuffer = GLBuffers.newDirectFloatBuffer(meshGraphic.getVertexNormal()); + int sizePosition = vertexBuffer.capacity() * Float.BYTES; + int sizeNormal = normalBuffer.capacity() * Float.BYTES; + + gl.glGenBuffers(1, vbo); + gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo.get(0)); + gl.glBufferData(GL.GL_ARRAY_BUFFER, sizePosition + sizeNormal, + ByteBuffer.allocateDirect(sizePosition + sizeNormal).asFloatBuffer(), GL.GL_STATIC_DRAW); + gl.glBufferSubData(GL.GL_ARRAY_BUFFER, 0, vertexBuffer.capacity() * Float.BYTES, vertexBuffer); + gl.glBufferSubData(GL.GL_ARRAY_BUFFER, vertexBuffer.capacity() * Float.BYTES, + normalBuffer.capacity() * Float.BYTES, normalBuffer); + gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0); + } } void compileShaders() throws Exception { diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/render/jogl/SurfaceRender.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/render/jogl/SurfaceRender.java index b1d2277c..60f8b57d 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/render/jogl/SurfaceRender.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/render/jogl/SurfaceRender.java @@ -77,38 +77,44 @@ public class SurfaceRender extends JOGLGraphicRender { @Override public void setTransform(Transform transform) { - super.setTransform(transform); + boolean updateBuffer = true; + if (this.transform != null && this.transform.equals(transform)) + updateBuffer = false; - float[] vertexData = surfaceGraphic.getVertexPosition(this.transform); - FloatBuffer vertexBuffer = GLBuffers.newDirectFloatBuffer(vertexData); - surfaceGraphic.calculateNormalVectors(vertexData); - FloatBuffer normalBuffer = GLBuffers.newDirectFloatBuffer(surfaceGraphic.getVertexNormal()); - sizePosition = vertexBuffer.capacity() * Float.BYTES; - sizeNormal = normalBuffer.capacity() * Float.BYTES; - int totalSize = sizePosition + sizeNormal; + super.setTransform((Transform) transform.clone()); - FloatBuffer ctBuffer; - if (surfaceGraphic.isUsingTexture()) { - ctBuffer = GLBuffers.newDirectFloatBuffer(surfaceGraphic.getVertexTexture()); - } else { - ctBuffer = GLBuffers.newDirectFloatBuffer(surfaceGraphic.getVertexColor()); + if (updateBuffer) { + float[] vertexData = surfaceGraphic.getVertexPosition(this.transform); + FloatBuffer vertexBuffer = GLBuffers.newDirectFloatBuffer(vertexData); + surfaceGraphic.calculateNormalVectors(vertexData); + FloatBuffer normalBuffer = GLBuffers.newDirectFloatBuffer(surfaceGraphic.getVertexNormal()); + sizePosition = vertexBuffer.capacity() * Float.BYTES; + sizeNormal = normalBuffer.capacity() * Float.BYTES; + int totalSize = sizePosition + sizeNormal; + + FloatBuffer ctBuffer; + if (surfaceGraphic.isUsingTexture()) { + ctBuffer = GLBuffers.newDirectFloatBuffer(surfaceGraphic.getVertexTexture()); + } else { + ctBuffer = GLBuffers.newDirectFloatBuffer(surfaceGraphic.getVertexColor()); + } + sizeColorTexture = ctBuffer.capacity() * Float.BYTES; + totalSize += sizeColorTexture; + + gl.glGenBuffers(2, vbo); + gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo.get(0)); + gl.glBufferData(GL.GL_ARRAY_BUFFER, totalSize, + ByteBuffer.allocateDirect(totalSize).asFloatBuffer(), GL.GL_STATIC_DRAW); + gl.glBufferSubData(GL.GL_ARRAY_BUFFER, 0, sizePosition, vertexBuffer); + gl.glBufferSubData(GL.GL_ARRAY_BUFFER, sizePosition, sizeNormal, normalBuffer); + gl.glBufferSubData(GL.GL_ARRAY_BUFFER, sizePosition + sizeNormal, sizeColorTexture, ctBuffer); + gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0); + + IntBuffer indexBuffer = GLBuffers.newDirectIntBuffer(surfaceGraphic.getVertexIndices()); + gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, vbo.get(1)); + gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, indexBuffer.capacity() * Integer.BYTES, indexBuffer, GL.GL_STATIC_DRAW); + gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0); } - sizeColorTexture = ctBuffer.capacity() * Float.BYTES; - totalSize += sizeColorTexture; - - gl.glGenBuffers(2, vbo); - gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo.get(0)); - gl.glBufferData(GL.GL_ARRAY_BUFFER, totalSize, - ByteBuffer.allocateDirect(totalSize).asFloatBuffer(), GL.GL_STATIC_DRAW); - gl.glBufferSubData(GL.GL_ARRAY_BUFFER, 0, sizePosition, vertexBuffer); - gl.glBufferSubData(GL.GL_ARRAY_BUFFER, sizePosition, sizeNormal, normalBuffer); - gl.glBufferSubData(GL.GL_ARRAY_BUFFER, sizePosition + sizeNormal, sizeColorTexture, ctBuffer); - gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0); - - IntBuffer indexBuffer = GLBuffers.newDirectIntBuffer(surfaceGraphic.getVertexIndices()); - gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, vbo.get(1)); - gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, indexBuffer.capacity() * Integer.BYTES, indexBuffer, GL.GL_STATIC_DRAW); - gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0); } void bindingTextures() { diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/render/jogl/VolumeRender.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/render/jogl/VolumeRender.java index 3ae5e76b..ba639323 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/render/jogl/VolumeRender.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/render/jogl/VolumeRender.java @@ -107,15 +107,21 @@ public class VolumeRender extends JOGLGraphicRender { @Override public void setTransform(Transform transform) { - super.setTransform(transform); + boolean updateBuffer = true; + if (this.transform != null && this.transform.equals(transform)) + updateBuffer = false; - float[] vertexBufferData = volume.getVertexBufferData(this.transform); + super.setTransform((Transform) transform.clone()); - gl.glGenBuffers(1, vbo); - gl.glBindBuffer(GL_ARRAY_BUFFER, vbo.get(0)); - gl.glBufferData(GL_ARRAY_BUFFER, vertexBufferData.length * Float.BYTES, - Buffers.newDirectFloatBuffer(vertexBufferData), GL_STATIC_DRAW); - gl.glBindBuffer(GL_ARRAY_BUFFER, 0); + if (updateBuffer) { + float[] vertexBufferData = volume.getVertexBufferData(this.transform); + + gl.glGenBuffers(1, vbo); + gl.glBindBuffer(GL_ARRAY_BUFFER, vbo.get(0)); + gl.glBufferData(GL_ARRAY_BUFFER, vertexBufferData.length * Float.BYTES, + Buffers.newDirectFloatBuffer(vertexBufferData), GL_STATIC_DRAW); + gl.glBindBuffer(GL_ARRAY_BUFFER, 0); + } } void bindingTextures() { diff --git a/meteoinfo-lab/milconfig.xml b/meteoinfo-lab/milconfig.xml index abc97499..5d75cad3 100644 --- a/meteoinfo-lab/milconfig.xml +++ b/meteoinfo-lab/milconfig.xml @@ -1,36 +1,34 @@ - - - - - - + - - - - + + + + + + + + + - - + - - + @@ -38,5 +36,5 @@
- +