diff --git a/jme3-android/src/main/java/com/jme3/audio/android/AndroidAudioData.java b/jme3-android/src/main/java/com/jme3/audio/android/AndroidAudioData.java index e7f4a0f98f..3bd4a3b378 100644 --- a/jme3-android/src/main/java/com/jme3/audio/android/AndroidAudioData.java +++ b/jme3-android/src/main/java/com/jme3/audio/android/AndroidAudioData.java @@ -38,8 +38,8 @@ public float getDuration() { @Override public void resetObject() { - this.id = -1; - setUpdateNeeded(); + invalidate(); + setUpdateNeeded(); } @Override @@ -57,11 +57,11 @@ public void setCurrentVolume(float currentVolume) { @Override public NativeObject createDestructableClone() { - return new AndroidAudioData(id); + return new AndroidAudioData(getId()); } @Override public long getUniqueId() { - return ((long)OBJTYPE_AUDIOBUFFER << 32) | ((long)id); + return ((long)OBJTYPE_AUDIOBUFFER << 32) | (getId()); } } diff --git a/jme3-core/src/main/java/com/jme3/audio/AudioBuffer.java b/jme3-core/src/main/java/com/jme3/audio/AudioBuffer.java index 249d9601eb..ba3e53093a 100644 --- a/jme3-core/src/main/java/com/jme3/audio/AudioBuffer.java +++ b/jme3-core/src/main/java/com/jme3/audio/AudioBuffer.java @@ -80,7 +80,7 @@ public float getDuration() { @Override public String toString() { return getClass().getSimpleName() - + "[id=" + id + ", ch=" + channels + ", bits=" + bitsPerSample + + "[id=" + getId() + ", ch=" + channels + ", bits=" + bitsPerSample + ", rate=" + sampleRate + ", duration=" + getDuration() + "]"; } @@ -109,7 +109,7 @@ public ByteBuffer getData() { @Override public void resetObject() { - id = -1; + invalidate(); setUpdateNeeded(); } @@ -127,11 +127,11 @@ public void deleteObject(Object rendererObject) { @Override public NativeObject createDestructableClone() { - return new AudioBuffer(id); + return new AudioBuffer(getId()); } @Override public long getUniqueId() { - return ((long) OBJTYPE_AUDIOBUFFER << 32) | (0xffffffffL & (long) id); + return ((long) OBJTYPE_AUDIOBUFFER << 32) | (0xffffffffL & getId()); } } diff --git a/jme3-core/src/main/java/com/jme3/audio/AudioData.java b/jme3-core/src/main/java/com/jme3/audio/AudioData.java index 6a0f1953aa..31cab90000 100644 --- a/jme3-core/src/main/java/com/jme3/audio/AudioData.java +++ b/jme3-core/src/main/java/com/jme3/audio/AudioData.java @@ -98,7 +98,7 @@ public int getSampleRate() { * @param sampleRate Sample rate, 44100, 22050, etc. */ public void setupFormat(int channels, int bitsPerSample, int sampleRate) { - if (id != -1) + if (isValid()) throw new IllegalStateException("Already set up"); this.channels = channels; diff --git a/jme3-core/src/main/java/com/jme3/audio/AudioStream.java b/jme3-core/src/main/java/com/jme3/audio/AudioStream.java index 15b40c5b43..4c7bb6c714 100644 --- a/jme3-core/src/main/java/com/jme3/audio/AudioStream.java +++ b/jme3-core/src/main/java/com/jme3/audio/AudioStream.java @@ -68,7 +68,7 @@ protected AudioStream(int[] ids) { } public void updateData(InputStream in, float duration) { - if (id != -1 || this.in != null) { + if (isValid() || this.in != null) { throw new IllegalStateException("Data already set!"); } @@ -157,8 +157,7 @@ public DataType getDataType() { @Override public void resetObject() { - id = -1; - ids = null; + invalidate(); setUpdateNeeded(); } @@ -222,6 +221,6 @@ public void setTime(float time) { @Override public long getUniqueId() { - return ((long) OBJTYPE_AUDIOSTREAM << 32) | (0xffffffffL & (long) ids[0]); + return ((long) OBJTYPE_AUDIOSTREAM << 32) | (0xffffffffL & ids[0]); } } diff --git a/jme3-core/src/main/java/com/jme3/audio/Filter.java b/jme3-core/src/main/java/com/jme3/audio/Filter.java index 83bc99e753..dbf426de3f 100644 --- a/jme3-core/src/main/java/com/jme3/audio/Filter.java +++ b/jme3-core/src/main/java/com/jme3/audio/Filter.java @@ -59,7 +59,7 @@ public void read(JmeImporter im) throws IOException { @Override public void resetObject() { - this.id = -1; + invalidate(); setUpdateNeeded(); } diff --git a/jme3-core/src/main/java/com/jme3/audio/LowPassFilter.java b/jme3-core/src/main/java/com/jme3/audio/LowPassFilter.java index daa49adb65..5f13ff21d0 100644 --- a/jme3-core/src/main/java/com/jme3/audio/LowPassFilter.java +++ b/jme3-core/src/main/java/com/jme3/audio/LowPassFilter.java @@ -94,11 +94,11 @@ public void read(JmeImporter im) throws IOException { @Override public NativeObject createDestructableClone() { - return new LowPassFilter(id); + return new LowPassFilter(getId()); } @Override public long getUniqueId() { - return ((long) OBJTYPE_FILTER << 32) | (0xffffffffL & (long) id); + return ((long) OBJTYPE_FILTER << 32) | (0xffffffffL & getId()); } } diff --git a/jme3-core/src/main/java/com/jme3/audio/openal/ALAudioRenderer.java b/jme3-core/src/main/java/com/jme3/audio/openal/ALAudioRenderer.java index 834d80eca1..fc19608758 100644 --- a/jme3-core/src/main/java/com/jme3/audio/openal/ALAudioRenderer.java +++ b/jme3-core/src/main/java/com/jme3/audio/openal/ALAudioRenderer.java @@ -292,7 +292,7 @@ public void cleanup() { private void updateFilter(Filter f) { int id = f.getId(); - if (id == -1) { + if (f.isInvalid()) { ib.position(0).limit(1); efx.alGenFilters(1, ib); id = ib.get(0); diff --git a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java index 82bcca3a4f..696ed872a4 100644 --- a/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java +++ b/jme3-core/src/main/java/com/jme3/renderer/opengl/GLRenderer.java @@ -1453,7 +1453,7 @@ public int convertShaderType(ShaderType type) { public void updateShaderSourceData(ShaderSource source) { int id = source.getId(); - if (id == -1) { + if (source.isInvalid()) { // Create id id = gl.glCreateShader(convertShaderType(source.getType())); if (id <= 0) { @@ -1588,7 +1588,7 @@ public void updateShaderSourceData(ShaderSource source) { public void updateShaderData(Shader shader) { int id = shader.getId(); boolean needRegister = false; - if (id == -1) { + if (shader.isInvalid()) { // create program id = gl.glCreateProgram(); if (id == 0) { @@ -1972,7 +1972,7 @@ public void updateFrameBuffer(FrameBuffer fb) { } int id = fb.getId(); - if (id == -1) { + if (fb.isInvalid()) { glfbo.glGenFramebuffersEXT(intBuf1); id = intBuf1.get(0); fb.setId(id); @@ -2503,7 +2503,7 @@ private void bindTextureOnly(int target, Image img, int unit) { */ public void updateTexImageData(Image img, Texture.Type type, int unit, boolean scaleToPot) { int texId = img.getId(); - if (texId == -1) { + if (img.isInvalid()) { // create texture gl.glGenTextures(intBuf1); texId = intBuf1.get(0); @@ -2774,7 +2774,7 @@ private int convertFormat(Format format) { public void updateBufferData(VertexBuffer vb) { int bufId = vb.getId(); boolean created = false; - if (bufId == -1) { + if (vb.isInvalid()) { // create buffer gl.glGenBuffers(intBuf1); bufId = intBuf1.get(0); diff --git a/jme3-core/src/main/java/com/jme3/scene/VertexBuffer.java b/jme3-core/src/main/java/com/jme3/scene/VertexBuffer.java index 8c0a388bb7..e33a3ba1b3 100644 --- a/jme3-core/src/main/java/com/jme3/scene/VertexBuffer.java +++ b/jme3-core/src/main/java/com/jme3/scene/VertexBuffer.java @@ -647,7 +647,7 @@ public int getBaseInstanceCount() { * argument. */ public void setupData(Usage usage, int components, Format format, Buffer data) { - if (id != -1) { + if (isValid()) { throw new UnsupportedOperationException("Data has already been sent. Cannot setupData again."); } @@ -690,7 +690,7 @@ public void setupData(Usage usage, int components, Format format, Buffer data) { * @param data The data buffer to set */ public void updateData(Buffer data) { - if (id != -1) { + if (isValid()) { // request to update data is okay } @@ -730,7 +730,7 @@ public void clearUpdateNeeded() { * Converts single floating-point data to {@link Format#Half half} floating-point data. */ public void convertToHalf() { - if (id != -1) { + if (isValid()) { throw new UnsupportedOperationException("Data has already been sent."); } @@ -1037,7 +1037,7 @@ public VertexBuffer clone() { // e.g. re-use ID. VertexBuffer vb = (VertexBuffer) super.clone(); vb.handleRef = new Object(); - vb.id = -1; + vb.invalidate(); if (data != null) { // Make sure to pass a read-only buffer to clone so that // the position information doesn't get clobbered by another @@ -1068,7 +1068,7 @@ public VertexBuffer clone(Type overrideType) { vb.data = BufferUtils.clone(getDataReadOnly()); vb.format = format; vb.handleRef = new Object(); - vb.id = -1; + vb.invalidate(); vb.normalized = normalized; vb.instanceSpan = instanceSpan; vb.offset = offset; @@ -1092,8 +1092,8 @@ public String toString() { @Override public void resetObject() { -// assert this.id != -1; - this.id = -1; +// assert isValid + invalidate(); setUpdateNeeded(); } @@ -1111,12 +1111,12 @@ protected void deleteNativeBuffers() { @Override public NativeObject createDestructableClone() { - return new VertexBuffer(id); + return new VertexBuffer(getId()); } @Override public long getUniqueId() { - return ((long) OBJTYPE_VERTEXBUFFER << 32) | (0xffffffffL & (long) id); + return ((long) OBJTYPE_VERTEXBUFFER << 32) | (0xffffffffL & getId()); } @Override diff --git a/jme3-core/src/main/java/com/jme3/shader/BufferObject.java b/jme3-core/src/main/java/com/jme3/shader/BufferObject.java index b893576a87..ef7750e972 100644 --- a/jme3-core/src/main/java/com/jme3/shader/BufferObject.java +++ b/jme3-core/src/main/java/com/jme3/shader/BufferObject.java @@ -248,7 +248,7 @@ public int getBinding() { @Override public void resetObject() { - this.id = -1; + invalidate(); setUpdateNeeded(); } @@ -829,6 +829,6 @@ protected void deleteNativeBuffers() { @Override public long getUniqueId() { - return ((long) OBJTYPE_BO << 32) | (0xffffffffL & (long) id); + return ((long) OBJTYPE_BO << 32) | (0xffffffffL & getId()); } } diff --git a/jme3-core/src/main/java/com/jme3/shader/Shader.java b/jme3-core/src/main/java/com/jme3/shader/Shader.java index eb2f778d39..dbac48cd9a 100644 --- a/jme3-core/src/main/java/com/jme3/shader/Shader.java +++ b/jme3-core/src/main/java/com/jme3/shader/Shader.java @@ -130,7 +130,7 @@ public ShaderSource(ShaderType type) { } protected ShaderSource(ShaderSource ss) { - super(ss.id); + super(ss.getId()); // No data needs to be copied. // (This is a destructible clone) } @@ -189,7 +189,7 @@ public String getDefines() { @Override public long getUniqueId() { - return ((long)OBJTYPE_SHADERSOURCE << 32) | (0xffffffffL & (long)id); + return ((long)OBJTYPE_SHADERSOURCE << 32) | (0xffffffffL & getId()); } @Override @@ -207,7 +207,7 @@ public String toString() { @Override public void resetObject() { - id = -1; + invalidate(); setUpdateNeeded(); } @@ -241,7 +241,7 @@ public Shader() { * @param s (not null) */ protected Shader(Shader s) { - super(s.id); + super(s.getId()); // Shader sources cannot be shared, therefore they must // be destroyed together with the parent shader. @@ -443,7 +443,7 @@ public void setUpdateNeeded(){ */ @Override public void resetObject() { - this.id = -1; + invalidate(); for (ShaderSource source : shaderSourceList){ source.resetObject(); } @@ -462,6 +462,6 @@ public NativeObject createDestructableClone(){ @Override public long getUniqueId() { - return ((long)OBJTYPE_SHADER << 32) | (0xffffffffL & (long)id); + return ((long)OBJTYPE_SHADER << 32) | (0xffffffffL & getId()); } } diff --git a/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java b/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java index 7153f8200f..3b7b4000c8 100644 --- a/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java +++ b/jme3-core/src/main/java/com/jme3/texture/FrameBuffer.java @@ -346,7 +346,7 @@ public FrameBuffer(int width, int height, int samples) { } protected FrameBuffer(FrameBuffer src) { - super(src.id); + super(src.getId()); /* for (RenderBuffer renderBuf : src.colorBufs){ RenderBuffer clone = renderBuf.createDestructableClone(); @@ -367,7 +367,7 @@ protected FrameBuffer(FrameBuffer src) { */ @Deprecated public void setDepthBuffer(Image.Format format) { - if (id != -1) { + if (isValid()) { throw new UnsupportedOperationException("FrameBuffer already initialized."); } @@ -389,7 +389,7 @@ public void setDepthBuffer(Image.Format format) { */ @Deprecated public void setColorBuffer(Image.Format format) { - if (id != -1) { + if (isValid()) { throw new UnsupportedOperationException("FrameBuffer already initialized."); } @@ -551,7 +551,7 @@ public void clearColorTargets() { */ @Deprecated public void addColorBuffer(Image.Format format) { - if (id != -1) { + if (isValid()) { throw new UnsupportedOperationException("FrameBuffer already initialized."); } @@ -579,7 +579,7 @@ public void addColorBuffer(Image.Format format) { */ @Deprecated public void addColorTexture(Texture2D tex) { - if (id != -1) { + if (isValid()) { throw new UnsupportedOperationException("FrameBuffer already initialized."); } @@ -607,7 +607,7 @@ public void addColorTexture(Texture2D tex) { */ @Deprecated public void addColorTexture(TextureArray tex, int layer) { - if (id != -1) { + if (isValid()) { throw new UnsupportedOperationException("FrameBuffer already initialized."); } @@ -636,7 +636,7 @@ public void addColorTexture(TextureArray tex, int layer) { */ @Deprecated public void addColorTexture(TextureCubeMap tex, TextureCubeMap.Face face) { - if (id != -1) { + if (isValid()) { throw new UnsupportedOperationException("FrameBuffer already initialized."); } @@ -660,7 +660,7 @@ public void addColorTexture(TextureCubeMap tex, TextureCubeMap.Face face) { */ @Deprecated public void setDepthTexture(Texture2D tex) { - if (id != -1) { + if (isValid()) { throw new UnsupportedOperationException("FrameBuffer already initialized."); } @@ -681,7 +681,7 @@ public void setDepthTexture(Texture2D tex) { */ @Deprecated public void setDepthTexture(TextureArray tex, int layer) { - if (id != -1) { + if (isValid()) { throw new UnsupportedOperationException("FrameBuffer already initialized."); } @@ -781,7 +781,7 @@ public String toString() { @Override public void resetObject() { - this.id = -1; + invalidate(); for (int i = 0; i < colorBufs.size(); i++) { colorBufs.get(i).resetObject(); @@ -806,7 +806,7 @@ public NativeObject createDestructableClone() { @Override public long getUniqueId() { - return ((long) OBJTYPE_FRAMEBUFFER << 32) | (0xffffffffL & (long) id); + return ((long) OBJTYPE_FRAMEBUFFER << 32) | (0xffffffffL & getId()); } /** diff --git a/jme3-core/src/main/java/com/jme3/texture/Image.java b/jme3-core/src/main/java/com/jme3/texture/Image.java index 4f576b810c..4bd2b8ff6a 100644 --- a/jme3-core/src/main/java/com/jme3/texture/Image.java +++ b/jme3-core/src/main/java/com/jme3/texture/Image.java @@ -673,7 +673,7 @@ public boolean isNPOT() { @Override public void resetObject() { - this.id = -1; + invalidate(); this.mipsWereGenerated = false; this.lastTextureState.reset(); setUpdateNeeded(); @@ -693,12 +693,12 @@ public void deleteObject(Object rendererObject) { @Override public NativeObject createDestructableClone() { - return new Image(id); + return new Image(getId()); } @Override public long getUniqueId() { - return ((long)OBJTYPE_TEXTURE << 32) | (0xffffffffL & (long)id); + return ((long)OBJTYPE_TEXTURE << 32) | (0xffffffffL & getId()); } /** @@ -1203,7 +1203,7 @@ public String toString(){ sb.append(", mips"); if (getId() >= 0) - sb.append(", id=").append(id); + sb.append(", id=").append(getId()); sb.append("]"); diff --git a/jme3-core/src/main/java/com/jme3/util/NativeObject.java b/jme3-core/src/main/java/com/jme3/util/NativeObject.java index c7ff725294..5c73cd155a 100644 --- a/jme3-core/src/main/java/com/jme3/util/NativeObject.java +++ b/jme3-core/src/main/java/com/jme3/util/NativeObject.java @@ -44,8 +44,9 @@ */ public abstract class NativeObject implements Cloneable { - public static final int INVALID_ID = -1; - + //can be anything since its not used for validity + private static final int INVALID_ID = 0; + protected static final int OBJTYPE_VERTEXBUFFER = 1, OBJTYPE_TEXTURE = 2, OBJTYPE_FRAMEBUFFER = 3, @@ -65,7 +66,14 @@ public abstract class NativeObject implements Cloneable { * The ID of the object, usually depends on its type. * Typically returned from calls like glGenTextures, glGenBuffers, etc. */ - protected int id = INVALID_ID; + private int id = INVALID_ID; + + /** + * indicates if this object is valid, replaces using -1 for the id since in some cases, -1 is a + * valid id. + */ + + private boolean valid; /** * A reference to a "handle". By hard referencing a certain object, it's @@ -98,6 +106,7 @@ public NativeObject(){ */ protected NativeObject(int id){ this.id = id; + this.valid = true; } void setNativeObjectManager(NativeObjectManager objectManager) { @@ -111,10 +120,11 @@ void setNativeObjectManager(NativeObjectManager objectManager) { * @param id The ID to set */ public void setId(int id){ - if (this.id != INVALID_ID) { + if (isValid()) { throw new IllegalStateException("ID has already been set for this GL object."); } this.id = id; + this.valid = true; } /** @@ -249,4 +259,17 @@ public WeakReference getWeakRef() { } return (WeakReference) weakRef; } + + public boolean isValid() { + return valid; + } + + public boolean isInvalid() { + return !valid; + } + + public void invalidate() { + this.id = INVALID_ID; + valid = false; + } } diff --git a/jme3-core/src/main/java/com/jme3/util/NativeObjectManager.java b/jme3-core/src/main/java/com/jme3/util/NativeObjectManager.java index c35b91145d..f56b3245c7 100644 --- a/jme3-core/src/main/java/com/jme3/util/NativeObjectManager.java +++ b/jme3-core/src/main/java/com/jme3/util/NativeObjectManager.java @@ -102,8 +102,8 @@ public NativeObjectRef(ReferenceQueue refQueue, NativeObject obj){ * @param obj the object to register (not null) */ public void registerObject(NativeObject obj) { - if (obj.getId() <= 0) { - throw new IllegalArgumentException("object id must be greater than zero"); + if (obj.isInvalid()) { + throw new IllegalArgumentException("object is not valid"); } NativeObjectRef ref = new NativeObjectRef(refQueue, obj); @@ -129,8 +129,8 @@ private void deleteNativeObject(Object rendererObject, NativeObject obj, NativeO assert realObj == null || obj.getId() == realObj.getId(); if (deleteGL) { - if (obj.getId() <= 0) { - logger.log(Level.WARNING, "Object already deleted: {0}", obj.getClass().getSimpleName() + "/" + obj.getId()); + if (obj.isInvalid()) { + logger.log(Level.WARNING, "Object already deleted: {0}", obj.getClass().getSimpleName()); } else { // Unregister it from cleanup list. NativeObjectRef ref2 = refMap.remove(obj.getUniqueId()); @@ -146,7 +146,7 @@ private void deleteNativeObject(Object rendererObject, NativeObject obj, NativeO // Delete object from the GL driver obj.deleteObject(rendererObject); - assert obj.getId() == NativeObject.INVALID_ID; + assert obj.isInvalid(); if (logger.isLoggable(Level.FINEST)) { logger.log(Level.FINEST, "Deleted: {0}", obj.getClass().getSimpleName() + "/" + id); diff --git a/jme3-lwjgl/src/main/java/com/jme3/opencl/lwjgl/LwjglContext.java b/jme3-lwjgl/src/main/java/com/jme3/opencl/lwjgl/LwjglContext.java index e95a2a56d0..9f66594d92 100644 --- a/jme3-lwjgl/src/main/java/com/jme3/opencl/lwjgl/LwjglContext.java +++ b/jme3-lwjgl/src/main/java/com/jme3/opencl/lwjgl/LwjglContext.java @@ -151,13 +151,12 @@ public ImageFormat[] querySupportedFormats(MemoryAccess access, Image.ImageType @Override public Buffer bindVertexBuffer(VertexBuffer vb, MemoryAccess access) { - int id = vb.getId(); - if (id == -1) { + if (vb.isInvalid()) { throw new IllegalArgumentException("vertex buffer was not yet uploaded to the GPU or is CPU only"); } long flags = Utils.getMemoryAccessFlags(access); Utils.errorBuffer.rewind(); - CLMem mem = CL10GL.clCreateFromGLBuffer(context, flags, id, Utils.errorBuffer); + CLMem mem = CL10GL.clCreateFromGLBuffer(context, flags, vb.getId(), Utils.errorBuffer); Utils.checkError(Utils.errorBuffer, "clCreateFromGLBuffer"); return new LwjglBuffer(mem); } @@ -165,7 +164,7 @@ public Buffer bindVertexBuffer(VertexBuffer vb, MemoryAccess access) { @Override public Image bindImage(com.jme3.texture.Image image, Texture.Type textureType, int mipLevel, MemoryAccess access) { int imageID = image.getId(); - if (imageID == -1) { + if (image.isInvalid()) { throw new IllegalArgumentException("image was not yet uploaded to the GPU"); } long memFlags = Utils.getMemoryAccessFlags(access); diff --git a/jme3-lwjgl3/src/main/java/com/jme3/opencl/lwjgl/LwjglContext.java b/jme3-lwjgl3/src/main/java/com/jme3/opencl/lwjgl/LwjglContext.java index 8fef7ad1f1..4cc8023f38 100644 --- a/jme3-lwjgl3/src/main/java/com/jme3/opencl/lwjgl/LwjglContext.java +++ b/jme3-lwjgl3/src/main/java/com/jme3/opencl/lwjgl/LwjglContext.java @@ -162,13 +162,12 @@ public ImageFormat[] querySupportedFormats(MemoryAccess access, Image.ImageType @Override public Buffer bindVertexBuffer(VertexBuffer vb, MemoryAccess access) { Utils.assertSharingPossible(); - int id = vb.getId(); - if (id == -1) { + if (vb.isInvalid()) { throw new IllegalArgumentException("vertex buffer was not yet uploaded to the GPU or is CPU only"); } long flags = Utils.getMemoryAccessFlags(access); Utils.errorBuffer.rewind(); - long mem = CL10GL.clCreateFromGLBuffer(context, flags, id, Utils.errorBuffer); + long mem = CL10GL.clCreateFromGLBuffer(context, flags, vb.getId(), Utils.errorBuffer); Utils.checkError(Utils.errorBuffer, "clCreateFromGLBuffer"); return new LwjglBuffer(mem); }