--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/m3g_qt/javasrc/javax/microedition/m3g/Object3D.java Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,241 @@
+/*
+* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package javax.microedition.m3g;
+
+import java.util.Enumeration;
+import java.util.Vector;
+import com.nokia.mj.impl.rt.support.Finalizer;
+
+/**
+*/
+public abstract class Object3D
+{
+ //------------------------------------------------------------------
+ // Instance data
+ //------------------------------------------------------------------
+
+ int handle;
+
+ private Object userObject;
+ private Vector animTracks;
+ private Interface iInterface;
+
+ private Finalizer mFinalizer = new Finalizer()
+ {
+ public void finalizeImpl()
+ {
+ doFinalize();
+ }
+ };
+
+ //------------------------------------------------------------------
+ // Constructor(s)
+ //------------------------------------------------------------------
+
+ /**
+ * <p>Only a package private constructor exists for this class.</p>
+ */
+ Object3D(int handle)
+ {
+ if (handle != 0)
+ {
+ this.handle = handle;
+ _addRef(handle);
+
+ // Get associated Interafece object and
+ // register this instance with that
+ iInterface = Interface.getInstance();
+ iInterface.register(this);
+
+ int n = _getAnimationTrackCount(handle);
+ while (n-- > 0)
+ {
+ linkAnimTrack((AnimationTrack) getInstance(_getAnimationTrack(handle, n)));
+ }
+ }
+ else
+ {
+ System.out.println("Warning: Object3D constructor called with zero handle");
+ }
+ }
+
+ //------------------------------------------------------------------
+ // Public API
+ //------------------------------------------------------------------
+
+ public final Object3D duplicate()
+ {
+ int numRef = 1;
+ if (this instanceof Node)
+ {
+ numRef = ((Node)this)._getSubtreeSize(handle);
+ }
+ int[] handles = new int[numRef * 2];
+ Object3D obj = getInstance(_duplicate(handle, handles));
+ for (int i = 0; i < numRef; i++)
+ {
+ Object userObj = getInstance(handles[i * 2]).getUserObject();
+ Object3D duplicateObj = getInstance(handles[i * 2 + 1]);
+ if (userObj != null)
+ {
+ duplicateObj.setUserObject(userObj);
+ }
+ }
+ return obj;
+ }
+
+ public int getReferences(Object3D[] references)
+ {
+ int[] handles = null;
+ if (references != null)
+ {
+ handles = new int[references.length];
+ }
+ int num = _getReferences(handle, handles);
+ if (references != null)
+ {
+ for (int i = 0; i < num; i++)
+ {
+ references[i] = getInstance(handles[i]);
+ }
+ }
+ return num;
+ }
+
+ public void setUserID(int userID)
+ {
+ _setUserID(handle, userID);
+ }
+
+ public int getUserID()
+ {
+ return _getUserID(handle);
+ }
+
+ public Object3D find(int userID)
+ {
+ return getInstance(_find(handle, userID));
+ }
+
+ public void addAnimationTrack(AnimationTrack animationTrack)
+ {
+ _addAnimationTrack(handle, animationTrack.handle);
+ linkAnimTrack(animationTrack);
+ }
+
+ public AnimationTrack getAnimationTrack(int index)
+ {
+ /* Don't try to match the native indexing here -- just call
+ * the native getter */
+ return (AnimationTrack)getInstance(_getAnimationTrack(handle, index));
+ }
+
+ public void removeAnimationTrack(AnimationTrack animationTrack)
+ {
+ if (animationTrack != null)
+ {
+ _removeAnimationTrack(handle, animationTrack.handle);
+
+ if (animTracks != null)
+ {
+ animTracks.removeElement(animationTrack);
+ if (animTracks.isEmpty())
+ {
+ animTracks = null;
+ }
+ }
+ }
+ }
+
+ public int getAnimationTrackCount()
+ {
+ return _getAnimationTrackCount(handle);
+ }
+
+ public final int animate(int time)
+ {
+ return _animate(handle, time);
+ }
+
+ public void setUserObject(Object obj)
+ {
+ userObject = obj;
+ }
+
+ public Object getUserObject()
+ {
+ return userObject;
+ }
+
+ //------------------------------------------------------------------
+ // Private methods
+ //------------------------------------------------------------------
+
+ static final Object3D getInstance(int handle)
+ {
+ return Interface.getObjectInstance(handle);
+ }
+
+ /**
+ * Adds a reference to an animation track.
+ */
+ private void linkAnimTrack(AnimationTrack track)
+ {
+ if (animTracks == null)
+ {
+ animTracks = new Vector();
+ }
+ animTracks.addElement(track);
+ }
+
+ /**
+ * Native peer finalization
+ */
+ private void doFinalize()
+ {
+ if (mFinalizer != null)
+ {
+ if (handle != 0)
+ {
+ // finalize native peer
+ Platform.finalizeObject(handle, iInterface);
+ iInterface.deregister(this, iInterface);
+
+ // reset handles
+ iInterface = null;
+ handle= 0;
+ }
+ mFinalizer = null;
+ }
+ }
+
+ // Native methods
+ private static native int _addAnimationTrack(int hObject, int hAnimationTrack);
+ private static native void _removeAnimationTrack(int hObject, int hAnimationTrack);
+ private static native int _getAnimationTrackCount(int hObject);
+ private static native int _animate(int hObject, int time);
+ private static native void _setUserID(int hObject, int userID);
+ private static native int _getUserID(int hObject);
+
+ private static native void _addRef(int hObject);
+ private static native int _getAnimationTrack(int hObject, int index);
+ private static native int _duplicate(int hObject, int[] handles);
+ private static native int _getReferences(int hObject, int[] handles);
+ private static native int _find(int hObject, int userID);
+}