| /*******************************************************************************
|
| * Copyright 2011 See AUTHORS file.
|
| *
|
| * Licensed under the Apache License, Version 2.0 (the "License");
|
| * you may not use this file except in compliance with the License.
|
| * You may obtain a copy of the License at
|
| *
|
| * http://www.apache.org/licenses/LICENSE-2.0
|
| *
|
| * Unless required by applicable law or agreed to in writing, software
|
| * distributed under the License is distributed on an "AS IS" BASIS,
|
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| * See the License for the specific language governing permissions and
|
| * limitations under the License.
|
| ******************************************************************************/ |
| |
| package com.badlogic.gdx.physics.bullet; |
| |
| import com.badlogic.gdx.Gdx; |
| import com.badlogic.gdx.utils.Disposable; |
| |
| public class BulletBase implements Disposable { |
| private long cPointer; |
| protected boolean swigCMemOwn; |
| private boolean disposed; |
| protected boolean destroyed; |
| public final String className; |
| private int refCount; |
| |
| protected BulletBase(final String className, long cPtr, boolean cMemoryOwn) { |
| this.className = className; |
| swigCMemOwn = cMemoryOwn; |
| cPointer = cPtr; |
| } |
| |
| /** Obtains a reference to this object, call release to free the reference. */ |
| public void obtain() { |
| refCount++; |
| } |
| |
| /** Release a previously obtained reference, causing the object to be disposed when this was the last reference. */ |
| public void release() { |
| if (--refCount <= 0 && Bullet.useRefCounting) |
| dispose(); |
| } |
| |
| /** @return Whether this instance is obtained using the {@link #obtain()} method. */ |
| public boolean isObtained() { |
| return refCount > 0; |
| } |
| |
| protected void construct() { |
| destroyed = false; |
| } |
| |
| protected void reset(long cPtr, boolean cMemoryOwn) { |
| if (!destroyed) |
| destroy(); |
| swigCMemOwn = cMemoryOwn; |
| cPointer = cPtr; |
| construct(); |
| } |
| |
| @Override |
| public boolean equals(Object obj) { |
| return (obj instanceof BulletBase) && (((BulletBase)obj).cPointer == this.cPointer); |
| } |
| |
| @Override |
| public int hashCode() { |
| return (int)cPointer; |
| } |
| |
| /** @return The memory location (pointer) of this instance. */ |
| public long getCPointer() { |
| return cPointer; |
| } |
| |
| /** Take ownership of the native instance, causing the native object to be deleted when this object gets out of scope. */ |
| public void takeOwnership() { |
| swigCMemOwn = true; |
| } |
| |
| /** Release ownership of the native instance, causing the native object NOT to be deleted when this object gets out of scope. */ |
| public void releaseOwnership() { |
| swigCMemOwn = false; |
| } |
| |
| /** @return True if the native is destroyed when this object gets out of scope, false otherwise. */ |
| public boolean hasOwnership() { |
| return swigCMemOwn; |
| } |
| |
| /** Deletes the bullet object this class encapsulates. Do not call directly, instead use the {@link #dispose()} method. */ |
| protected void delete() { |
| cPointer = 0; |
| } |
| |
| @Override |
| public void dispose () { |
| if (refCount > 0 && Bullet.useRefCounting && Bullet.enableLogging) |
| Gdx.app.error("Bullet", "Disposing "+toString()+" while it still has "+refCount+" references."); |
| disposed = true; |
| delete(); |
| } |
| |
| /** @return Whether the {@link #dispose()} method of this instance is called. */ |
| public boolean isDisposed() { |
| return disposed; |
| } |
| |
| @Override |
| public String toString () { |
| return className+"("+cPointer+","+swigCMemOwn+")"; |
| } |
| |
| protected void destroy() { |
| try { |
| if (destroyed && Bullet.enableLogging) |
| Gdx.app.error("Bullet", "Already destroyed "+toString()); |
| destroyed = true; |
| |
| if (swigCMemOwn && !disposed) { |
| if (Bullet.enableLogging) |
| Gdx.app.error("Bullet", "Disposing "+toString()+" due to garbage collection."); |
| dispose(); |
| } |
| } catch(Throwable e) { |
| Gdx.app.error("Bullet", "Exception while destroying "+toString(), e); |
| } |
| } |
| |
| @Override |
| protected void finalize() throws Throwable { |
| if (!destroyed && Bullet.enableLogging) |
| Gdx.app.error("Bullet", "The "+className+" class does not override the finalize method."); |
| super.finalize(); |
| } |
| } |