private float PopulateCompleteSide(ref CrossSection face, int quadrant, float halfCubeWidth, bool outer) { V3ToV3Xna XnaOMV = new V3ToV3Xna(); quadrant = NormalizeQuadrant(quadrant); face.RemoveAllPoints(); OpenMetaverse.Vector3 startPoint = XnaOMV.V3XToV3(ReferenceVertices[quadrant]); OpenMetaverse.Vector3 endPoint; if (quadrant < NumberFaces - 1) { endPoint = XnaOMV.V3XToV3(ReferenceVertices[quadrant + 1]); } else { endPoint = XnaOMV.V3XToV3(ReferenceVertices[0]); } startPoint = startPoint * halfCubeWidth / 0.5f; endPoint = endPoint * halfCubeWidth / 0.5f; if (outer) { face.AddPoint(startPoint); face.AddPoint(endPoint); } else { face.AddPoint(endPoint); face.AddPoint(startPoint); } return 2f * halfCubeWidth; }
// Handles the first face in the cut, starting from cutstart, // and running anticlockwise to first reference vertex private float PopulateSingleCutFacePositiveDirection(ref CrossSection face, OpenMetaverse.Vector3 cutPoint, int quadrant, float halfCubeWidth, bool outer) { V3ToV3Xna XnaOMV = new V3ToV3Xna(); quadrant = NormalizeQuadrant(quadrant); face.RemoveAllPoints(); OpenMetaverse.Vector3 startPoint = cutPoint; OpenMetaverse.Vector3 endPoint; if (quadrant < NumberFaces - 1) { endPoint = XnaOMV.V3XToV3(ReferenceVertices[quadrant + 1] * halfCubeWidth / 0.5f); } else { endPoint = XnaOMV.V3XToV3(ReferenceVertices[0] * halfCubeWidth / 0.5f); } if (outer) { face.AddPoint(startPoint); face.AddPoint(endPoint); } else { face.AddPoint(endPoint); face.AddPoint(startPoint); } return OpenMetaverse.Vector3.Distance(startPoint, endPoint); }
private OpenMetaverse.Vector3 GetCutIntersect(float cut, float cubeHalfWidth) { V3ToV3Xna XnaOMV = new V3ToV3Xna(); int cutQuadrant = GetCutQuadrant(cut); OpenMetaverse.Vector3 lineend; OpenMetaverse.Vector3 linestart = XnaOMV.V3XToV3(ReferenceVertices[cutQuadrant] * cubeHalfWidth); linestart = OpenMetaverse.Vector3.Divide(linestart, 0.5f); if (cutQuadrant < NumberFaces - 1) { lineend = XnaOMV.V3XToV3(ReferenceVertices[cutQuadrant + 1] * cubeHalfWidth); } else { lineend = XnaOMV.V3XToV3(ReferenceVertices[0] * cubeHalfWidth); } lineend = OpenMetaverse.Vector3.Divide(lineend, 0.5f); // float angle = GetAngleWithXAxis(cut); // CutVectorPerp is perpendicular to the radius vector OpenMetaverse.Vector3 cutVectorPerp = new OpenMetaverse.Vector3((float)-Math.Sin(angle), (float)Math.Cos(angle), 0); OpenMetaverse.Vector3 delta = lineend - linestart; // From http://softsurfer.com/Archive/algorithm_0104/algorithm_0104B.htm OpenMetaverse.Vector3 result = linestart - delta * OpenMetaverse.Vector3.Dot(cutVectorPerp, linestart) / OpenMetaverse.Vector3.Dot(cutVectorPerp, delta); return result; }