package com.android.droidgraph.scene; import com.android.droidgraph.event.RotationEvent; import com.android.droidgraph.event.ScaleEventDispatcher; import com.android.droidgraph.event.TranslationEvent; import com.android.droidgraph.geom.Transform3D; import com.android.droidgraph.util.GLH; import com.android.droidgraph.vecmath.Point3f; import com.android.droidgraph.vecmath.Vector3f; /** * */ class DesktopSGTransformFactory extends SGTransform.Factory { /** Creates a new instance of DesktopSGTransformFactory */ public DesktopSGTransformFactory() { } @Override SGTransform.Affine makeAffine(Transform3D at, SGNode child) { return new Affine(at, child); } @Override SGTransform.Translate makeTranslate(float tx, float ty, float tz, SGNode child) { return new Translate(tx, ty, tz, child); } @Override SGTransform.Scale makeScale(float sx, float sy, float sz, SGNode child) { return new Scale(sx, sy, sz, child); } @Override SGTransform.Rotate makeRotate(float thetax, float thetay, float thetaz, SGNode child) { return new Rotate(thetax, thetay, thetaz, child); } @Override SGTransform.Shear makeShear(float shx, float shy, float shz, SGNode child) { return new Shear(shx, shy, shz, child); } static Point3f setPoint(Point3f dst, float x, float y, float z) { if (dst == null) { // REMIND: This should be changed back to float when we // create a separate Phone/Embedded factory... dst = new Point3f(); } dst.set(x, y, z); return dst; } // REMIND: These classes must be public for beans property setters to work public static final class Translate extends SGTransform.Translate { private TranslationEvent t; public Translate(float tx, float ty, float tz, SGNode child) { t = new TranslationEvent(tx, ty, tz); child.addTranslationEvent(t); } @Override public float getTranslateX() { return t.getTranslation().x; } @Override public float getTranslateY() { return t.getTranslation().y; } @Override public float getTranslateZ() { return t.getTranslation().z; } @Override public void setTranslateX(float tx) { t.setTranslation(tx, t.getTranslation().y, t.getTranslation().z); } @Override public void setTranslateY(float ty) { t.setTranslation(t.getTranslation().x, ty, t.getTranslation().z); } @Override public void setTranslateZ(float tz) { t.setTranslation(t.getTranslation().x, t.getTranslation().y, tz); } @Override public void setTranslation(float tx, float ty, float tz) { t.setTranslation(tx, ty, tz); } @Override public void translateBy(float tx, float ty, float tz) { t.setTranslation(t.getTranslation().x += tx, t.getTranslation().y += ty, t.getTranslation().z += tz); } @Override public Point3f transform(Point3f src, Point3f dst) { return null; } @Override public Point3f inverseTransform(Point3f src, Point3f dst) { return null; } @Override public void concatenateInto(Transform3D at) { } @Override public void getTransform(Transform3D at) { } } // REMIND: These classes must be public for beans property setters to work public static final class Scale extends SGTransform.Scale { private ScaleEventDispatcher s = new ScaleEventDispatcher(1f, 1f, 1f); public Scale(float sx, float sy, float sz, SGNode child) { s.setScale(sx, sy, sz); child.addScaleEvent(s); } @Override public Point3f transform(Point3f src, Point3f dst) { return null; } @Override public Point3f inverseTransform(Point3f src, Point3f dst) { return null; } @Override public void concatenateInto(Transform3D at) { // at.setScale(new Vector3d((float) sx, (float) sy, (float) sz)); } @Override public void getTransform(Transform3D at) { // Transform3D t = new Transform3D(); // t.set(new Vector3f((float) sx, (float) sy, (float) sz)); // at.mul(t, at); } @Override public float getScaleX() { return s.getScale().x; } @Override public float getScaleY() { return s.getScale().y; } @Override public float getScaleZ() { return s.getScale().z; } @Override public void setScaleX(float sx) { s.setScaleX(sx); } @Override public void setScaleY(float sy) { s.setScaleY(sy); } @Override public void setScaleZ(float sz) { s.setScaleZ(sz); } @Override public void setScale(float sx, float sy, float sz) { s.setScale(sx, sy, sz); } @Override public void scaleBy(float sx, float sy, float sz) { s.scaleBy(sx, sy, sz); } } // REMIND: These classes must be public for beans property setters to work public static final class Rotate extends SGTransform.Rotate { RotationEvent re = new RotationEvent(); public Rotate(float thetax, float thetay, float thetaz, SGNode child) { re.setRotation(thetax, thetay, thetaz); child.addRotationEvent(re); } @Override public Point3f transform(Point3f src, Point3f dst) { log.pl("DeskTop-Rotate transform() returns null", this); return null; } @Override public Point3f inverseTransform(Point3f src, Point3f dst) { log.pl("DeskTop-Rotate inverseTransform() returns null", this); return null; } @Override public void concatenateInto(Transform3D at) { // at.rotate(theta); } @Override public void getTransform(Transform3D at) { // at.setToRotation(theta); } @Override public Vector3f getRotation() { return re.getRotation(); } @Override public float getRotationX() { return re.getRotation().x; } @Override public float getRotationY() { return re.getRotation().y; } @Override public float getRotationZ() { return re.getRotation().z; } @Override public void setRotation(float thetax, float thetay, float thetaz) { re.setRotation(thetax, thetay, thetaz); } @Override public void rotateBy(Vector3f v) { re.rotateBy(v); } @Override public void rotateXBy(float thetax) { re.rotateBy(thetax, 0, 0); } @Override public void rotateYBy(float thetay) { re.rotateBy(0, thetay, 0); } @Override public void rotateZBy(float thetaz) { re.rotateBy(0, 0, thetaz); } } // REMIND: These classes must be public for beans property setters to work public static final class Shear extends SGTransform.Shear { private float shx; private float shy; private float shz; private SGNode child; public Shear(float shx, float shy, float shz, SGNode child) { this.shx = shx; this.shy = shy; this.shz = shz; this.child = child; } @Override public Point3f transform(Point3f src, Point3f dst) { float x = src.getX(); float y = src.getY(); float z = src.getZ(); float retx = x + shx * y; float rety = y + shy * x; float retz = z + shz * z; return setPoint(dst, retx, rety, retz); } @Override public Point3f inverseTransform(Point3f src, Point3f dst) { float x = src.getX(); float y = src.getY(); float z = src.getZ(); float det = 1 - shx * shy * shz; float retx = x; float rety = y; float retz = z; // REMIND: are x,y really the best answer if non-invertible? if (det != 0) { retx -= shx * y; rety -= shy * x; retz -= shz * z; retx /= det; rety /= det; retz /= det; } return setPoint(dst, retx, rety, retz); } @Override public void concatenateInto(Transform3D at) { // at.shear(shx, shy); } @Override public void getTransform(Transform3D at) { // at.setToShear(shx, shy); } @Override public float getShearX() { return shx; } @Override public float getShearY() { return shy; } @Override public float getShearZ() { return shz; } @Override public void setShearX(float shx) { this.shx = shx; invalidateTransform(); } @Override public void setShearY(float shy) { this.shy = shy; invalidateTransform(); } @Override public void setShearZ(float shz) { this.shz = shz; invalidateTransform(); } @Override public void setShear(float shx, float shy, float shz) { this.shx = shx; this.shy = shy; this.shz = shz; invalidateTransform(); } @Override public void shearBy(float shx, float shy, float shz) { // REMIND: Is this correct? this.shx *= shx; this.shy *= shy; this.shz *= shz; invalidateTransform(); } } // REMIND: These classes must be public for beans property setters to work public static final class Affine extends SGTransform.Affine { private Transform3D at; public Affine(Transform3D at, SGNode child) { if (at == null) { this.at = new Transform3D(); } else { this.at = new Transform3D(); } } @Override public Point3f transform(Point3f src, Point3f dst) { // return at.transform(src, dst); GLH.pointToTransform(src, dst); return null; } @Override public Point3f inverseTransform(Point3f src, Point3f dst) { // try { // return at.inverseTransform(src, dst); // } catch (NoninvertibleTransformException e) { // return setPoint(dst, src.getX(), src.getY(), src.getZ()); // } return null; } @Override public void concatenateInto(Transform3D at) { // at.concatenate(this.at); } @Override public void getTransform(Transform3D at) { // at.setTransform(this.at); } @Override public Transform3D getAffine() { // return new Transform3D(at); return null; } @Override public void setAffine(Transform3D at) { // this.at.setTr(at); // invalidateTransform(); } @Override public void transformBy(Transform3D at) { // this.at.concatenate(at); invalidateTransform(); } @Override public void reset() { // this.at.setToIdentity(); // invalidateTransform(); } } }