DIRECTORY SVCoordSys, SVMatrix3d, SV2d, SV3d, SVAssembly, SVCaret, SVInterfaceTypes, SVModelTypes, SVSceneTypes, SVVector3d; SVCaretImpl: CEDAR PROGRAM IMPORTS SVCoordSys, SVMatrix3d, SVAssembly, SVVector3d EXPORTS SVCaret = BEGIN AlignmentObject: TYPE = SVSceneTypes.AlignmentObject; CoordSystem: TYPE = SVModelTypes.CoordSystem; Point2d: TYPE = SV2d.Point2d; Point3d: TYPE = SV3d.Point3d; Matrix4by4: TYPE = SV3d.Matrix4by4; Primitive: TYPE = SVSceneTypes.Primitive; Skitter: TYPE = REF SkitterObj; SkitterObj: TYPE = SVSceneTypes.SkitterObj; Slice: TYPE = SVSceneTypes.Slice; SliceDescriptor: TYPE = SVSceneTypes.SliceDescriptor; Vector3d: TYPE = SV3d.Vector3d; Create: PUBLIC PROC RETURNS [skitter: Skitter] = { skitter _ NEW[SkitterObj]; }; Copy: PUBLIC PROC [from: Skitter, to: Skitter] = { to^ _ from^; }; Kill: PUBLIC PROC [skitter: Skitter] = { skitter.alive _ FALSE; skitter.attractor _ NIL; }; Exists: PUBLIC PROC [skitter: Skitter] RETURNS [BOOL] = { RETURN[skitter.alive]; }; GetPosition: PUBLIC PROC [skitter: Skitter] RETURNS [skitterWorld: Matrix4by4] = { skitterWorld _ skitter.skitterWorld; }; GetPoint: PUBLIC PROC [skitter: Skitter] RETURNS [origin: Point3d] = { origin _ SVMatrix3d.OriginOfMatrix[skitter.skitterWorld]; }; SetAssemblyAndPrimitive: PUBLIC PROC [skitter: Skitter, assembly: Slice, primitive: Primitive] = { skitter.attractor _ SVAssembly.NewParts[assembly, NIL, [0,0,0], slice]; skitter.primitive _ primitive; }; SetAttractor: PUBLIC PROC [skitter: Skitter, cameraPt: Point2d, surfacePtWorld: Point3d, normalWorld: Vector3d, attractor: AlignmentObject] = { skitterWorld: Matrix4by4; IF attractor # NIL AND ISTYPE[attractor, SliceDescriptor] THEN { sliceD: SliceDescriptor _ NARROW[attractor]; skitterWorld _ MakeAlignedMat[normalWorld, surfacePtWorld, sliceD.slice.coordSys]; skitter.attractor _ attractor; skitter.primitive _ NIL; } ELSE { skitterWorld _ SVMatrix3d.MakeHorizontalMatFromZAxis[normalWorld, surfacePtWorld]; skitter.attractor _ attractor; skitter.primitive _ NIL; }; PositionFromMatrix[skitter, cameraPt, skitterWorld]; }; NoAttractor: PUBLIC PROC [skitter: Skitter] = { skitter.attractor _ NIL; }; GetAttractor: PUBLIC PROC [skitter: Skitter] RETURNS [attractor: AlignmentObject] = { attractor _ skitter.attractor; }; PositionFromMatrix: PUBLIC PROC [skitter: Skitter, cameraPt: Point2d, skitterWorld: Matrix4by4] = { skitter.alive _ TRUE; skitter.cameraPt _ cameraPt; skitter.skitterWorld _ skitterWorld; }; MakeAlignedMat: PROC [worldNormal: Vector3d, surfacePtInWorld: Point3d, cs: CoordSystem] RETURNS [mat: Matrix4by4] = { yAxisOfCS: Vector3d _ SVMatrix3d.YAxisOfMatrix[SVCoordSys.WRTWorld[cs]]; xAxis: Vector3d; IF SVVector3d.Parallel[yAxisOfCS, worldNormal] THEN { xAxis _ SVMatrix3d.XAxisOfMatrix[SVCoordSys.WRTWorld[cs]]; IF AntiParallel[yAxisOfCS, worldNormal] THEN xAxis _ SVVector3d.Negate[xAxis]; } ELSE xAxis _ SVVector3d.CrossProduct[yAxisOfCS, worldNormal]; mat _ SVMatrix3d.MakeMatFromZandXAxis[worldNormal, xAxis, surfacePtInWorld]; }; AntiParallel: PROC [v1, v2: Vector3d] RETURNS [BOOL] = { RETURN[Sign[v1[1]] = -Sign[v2[1]] OR Sign[v1[2]] = -Sign[v2[2]] OR Sign[v1[3]] = -Sign[v2[3]] ]; }; Sign: PROC [r: REAL] RETURNS [INT] = { IF r = 0.0 THEN RETURN[2]; IF r < 0.0 THEN RETURN[-1] ELSE RETURN[1]; }; END. όSVCaretImpl.mesa Copyright c 1987 by Xerox Corporation. All rights reserved. Last edited by Bier on May 22, 1987 3:58:24 pm PDT Contents: Routines for placing the skitter in a Gargoyle3D scene. Create a Matrix4by4 with origin at surfacePtInWorld whose z axis is parallel to worldNormal and whose x zxis is orthogonal to both worldNormal and the y axis of cs in WORLD coordinates. Assume that cs.wrtWorld is accurate Allows positioning code to distinguish between top surfaces and bottom surfaces. Κb˜J˜Icodešœ™Kšœ Οmœ1™˜bKšœ2žœ˜GKšœ˜K˜K˜—š Ÿ œžœžœ0 œ œ+˜Jšœ œ ˜š žœ žœžœžœžœ˜@Jšœžœ ˜,Jšœ œ œ  œ˜RJšœ˜Jšœžœ˜J˜—šžœ˜Jšœ œ/ œ  œ˜RJšœ˜Jšœžœ˜J˜—Jšœ- œ˜4K˜K˜—šŸ œžœžœ˜/Kšœžœ˜K˜K˜—šŸ œžœžœžœ!˜UKšœ˜K˜K˜—šŸœžœžœ. œ˜cJšœžœ˜Jšœ˜Jšœ œ  œ˜$J˜J˜—šŸœžœEžœ˜vJšœή™ήJšœH˜HJšœ˜šžœ-žœ˜5Jšœ:˜:Jšžœ&žœ"˜NJ™PJ˜—Jšžœ9˜=JšœL˜LJšœ˜J˜—šŸ œžœžœžœ˜8šžœž˜$Jšœž˜Jšœ˜—J˜J˜—š Ÿœžœžœžœžœ˜&Jšžœ žœžœ˜Jšžœ žœžœ˜Jšžœžœ˜J˜—K˜Kšžœ˜K˜J˜—…— ζD