home *** CD-ROM | disk | FTP | other *** search
Java Source | 1996-10-10 | 14.0 KB | 588 lines |
- import com.ms.com.*;
- import com.ms.com.*;
- import com.ms.awt.*;
- import com.ms.awt.peer.*;
- import com.ms.directX.*;
-
- class SelectionDude
- {
- private d3dvector zero;
- private d3dvector dir;
-
- private int showBoxes = 0;
- d3drmFrame sFrame = null;
- d3drmMeshBuilder sVisual = null;
- d3drmLight sLight = null;
- d3drmMesh selectionBox = null;
-
- d3drmFrame clipboardFrame = null;
- d3drmMeshBuilder clipboardVisual = null;
-
- d3drm lpd3drm;
-
- int rod_faces[] = {
- 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0, /* end 1 */
- 4, 0, 0, 1, 1, 9, 1, 8, 0, /* side 0 */
- 4, 1, 1, 2, 2, 10, 2, 9, 1, /* side 1 */
- 4, 2, 2, 3, 3, 11, 3, 10, 2, /* side 2 */
- 4, 3, 3, 4, 4, 12, 4, 11, 3, /* side 3 */
- 4, 4, 4, 5, 5, 13, 5, 12, 4, /* side 4 */
- 4, 5, 5, 6, 6, 14, 6, 13, 5, /* side 5 */
- 4, 6, 6, 7, 7, 15, 7, 14, 6, /* side 6 */
- 4, 7, 7, 0, 0, 8, 0, 15, 7, /* side 7 */
- 8, 8, 0, 9, 1, 10, 2, 11, 3, 12, 4, 13, 5, 14, 6, 15, 7, /* end 2 */
- 0,0
- };
-
- int cone_faces[] = {
- 8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0, 0, /* end 1 */
- 3, 0, 0, 1, 1, 8, 1, /* side 0 */
- 3, 1, 1, 2, 2, 8, 1, /* side 1 */
- 3, 2, 2, 3, 3, 8, 1, /* side 2 */
- 3, 3, 3, 4, 4, 8, 1, /* side 3 */
- 3, 4, 4, 5, 5, 8, 1, /* side 4 */
- 3, 5, 5, 6, 6, 8, 1, /* side 5 */
- 3, 6, 6, 7, 7, 8, 1, /* side 6 */
- 3, 7, 7, 0, 0, 8, 1, /* side 7 */
- 0, 0
- };
-
- //////////////////////////////////////////////////////////////////////////
-
- d3dvector CreateVector()
- {
- d3dvector v;
-
- v = new d3dvector();
- v.x = 0.0F;
- v.y = 0.0F;
- v.z = 0.0F;
-
- return v;
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- SelectionDude(d3drm i)
- {
- lpd3drm = i;
-
- zero = CreateVector();
- dir = CreateVector();
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- void ShowBoxes(int show)
- {
- showBoxes = show;
- SelectVisual(sVisual, sFrame);
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- int ToggleBoxes()
- {
- if(showBoxes == 0)
- ShowBoxes(1);
- else
- ShowBoxes(0);
-
- return showBoxes;
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- d3drmFrame SelectedFrame()
- {
- return sFrame;
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- d3drmMeshBuilder SelectedVisual()
- {
- return sVisual;
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- d3drmLight SelectedLight()
- {
- return sLight;
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- void DeselectVisual()
- {
- if ((sFrame != null) && (selectionBox != null))
- sFrame.DeleteVisualMesh(selectionBox);
-
- sFrame = null;
- sVisual = null;
- selectionBox = null;
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- void SelectVisual(d3drmMeshBuilder visual, d3drmFrame frame)
- {
- DeselectVisual();
- sVisual = visual;
- sFrame = frame;
-
- if (sVisual != null)
- {
- d3drmLightArray lights;
-
- sLight = null;
- lights = sFrame.GetLights();
- if ( lights != null )
- {
- if (lights.GetSize() != 0)
- sLight = lights.GetElement(0);
- }
-
- if ((showBoxes != 0) && (visual != null))
- {
- d3drmBox box = new d3drmBox();
- d3drmMeshBuilder builder;
-
- sVisual.GetBox(box);
- builder = makeBox(box);
- selectionBox = builder.CreateMesh();
- sFrame.AddVisualMesh(selectionBox);
- }
- }
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- void FindAndSelectVisual(d3drmViewport view, int x, int y)
- {
- d3drmFrame frame;
- d3drmPickedArray picked;
- d3drmMeshBuilder mesh;
-
- /*
- * Make sure we don't try to select the selection box of the current
- * selection.
- */
- DeselectVisual();
-
- picked = view.Pick(x, y);
- if (picked != null)
- {
- if (picked.GetSize() != 0)
- {
- d3drmFrameArray fa = picked.GetPickFrame(0, null);
- d3drmVisual v = picked.GetPickVisual(0, null);
-
- frame = fa.GetElement(fa.GetSize()-1);
- mesh = v.Getd3drmMeshBuilder();
-
- if( mesh != null )
- SelectVisual(mesh, frame);
- }
- }
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- void CutVisual()
- {
- d3drmFrame frame;
-
- if (sFrame != null)
- {
- clipboardFrame = sFrame;
- clipboardVisual = sVisual;
-
- DeselectVisual();
-
- frame = clipboardFrame.GetParent();
- if (frame != null)
- frame.DeleteChild(clipboardFrame);
- }
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- void CopyVisual()
- {
- d3drmFrame frame;
-
- if (sFrame != null)
- {
- clipboardFrame = sFrame.Clone();
- clipboardVisual = sVisual.Clone();
-
- clipboardFrame.AddVisualMeshBuilder(clipboardVisual);
-
- frame = clipboardFrame.GetParent();
- if (frame != null)
- frame.DeleteChild(clipboardFrame);
- }
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- void PasteVisual(d3drmFrame scene)
- {
- if (clipboardFrame != null)
- {
- d3drmFrame frame;
- d3drmMeshBuilder visual;
-
- frame = clipboardFrame.Clone();
- visual = clipboardVisual.Clone();
-
- frame.AddVisualMeshBuilder(visual);
- scene.AddChild(frame);
- }
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- void DeleteVisual()
- {
- if (sFrame != null)
- {
- d3drmFrame parent;
- d3drmFrame frame = sFrame;
-
- DeselectVisual();
- parent = frame.GetParent();
- parent.DeleteChild(frame);
- }
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- void ClearClipboard()
- {
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- private d3drmMeshBuilder makeBox(d3drmBox box)
- {
- d3drmMeshBuilder mesh;
- d3dvector a, b;
-
- mesh = lpd3drm.CreateMeshBuilder();
-
- dir.z = box.maxz + 1.0F;
- AddRod(mesh, 0.05F, zero, dir);
-
- a = dir;
- a.z += 0.6F;
- AddCone(mesh, 0.2F, dir, a);
-
- a.x = box.minx; a.y = box.miny; a.z = box.minz;
- b = a;
- b.y = box.maxy;
- AddRod(mesh, 0.05F, a, b);
-
- a = b; b.x = box.maxx;
- AddRod(mesh, 0.05F, a, b);
-
- a = b; b.y = box.miny;
- AddRod(mesh, 0.05F, a, b);
-
- a = b; b.x = box.minx;
- AddRod(mesh, 0.05F, a, b);
-
- a = b; b.z = box.maxz;
- AddRod(mesh, 0.05F, a, b);
-
- a = b; b.x = box.maxx;
- AddRod(mesh, 0.05F, a, b);
-
- a = b; b.y = box.maxy;
- AddRod(mesh, 0.05F, a, b);
-
- a = b; b.x = box.minx;
- AddRod(mesh, 0.05F, a, b);
-
- a = b; b.y = box.miny;
- AddRod(mesh, 0.05F, a, b);
-
- b.y = box.maxy; a = b; b.z = box.minz;
- AddRod(mesh, 0.05F, a, b);
-
- a.x = b.x = box.maxx;
- a.y = b.y = box.maxy;
- a.z = box.maxz;
- b.z = box.minz;
-
- AddRod(mesh, 0.05F, a, b);
-
- a.y = box.miny; b = a; b.z = box.minz;
- AddRod(mesh, 0.05F, a, b);
-
- mesh.SetColor(lpd3drm.d3drmCreateColorRGB(1.0F, 1.0F, 1.0F));
- return mesh;
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- float D3DDivide( float a, float b)
- {
- return (float)((double) (a) / (double) (b));
- }
-
- float D3DMultiply( float a, float b)
- {
- return ((a) * (b));
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- void AddRod(d3drmMeshBuilder mesh, float radius, d3dvector a, d3dvector b)
- {
- float f;
- int i;
-
- d3dvector d = new d3dvector();
- d3dvector u = new d3dvector();
- d3dvector r = new d3dvector();
- d3dvector[] v = new d3dvector[16];
-
- for(i=0; i<16; i++)
- v[i] = new d3dvector();
-
- d3dvector[] n = new d3dvector[8];
- for(i=0; i<8; i++)
- n[i] = new d3dvector();
-
- /*
- * Find the unit vector along the rod.
- */
- d.x = b.x - a.x;
- d.y = b.y - a.y;
- d.z = b.z - a.z;
- lpd3drm.d3drmVectorNormalise(d);
-
- /*
- * Pick a vector normal to d
- */
- if (d.y != 0.0 || d.z != 0.0)
- {
- u.x = 0.0F;
- if (d.y == 0.0F)
- {
- u.y = 1.0F;
- u.z = 0.0F;
- }
- else
- {
- float n_fix = 1.0F + D3DDivide(D3DMultiply(d.z, d.z), D3DMultiply(d.y, d.y));
- u.z = (float)Math.sqrt(D3DDivide(1.0F, n_fix));
- u.y = -D3DMultiply(u.z, D3DDivide(d.z, d.y));
- }
- }
- else
- {
- u.x = 0.0F;
- u.y = 0.0F;
- u.z = 1.0F;
- }
-
- /*
- * Now find a vector normal to them both, to give us a coordinate
- * system in the plane normal to the rod.
- */
- lpd3drm.d3drmVectorCrossProduct(r, d, u);
-
- /*
- * Scale down the coordinates to the radius of the rod.
- */
- u.x = D3DMultiply(u.x, radius);
- u.y = D3DMultiply(u.y, radius);
- u.z = D3DMultiply(u.z, radius);
- r.x = D3DMultiply(r.x, radius);
- r.y = D3DMultiply(r.y, radius);
- r.z = D3DMultiply(r.z, radius);
-
- /*
- * Calculate the corners of an octagon.
- */
- f = (float)Math.sqrt(2) / (2 * (1 + (float)Math.sqrt(2) / 2));
- v[0].x = 1; // huh!! null pointer exception here
-
- v[0].x = u.x + D3DMultiply(r.x, f);
- v[0].y = u.y + D3DMultiply(r.y, f);
- v[0].z = u.z + D3DMultiply(r.z, f);
-
- v[1].x = D3DMultiply(u.x, f) + r.x;
- v[1].y = D3DMultiply(u.y, f) + r.y;
- v[1].z = D3DMultiply(u.z, f) + r.z;
-
- v[2].x = D3DMultiply(-u.x, f) + r.x;
- v[2].y = D3DMultiply(-u.y, f) + r.y;
- v[2].z = D3DMultiply(-u.z, f) + r.z;
-
- v[3].x = -u.x + D3DMultiply(r.x, f);
- v[3].y = -u.y + D3DMultiply(r.y, f);
- v[3].z = -u.z + D3DMultiply(r.z, f);
-
- v[4].x = -u.x - D3DMultiply(r.x, f);
- v[4].y = -u.y - D3DMultiply(r.y, f);
- v[4].z = -u.z - D3DMultiply(r.z, f);
-
- v[5].x = D3DMultiply(-u.x, f) - r.x;
- v[5].y = D3DMultiply(-u.y, f) - r.y;
- v[5].z = D3DMultiply(-u.z, f) - r.z;
-
- v[6].x = D3DMultiply(u.x, f) - r.x;
- v[6].y = D3DMultiply(u.y, f) - r.y;
- v[6].z = D3DMultiply(u.z, f) - r.z;
-
- v[7].x = u.x - D3DMultiply(r.x, f);
- v[7].y = u.y - D3DMultiply(r.y, f);
- v[7].z = u.z - D3DMultiply(r.z, f);
-
- /*
- * Add the rod endpoints and calculate the vertex normals.
- */
- for (i = 0; i < 8; i++)
- {
- n[i] = v[i];
-
- lpd3drm.d3drmVectorNormalise(n[i]);
-
- v[i + 8].x = v[i].x + b.x;
- v[i + 8].y = v[i].y + b.y;
- v[i + 8].z = v[i].z + b.z;
- v[i].x += a.x;
- v[i].y += a.y;
- v[i].z += a.z;
- }
- mesh.AddFacesToMesh(16, v, 8, n, rod_faces);
- }
-
- //////////////////////////////////////////////////////////////////////////
-
- void AddCone(d3drmMeshBuilder mesh, float radius, d3dvector a, d3dvector b)
- {
- d3dvector d = new d3dvector();
- d3dvector u = new d3dvector();
- d3dvector r = new d3dvector();
- d3dvector[] v = new d3dvector[16];
- d3dvector[] n = new d3dvector[8];
- float f;
- int i;
-
- for(i=0; i<8; i++)
- {
- v[i] = new d3dvector();
- n[i] = new d3dvector();
- }
- for(i=8; i<16; i++)
- v[i] = new d3dvector();
-
- /*
- * Find the unit vector along the rod.
- */
- d.x = b.x - a.x;
- d.y = b.y - a.y;
- d.z = b.z - a.z;
- lpd3drm.d3drmVectorNormalise(d);
-
- /*
- * Pick a vector normal to d
- */
- if (d.y != 0.0F || d.z != 0.0F)
- {
- u.x = 0.0F;
- if (d.y == 0.0F)
- {
- u.y = 1.0F;
- u.z = 0.0F;
- }
- else
- {
- float n_fix = 1.0F + D3DDivide(D3DMultiply(d.z, d.z), D3DMultiply(d.y, d.y));
- u.z = (float)Math.sqrt(1.0F / n_fix);
- u.y = - D3DDivide(D3DMultiply(u.z, d.z), d.y);
- }
- }
- else
- {
- u.x = 0.0F;
- u.y = 0.0F;
- u.z = 1.0F;
- }
-
- /*
- * Now find a vector normal to them both, to give us a coordinate
- * system in the plane normal to the rod.
- */
- lpd3drm.d3drmVectorCrossProduct(r, d, u);
-
- /*
- * Scale down the coordinates to the radius of the rod.
- */
- u.x = D3DMultiply(u.x, radius);
- u.y = D3DMultiply(u.y, radius);
- u.z = D3DMultiply(u.z, radius);
- r.x = D3DMultiply(r.x, radius);
- r.y = D3DMultiply(r.y, radius);
- r.z = D3DMultiply(r.z, radius);
-
- /*
- * Calculate the corners of an octagon.
- */
- f = (float)Math.sqrt(2) / (2 * (1 + (float)Math.sqrt(2) / 2));
- v[0].x = u.x + D3DMultiply(r.x, f);
- v[0].y = u.y + D3DMultiply(r.y, f);
- v[0].z = u.z + D3DMultiply(r.z, f);
-
- v[1].x = D3DMultiply(u.x, f) + r.x;
- v[1].y = D3DMultiply(u.y, f) + r.y;
- v[1].z = D3DMultiply(u.z, f) + r.z;
-
- v[2].x = D3DMultiply(-u.x, f) + r.x;
- v[2].y = D3DMultiply(-u.y, f) + r.y;
- v[2].z = D3DMultiply(-u.z, f) + r.z;
-
- v[3].x = -u.x + D3DMultiply(r.x, f);
- v[3].y = -u.y + D3DMultiply(r.y, f);
- v[3].z = -u.z + D3DMultiply(r.z, f);
-
- v[4].x = -u.x - D3DMultiply(r.x, f);
- v[4].y = -u.y - D3DMultiply(r.y, f);
- v[4].z = -u.z - D3DMultiply(r.z, f);
-
- v[5].x = D3DMultiply(-u.x, f) - r.x;
- v[5].y = D3DMultiply(-u.y, f) - r.y;
- v[5].z = D3DMultiply(-u.z, f) - r.z;
-
- v[6].x = D3DMultiply(u.x, f) - r.x;
- v[6].y = D3DMultiply(u.y, f) - r.y;
- v[6].z = D3DMultiply(u.z, f) - r.z;
-
- v[7].x = u.x - D3DMultiply(r.x, f);
- v[7].y = u.y - D3DMultiply(r.y, f);
- v[7].z = u.z - D3DMultiply(r.z, f);
-
- v[8] = b;
-
- // Calculate the vertex normals and add the faces to the mesh
- for (i = 0; i < 8; i++)
- {
- n[i] = v[i];
-
- lpd3drm.d3drmVectorNormalise(n[0]);
- v[i].x += a.x;
- v[i].y += a.y;
- v[i].z += a.z;
- }
- mesh.AddFacesToMesh(9, v, 8, n, cone_faces);
- }
-
- //////////////////////////////////////////////////////////////////////////
- }
-