Normand Briere
2019-05-13 f924d3e00db476c06f55f3d5aaef307e17575340
Transform children
12 files modified
240 ■■■■ changed files
BoundaryRep.java 2 ●●● patch | view | raw | blame | history
CameraPane.java 6 ●●●● patch | view | raw | blame | history
Globals.java 1 ●●●● patch | view | raw | blame | history
Grafreed.java 6 ●●●● patch | view | raw | blame | history
GroupEditor.java 69 ●●●● patch | view | raw | blame | history
LA.java 1 ●●●● patch | view | raw | blame | history
Mocap.java 30 ●●●● patch | view | raw | blame | history
ObjEditor.java 6 ●●●● patch | view | raw | blame | history
Object3D.java 48 ●●●● patch | view | raw | blame | history
SwitchEditor.java 15 ●●●● patch | view | raw | blame | history
cFileSystemPane.java 4 ●●●● patch | view | raw | blame | history
cJ3D.java 52 ●●●●● patch | view | raw | blame | history
BoundaryRep.java
....@@ -500,7 +500,7 @@
500500 static Vertex vertextemp = new Vertex(true);
501501 static Vertex vertextemp2 = new Vertex(true);
502502
503
- static double SEUIL = 0.1f; // 0.1 for rag doll; 0.07;
503
+ static double SEUIL = 0.05f; // 0.1 for rag doll; 0.07;
504504
505505 // Compute weight of point w/r to this
506506 float ComputeWeight(Vertex v, double[][] toRoot, int k)
CameraPane.java
....@@ -14870,7 +14870,7 @@
1487014870 //RESIZETEXTURE ^= true;
1487114871 //break;
1487214872 case 'z':
14873
- RENDERSHADOW ^= true;
14873
+ Globals.RENDERSHADOW ^= true;
1487414874 Globals.lighttouched = true;
1487514875 repaint();
1487614876 break;
....@@ -16592,7 +16592,7 @@
1659216592 gl.glDisable(gl.GL_CULL_FACE);
1659316593 }
1659416594
16595
- if (!RENDERSHADOW)
16595
+ if (!Globals.RENDERSHADOW)
1659616596 gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
1659716597
1659816598 // SB gl.glPolygonOffset(2.5f, 10);
....@@ -16602,7 +16602,7 @@
1660216602 //gl.glColorMask(false, false, false, false);
1660316603
1660416604 //render_scene_from_light_view(gl, drawable, 0, 0);
16605
- if (RENDERSHADOW && Globals.lighttouched && !movingcamera) // && !parent.IsFreezed())
16605
+ if (Globals.RENDERSHADOW && Globals.lighttouched && !movingcamera) // && !parent.IsFreezed())
1660616606 {
1660716607 gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
1660816608
Globals.java
....@@ -6,6 +6,7 @@
66 static iCameraPane theRenderer;
77
88 private static boolean LIVE = false;
9
+ public static boolean RENDERSHADOW = true;
910
1011 static boolean CROWD = false;
1112 static public int drawMode = iCameraPane.DEFAULT; // WARNING
Grafreed.java
....@@ -41,7 +41,11 @@
4141 static void Assert(boolean b)
4242 {
4343 if (!b)
44
+ {
45
+ b = !!b;
4446 new Exception().printStackTrace(); // assert(b);
47
+
48
+ }
4549 }
4650
4751 public void init()
....@@ -844,7 +848,7 @@
844848 //Monitor mon=MonitorFactory.start("myFirstMonitor");
845849 standAlone = true;
846850 grafreeD = new Grafreed();
847
- grafreeD.universe = new Composite();
851
+ grafreeD.universe = new cGroup();
848852 grafreeD.universe.name = "Grafreed";
849853 grafreeD.universe.material = new cMaterial();
850854 // theApplet3D.universe.textures = CameraPane.DEFAULT_TEXTURE;
GroupEditor.java
....@@ -318,8 +318,12 @@
318318 resetTransformItem.addActionListener(this);
319319 resetCentroidItem = menu.add(new MenuItem("Reset Centroid"));
320320 resetCentroidItem.addActionListener(this);
321
- transformgeometryItem = menu.add(new MenuItem("Transform Geometry"));
322
- transformgeometryItem.addActionListener(this);
321
+ resetCentroidXZItem = menu.add(new MenuItem("Reset Centroid XY"));
322
+ resetCentroidXZItem.addActionListener(this);
323
+ transformGeometryItem = menu.add(new MenuItem("Transform Geometry"));
324
+ transformGeometryItem.addActionListener(this);
325
+ transformChildrenItem = menu.add(new MenuItem("Transform Children"));
326
+ transformChildrenItem.addActionListener(this);
323327
324328 oe.menuBar.add(menu = new Menu("Geometry"));
325329 genUVItem = menu.add(new MenuItem("Generate UV"));
....@@ -422,17 +426,18 @@
422426 sortbysizeItem.addActionListener(this);
423427 sortbynameItem = menu.add(new MenuItem("Sort by name"));
424428 sortbynameItem.addActionListener(this);
429
+ menu.add("-");
430
+ shareGeometriesItem = menu.add(new MenuItem("Share Geometries"));
431
+ shareGeometriesItem.addActionListener(this);
432
+ mergeGeometriesItem = menu.add(new MenuItem("Merge Geometries"));
433
+ mergeGeometriesItem.addActionListener(this);
425434 if (Globals.ADVANCED)
426435 {
427
- menu.add("-");
436
+ // Pretty much the same as duplicate and clone.
428437 extractGeometriesItem = menu.add(new MenuItem("Link Geometry"));
429438 extractGeometriesItem.addActionListener(this);
430439 cloneGeometriesItem = menu.add(new MenuItem("Clone Geometry"));
431440 cloneGeometriesItem.addActionListener(this);
432
- shareGeometriesItem = menu.add(new MenuItem("Share Geometry"));
433
- shareGeometriesItem.addActionListener(this);
434
- mergeGeometriesItem = menu.add(new MenuItem("Merge Geometry"));
435
- mergeGeometriesItem.addActionListener(this);
436441 }
437442
438443 oe.menuBar.add(menu = new Menu("Insert"));
....@@ -651,7 +656,7 @@
651656 zoomBoxCB.setToolTipText("Display bounding boxes when moving the wheel");
652657 zoomBoxCB.addItemListener(this);
653658
654
- if (Globals.ADVANCED)
659
+ if (true) // Globals.ADVANCED)
655660 {
656661 panel.add(supportCB = new cCheckBox("Support", CameraPane.SUPPORT)); //, constraints);
657662 supportCB.setToolTipText("Enable rigging");
....@@ -2614,9 +2619,13 @@
26142619 {
26152620 SmoothMesh();
26162621 } else
2617
- if (source == transformgeometryItem)
2622
+ if (source == transformGeometryItem)
26182623 {
26192624 TransformGeometry();
2625
+ } else
2626
+ if (source == transformChildrenItem)
2627
+ {
2628
+ TransformChildren();
26202629 } else
26212630 if (source == resetTransformItem)
26222631 {
....@@ -2624,7 +2633,11 @@
26242633 } else
26252634 if (source == resetCentroidItem)
26262635 {
2627
- ResetCentroid();
2636
+ ResetCentroid(true);
2637
+ } else
2638
+ if (source == resetCentroidXZItem)
2639
+ {
2640
+ ResetCentroid(false);
26282641 } else
26292642 if (source == resetParentItem)
26302643 {
....@@ -3140,6 +3153,28 @@
31403153 refreshContents();
31413154 }
31423155
3156
+ void TransformChildren()
3157
+ {
3158
+ Object3D obj;
3159
+ for (Enumeration e = group.selection.elements(); e.hasMoreElements();)
3160
+ {
3161
+ obj = (Object3D)e.nextElement();
3162
+ obj.KeepTextureMatrices();
3163
+ obj.TransformChildren();
3164
+ obj.RestoreTextureMatrices();
3165
+
3166
+// if (obj.parent == null)
3167
+// {
3168
+// System.out.println("NULL PARENT!");
3169
+// new Exception().printStackTrace();
3170
+// }
3171
+// else
3172
+// TouchTransform(obj);
3173
+// //obj.parent.Touch();
3174
+ }
3175
+
3176
+ refreshContents();
3177
+ }
31433178
31443179 void ResetTransform()
31453180 {
....@@ -3252,7 +3287,7 @@
32523287 refreshContents();
32533288 }
32543289
3255
- void ResetCentroid()
3290
+ void ResetCentroid(boolean full)
32563291 {
32573292 Object3D obj;
32583293 for (Enumeration e = group.selection.elements(); e.hasMoreElements();)
....@@ -3267,12 +3302,16 @@
32673302 LA.matIdentity(Object3D.mat);
32683303 obj.getBounds(minima, maxima, false);
32693304 Object3D.mat[3][0] = -(minima.x + maxima.x)/2;
3270
- Object3D.mat[3][1] = -(minima.y + maxima.y)/2;
3305
+ if (full)
3306
+ Object3D.mat[3][1] = -(minima.y + maxima.y)/2;
32713307 Object3D.mat[3][2] = -(minima.z + maxima.z)/2;
32723308 obj.TransformMesh(Object3D.mat);
3309
+
32733310 Object3D.mat[3][0] = (minima.x + maxima.x)/2;
3274
- Object3D.mat[3][1] = (minima.y + maxima.y)/2;
3311
+ if (full)
3312
+ Object3D.mat[3][1] = (minima.y + maxima.y)/2;
32753313 Object3D.mat[3][2] = (minima.z + maxima.z)/2;
3314
+
32763315 LA.matConcat(Object3D.mat, obj.toParent, obj.toParent);
32773316 //Object3D.mat[3][0] = -Object3D.mat[3][0];
32783317 //Object3D.mat[3][1] = -Object3D.mat[3][1];
....@@ -5153,8 +5192,10 @@
51535192 private MenuItem panoTexturesItem;
51545193
51555194 private MenuItem resetCentroidItem;
5156
- private MenuItem transformgeometryItem;
5195
+ private MenuItem resetCentroidXZItem;
51575196 private MenuItem resetTransformItem;
5197
+ private MenuItem transformGeometryItem;
5198
+ private MenuItem transformChildrenItem;
51585199 private MenuItem hideItem;
51595200 private MenuItem grabItem;
51605201 private MenuItem backItem;
LA.java
....@@ -307,6 +307,7 @@
307307
308308 }
309309
310
+ // Last row should always be 0 0 0 1
310311 Grafreed.Assert(Math.abs(src[0][3]) <= 1E-15);
311312 Grafreed.Assert(Math.abs(src[1][3]) <= 1E-15);
312313 Grafreed.Assert(Math.abs(src[2][3]) <= 1E-15);
Mocap.java
....@@ -484,6 +484,12 @@
484484 {
485485 Object3D hip = get(0);
486486
487
+ if (toParent == null)
488
+ {
489
+ toParent = LA.newMatrix();
490
+ fromParent = LA.newMatrix();
491
+ }
492
+
487493 LA.matConcat(toParent, hip.get(0).toParent, matrix);
488494
489495 mocaporigin.x = matrix[3][0];
....@@ -664,8 +670,8 @@
664670 double targetdirx;
665671 double targetdirz;
666672
667
- double goalposx = -20;
668
- double goalposz = -10;
673
+ double goalposx = 0; // -20;
674
+ double goalposz = 0; // -10;
669675
670676 boolean followpath;
671677
....@@ -2797,7 +2803,8 @@
27972803 //if (bone._rotationEnabled)
27982804 if (//frame > 0 &&
27992805 !bone.skipmocap &&
2800
- !bone.name.contains("head") // &&
2806
+ !bone.name.contains("head") &&
2807
+ !bone.name.contains("Head") // &&
28012808 // !bone.name.contains("rFoot") &&
28022809 // !bone.name.contains("lFoot") &&
28032810 // !bone.name.contains("Pinky") &&
....@@ -3233,8 +3240,8 @@
32333240
32343241 // aout 2013 endframe = 0; // june 2013
32353242
3236
- //ResetZero();
3237
- setPose(frame);
3243
+ ResetZero();
3244
+ //setPose(frame);
32383245 }
32393246
32403247 static int mocapsupport = 0;
....@@ -3300,7 +3307,7 @@
33003307 {
33013308 if (support == null)
33023309 {
3303
- if (new File(fullname).exists())
3310
+ if (bvh == null && new File(fullname).exists())
33043311 ObjEditor.LoadBVHFile(fullname, this, false, beginframe, lastframetest);
33053312 else
33063313 {
....@@ -3889,17 +3896,22 @@
38893896 // if (firstframe)
38903897 // return;
38913898
3892
- if (!restarted && /*display.restartframe &&*/
3893
- Globals.isLIVE() && live && display.DrawMode() == display.SHADOW) // FUCK
3899
+ if (//!restarted && /*display.restartframe &&*/
3900
+ Globals.isLIVE() && live && (display.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW))
38943901 {
38953902 //display.restartframe = false;
38963903 restarted = true;
3904
+ //System.err.println("restarted = true");
38973905 Step();
38983906 }
38993907 else
39003908 {
3901
- if (Globals.isLIVE() && live && display.DrawMode() != display.SHADOW)
3909
+ //System.err.println("restarted");
3910
+ if (Globals.isLIVE() && live && display.DrawMode() != iCameraPane.SHADOW)
3911
+ {
39023912 restarted = false;
3913
+ //System.err.println("restarted = false");
3914
+ }
39033915 }
39043916
39053917 super.drawSelf(display, root, selected, blocked);
ObjEditor.java
....@@ -501,13 +501,13 @@
501501 //SendInfo("Name:", "bold");
502502 if (sel.GetTextures() != null || debug)
503503 {
504
- si.SendInfo(sel.toString(), "bold");
504
+ si.SendInfo(sel.toString() + (Globals.ADVANCED?"":" " + System.identityHashCode(sel)), "bold");
505505 //SendInfo("#children virtual = " + sel.size() + "; real = " + sel.Size() + newline, "regular");
506506 if (sel.Size() > 0)
507507 {
508508 si.SendInfo("#children = " + sel.Size(), "regular");
509509 }
510
- si.SendInfo((debug ? " Parent: " : " ") + sel.parent, "regular");
510
+ si.SendInfo((debug ? " Parent: " : " ") + sel.parent + (Globals.ADVANCED?"":" " + System.identityHashCode(sel.parent)), "regular");
511511 if (debug)
512512 {
513513 try
....@@ -549,7 +549,7 @@
549549 }
550550 if (sel.support != null)
551551 {
552
- si.SendInfo(" support: " + sel.support, "regular");
552
+ si.SendInfo(" support: " + sel.support + (Globals.ADVANCED?"":" " + System.identityHashCode(sel.support)), "regular");
553553 }
554554 if (sel.scriptnode != null)
555555 {
Object3D.java
....@@ -797,7 +797,7 @@
797797
798798 if (marked && Globals.isLIVE() && live &&
799799 //TEMP21aug2018
800
- Globals.DrawMode() == iCameraPane.SHADOW &&
800
+ (Globals.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW) &&
801801 currentframe != Globals.framecount)
802802 {
803803 currentframe = Globals.framecount;
....@@ -912,6 +912,11 @@
912912 fromParent = null; // LA.newMatrix();
913913 bRep = null; // new BoundaryRep();
914914
915
+ if (oname != null && oname.equals("LeftHand"))
916
+ {
917
+ name = oname;
918
+ }
919
+
915920 /*
916921 float hue = (float)Math.random();
917922 Color col;
....@@ -1470,7 +1475,7 @@
14701475 BoundaryRep.SEUIL = other.material.cameralight;
14711476
14721477 // Set default to 0.1
1473
- BoundaryRep.SEUIL /= 2;
1478
+ BoundaryRep.SEUIL /= 4; // 2;
14741479 System.out.println("SEUIL = " + BoundaryRep.SEUIL);
14751480 }
14761481
....@@ -2983,6 +2988,31 @@
29832988 blockloop = false;
29842989 }
29852990
2991
+ void TransformChildren()
2992
+ {
2993
+ if (toParent != null)
2994
+ {
2995
+ for (int i=Size(); --i>=0;)
2996
+ {
2997
+ Object3D v = get(i);
2998
+
2999
+ if (v.toParent == null)
3000
+ {
3001
+ v.toParent = LA.newMatrix();
3002
+ v.fromParent = LA.newMatrix();
3003
+ }
3004
+
3005
+ LA.matConcat(v.toParent, toParent, v.toParent);
3006
+ LA.matConcat(fromParent, v.fromParent, v.fromParent);
3007
+ }
3008
+
3009
+ toParent = null; // LA.matIdentity(toParent);
3010
+ fromParent = null; // LA.matIdentity(fromParent);
3011
+
3012
+ Touch();
3013
+ }
3014
+ }
3015
+
29863016 void TransformGeometry()
29873017 {
29883018 Object3D obj = this;
....@@ -5379,7 +5409,7 @@
53795409 return
53805410 CameraPane.SUPPORT && !CameraPane.movingcamera && link2master && /*live &&*/ support != null
53815411 // PROBLEM with CROWD!!
5382
- && (Globals.DrawMode() == iCameraPane.SHADOW || Globals.CROWD);
5412
+ && (Globals.DrawMode() == iCameraPane.SHADOW || !Globals.RENDERSHADOW || Globals.CROWD);
53835413 }
53845414
53855415 static boolean DEBUG_SELECTION = false;
....@@ -7368,14 +7398,22 @@
73687398 //return super.toString() + " (id=" + list + ")" + " (brep=" + bRep + ")";
73697399 //return name + " (id=" + list + ")" + " (brep=" + bRep + ") " + super.toString();
73707400 //return name + " (#tri = " + (bRep==null?0:bRep.VertexCount()) + ") " + super.toString();
7401
+
7402
+ String objname;
7403
+
73717404 if (false) //parent != null)
73727405 {
7373
- return name + " " + System.identityHashCode(this) + " (" + parent.name + " " + System.identityHashCode(parent) + ")";
7406
+ objname = name + " " + System.identityHashCode(this) + " (" + parent.name + " " + System.identityHashCode(parent) + ")";
73747407 } else
73757408 {
7376
- return GetName() + (Math.abs(count) == 1000 ? (count == 1000 ? " " : " * ") : (" (" + (count /*- 1*/) + ") ")) + /*(IsSelected()?"(selected) ":"") + (touched?"(touched) ":"") */ +System.identityHashCode(this);
7409
+ objname = GetName() + (Math.abs(count) == 1000 ? (count == 1000 ? " " : " * ") : (" (" + (count /*- 1*/) + ")")) + /*(IsSelected()?"(selected) ":"") + (touched?"(touched) ":"") */ "";
73777410 } // + super.toString();
73787411 //return name + " (" + (SizeOf.deepSizeOf(this)/1024) + "K) " + this.getClass().getName();
7412
+
7413
+ if (!Globals.ADVANCED)
7414
+ return objname;
7415
+
7416
+ return objname + " " + System.identityHashCode(this);
73797417 }
73807418
73817419 public int hashCode()
SwitchEditor.java
....@@ -9,6 +9,8 @@
99 class SwitchEditor extends ObjEditor implements //ItemListener,
1010 ChangeListener, ObjectUI, ActionListener
1111 {
12
+ private cGridBag dampPanel;
13
+ private cGridBag framePanel;
1214 SwitchEditor(SwitchNode inBP, GroupEditor callee)
1315 {
1416 super(inBP,callee);
....@@ -69,6 +71,7 @@
6971 oe.aConstraints.gridwidth = 1;
7072 */
7173 super.SetupUI2(oe);
74
+ framePanel = AddSlider(oe.ctrlPanel, "Child: ", 0, switchnode.getNumFrames()-1, switchnode.child);
7275
7376 // oe.aConstraints.gridx = 0;
7477 // oe.aConstraints.gridwidth = 1;
....@@ -81,10 +84,11 @@
8184 //
8285 // frameField.setInteger(frameselect.child);
8386
84
- frameField = (cNumberSlider)AddSlider(oe.ctrlPanel, "Child: ", 0, switchnode.getNumFrames()-1, switchnode.child).getComponent(1);
87
+ frameField = (cNumberSlider)framePanel.getComponent(1);
8588 oe.ctrlPanel.Return();
89
+ dampPanel = AddSlider(oe.ctrlPanel, "Damp: ", 0, 500, switchnode.speed);
8690
87
- speedField = (cNumberSlider)AddSlider(oe.ctrlPanel, "Damp: ", 0, 500, switchnode.speed).getComponent(1);
91
+ speedField = (cNumberSlider)dampPanel.getComponent(1);
8892 oe.ctrlPanel.Return();
8993
9094 // oe.aConstraints.gridy += 1;
....@@ -224,8 +228,11 @@
224228 // oe.ctrlPanel.remove(frameLabel);
225229 // oe.ctrlPanel.remove(speedField);
226230 // oe.ctrlPanel.remove(speedLabel);
227
- Remove(frameField);
228
- Remove(speedField);
231
+// Remove(frameField);
232
+// Remove(speedField);
233
+
234
+ oe.ctrlPanel.remove(framePanel);
235
+ oe.ctrlPanel.remove(dampPanel);
229236 //oe.ctrlPanel.repaint();
230237
231238 super.closeUI();
cFileSystemPane.java
....@@ -62,10 +62,10 @@
6262
6363 cGridBag fileCommsnds = new cGridBag();
6464
65
- fileCommsnds.add(refreshButton = new JButton("Refresh")); //, aConstraints);
66
- refreshButton.setToolTipText("Refresh entire tree");
6765 fileCommsnds.add(loadButton = new JButton("Load")); //, aConstraints);
6866 loadButton.setToolTipText("Load selected file(s)");
67
+ fileCommsnds.add(refreshButton = new JButton("Refresh")); //, aConstraints);
68
+ refreshButton.setToolTipText("Refresh entire tree");
6969
7070 refreshButton.addActionListener(this);
7171 loadButton.addActionListener(this);
cJ3D.java
....@@ -360,13 +360,13 @@
360360 toParent[3][3] = m.m33;
361361 }
362362
363
+ Matrix4d m = new Matrix4d();
364
+
363365 Object3D Read(TransformGroup g)
364366 {
365367 Object3D c = new Object3D(GetName(g)); // g.getClass().getName());
366368
367369 Transform3D t = new Transform3D();
368
-
369
- Matrix4d m = new Matrix4d();
370370
371371 g.getTransform(t);
372372
....@@ -375,22 +375,18 @@
375375 c.toParent = LA.newMatrix();
376376 c.fromParent = LA.newMatrix();
377377
378
- c.toParent[0][0] = m.m00;
379
- c.toParent[0][1] = m.m10;
380
- c.toParent[0][2] = m.m20;
381
- c.toParent[0][3] = m.m30;
382
- c.toParent[1][0] = m.m01;
383
- c.toParent[1][1] = m.m11;
384
- c.toParent[1][2] = m.m21;
385
- c.toParent[1][3] = m.m31;
386
- c.toParent[2][0] = m.m02;
387
- c.toParent[2][1] = m.m12;
388
- c.toParent[2][2] = m.m22;
389
- c.toParent[2][3] = m.m32;
390
- c.toParent[3][0] = m.m03;
391
- c.toParent[3][1] = m.m13;
392
- c.toParent[3][2] = m.m23;
393
- c.toParent[3][3] = m.m33;
378
+ if (m.m00 != 0 || m.m10 != 0 || m.m20 != 0 || m.m30 != 0 ||
379
+ m.m01 != 0 || m.m11 != 0 || m.m21 != 0 || m.m31 != 0 ||
380
+ m.m02 != 0 || m.m12 != 0 || m.m22 != 0 || m.m32 != 0 ||
381
+ m.m03 != 0 || m.m13 != 0 || m.m23 != 0 /*|| m.m33 != 0 */)
382
+ {
383
+ SetMatrix(c, m);
384
+ }
385
+ else
386
+ {
387
+ System.err.println("Found zero scale matrix. Hide the object instead.");
388
+ c.count = 1;
389
+ }
394390
395391 // ReadNode(c, g);
396392 LA.matInvert(c.toParent, c.fromParent);
....@@ -402,6 +398,26 @@
402398
403399 return c;
404400 }
401
+
402
+ private void SetMatrix(Object3D c, Matrix4d m)
403
+ {
404
+ c.toParent[0][0] = m.m00;
405
+ c.toParent[0][1] = m.m10;
406
+ c.toParent[0][2] = m.m20;
407
+ c.toParent[0][3] = m.m30;
408
+ c.toParent[1][0] = m.m01;
409
+ c.toParent[1][1] = m.m11;
410
+ c.toParent[1][2] = m.m21;
411
+ c.toParent[1][3] = m.m31;
412
+ c.toParent[2][0] = m.m02;
413
+ c.toParent[2][1] = m.m12;
414
+ c.toParent[2][2] = m.m22;
415
+ c.toParent[2][3] = m.m32;
416
+ c.toParent[3][0] = m.m03;
417
+ c.toParent[3][1] = m.m13;
418
+ c.toParent[3][2] = m.m23;
419
+ c.toParent[3][3] = m.m33;
420
+ }
405421
406422 Object3D Read(Scene s, String fn)
407423 {