public Vector3 Max = new Vector3(-99999, -99999, -99999);
public float R = 0;
- //public void CreateBoundingVolume(FaceData mesh)
- //{
- // for (int q = 0; q < mesh.VertexBuffer.Length; q++)
- // {
- // if (mesh.VertexBuffer[q].Position.X < Min.X) Min.X = mesh.VertexBuffer[q].Position.X;
- // if (mesh.VertexBuffer[q].Position.Y < Min.Y) Min.Y = mesh.VertexBuffer[q].Position.Y;
- // if (mesh.VertexBuffer[q].Position.Z < Min.Z) Min.Z = mesh.VertexBuffer[q].Position.Z;
+ public void CreateBoundingVolume(OpenMetaverse.Rendering.Face mesh)
+ {
+ for (int q = 0; q < mesh.Vertices.Count; q++)
+ {
+ if (mesh.Vertices[q].Position.X < Min.X) Min.X = mesh.Vertices[q].Position.X;
+ if (mesh.Vertices[q].Position.Y < Min.Y) Min.Y = mesh.Vertices[q].Position.Y;
+ if (mesh.Vertices[q].Position.Z < Min.Z) Min.Z = mesh.Vertices[q].Position.Z;
- // if (mesh.VertexBuffer[q].Position.X > Max.X) Max.X = mesh.VertexBuffer[q].Position.X;
- // if (mesh.VertexBuffer[q].Position.Y > Max.Y) Max.Y = mesh.VertexBuffer[q].Position.Y;
- // if (mesh.VertexBuffer[q].Position.Z > Max.Z) Max.Z = mesh.VertexBuffer[q].Position.Z;
- // }
+ if (mesh.Vertices[q].Position.X > Max.X) Max.X = mesh.Vertices[q].Position.X;
+ if (mesh.Vertices[q].Position.Y > Max.Y) Max.Y = mesh.Vertices[q].Position.Y;
+ if (mesh.Vertices[q].Position.Z > Max.Z) Max.Z = mesh.Vertices[q].Position.Z;
+ }
- // Vector3 dist = Max - Min;
- // R = dist.Length;
- // mesh.ObjCenter = Min + (dist / 2); // objektin keskikohta
- //}
+ Vector3 dist = Max - Min;
+ R = Vector3.Distance(Min, Max);
+ mesh.Center = Min + (dist / 2);
+ }
+
+ public void AddVolume(BoundingSphere vol)
+ {
+ if (vol.Min.X < this.Min.X) this.Min.X = vol.Min.X;
+ if (vol.Min.Y < this.Min.Y) this.Min.Y = vol.Min.Y;
+ if (vol.Min.Z < this.Min.Z) this.Min.Z = vol.Min.Z;
+
+ if (vol.Max.X > this.Max.X) this.Max.X = vol.Max.X;
+ if (vol.Max.Y > this.Max.Y) this.Max.Y = vol.Max.Y;
+ if (vol.Max.Z > this.Max.Z) this.Max.Z = vol.Max.Z;
+ R = Vector3.Distance(Min, Max);
+ }
//public void CreateBoundingVolume(Model mesh, Vector3 min, Vector3 max)
//{
{\r
}\r
\r
- FacetedMesh RightclickedPrim;\r
+ RenderPrimitive RightclickedPrim;\r
int RightclickedFaceID;\r
\r
private void glControl_MouseDown(object sender, MouseEventArgs e)\r
object picked;\r
if (TryPick(e.X, e.Y, out picked, out RightclickedFaceID))\r
{\r
- if (picked is FacetedMesh)\r
+ if (picked is RenderPrimitive)\r
{\r
- RightclickedPrim = (FacetedMesh)picked;\r
+ RightclickedPrim = (RenderPrimitive)picked;\r
ctxObjects.Show(glControl, e.X, e.Y);\r
}\r
else if (picked is RenderAvatar)\r
int faceID;\r
if (TryPick(e.X, e.Y, out clicked, out faceID))\r
{\r
- if (clicked is FacetedMesh)\r
+ if (clicked is RenderPrimitive)\r
{\r
- FacetedMesh picked = (FacetedMesh)clicked;\r
+ RenderPrimitive picked = (RenderPrimitive)clicked;\r
\r
if (ModifierKeys == Keys.None)\r
{\r
{\r
Primitive.TextureEntryFace teFace = mesh.Prim.Textures.FaceTextures[j];\r
Face face = mesh.Faces[j];\r
- FaceData data = (FaceData)face.UserData;\r
+ FaceData data = (FaceData)mesh.Faces[j].UserData;\r
\r
// Don't render objects too small to matter\r
- if (LODFactor(primPos, prim.Scale, data.BoundingSphere.R) < minLODFactor) continue;\r
+ if (LODFactor(primPos, prim.Scale, data.BoundingVolume.R) < minLODFactor) continue;\r
\r
// Don't render objects not in the field of view\r
- if (!Frustum.ObjectInFrustum(primPos, data.BoundingSphere, prim.Scale)) continue;\r
+ if (!Frustum.ObjectInFrustum(primPos, data.BoundingVolume, prim.Scale)) continue;\r
\r
if (teFace == null)\r
teFace = mesh.Prim.Textures.DefaultTexture;\r
}\r
}\r
\r
- private void MeshPrim(Primitive prim, RenderPrimitive mesh)\r
+ private void MeshPrim(Primitive prim, RenderPrimitive rprim)\r
{\r
RenderPrimitive existingMesh = null;\r
\r
}\r
}\r
\r
- // Create a FaceData struct for each face that stores the 3D data\r
- // in a OpenGL friendly format\r
- for (int j = 0; j < mesh.Faces.Count; j++)\r
+ // Calculate bounding volumes for each prim and adjust textures\r
+ rprim.BoundingVolume = new BoundingSphere();\r
+ for (int j = 0; j < rprim.Faces.Count; j++)\r
{\r
Primitive.TextureEntryFace teFace = prim.Textures.GetFace((uint)j);\r
if (teFace == null) continue;\r
\r
- Face face = mesh.Faces[j];\r
+ Face face = rprim.Faces[j];\r
FaceData data = new FaceData();\r
\r
- // Vertices for this face\r
- data.Vertices = new float[face.Vertices.Count * 3];\r
- data.Normals = new float[face.Vertices.Count * 3];\r
- for (int k = 0; k < face.Vertices.Count; k++)\r
- {\r
- data.Vertices[k * 3 + 0] = face.Vertices[k].Position.X;\r
- data.Vertices[k * 3 + 1] = face.Vertices[k].Position.Y;\r
- data.Vertices[k * 3 + 2] = face.Vertices[k].Position.Z;\r
-\r
- if (data.Vertices[k * 3 + 0] < data.BoundingSphere.Min.X) data.BoundingSphere.Min.X = data.Vertices[k * 3 + 0];\r
- if (data.Vertices[k * 3 + 1] < data.BoundingSphere.Min.Y) data.BoundingSphere.Min.Y = data.Vertices[k * 3 + 1];\r
- if (data.Vertices[k * 3 + 2] < data.BoundingSphere.Min.Z) data.BoundingSphere.Min.Z = data.Vertices[k * 3 + 2];\r
-\r
- if (data.Vertices[k * 3 + 0] > data.BoundingSphere.Max.X) data.BoundingSphere.Max.X = data.Vertices[k * 3 + 0];\r
- if (data.Vertices[k * 3 + 1] > data.BoundingSphere.Max.Y) data.BoundingSphere.Max.Y = data.Vertices[k * 3 + 1];\r
- if (data.Vertices[k * 3 + 2] > data.BoundingSphere.Max.Z) data.BoundingSphere.Max.Z = data.Vertices[k * 3 + 2];\r
-\r
- data.Normals[k * 3 + 0] = face.Vertices[k].Normal.X;\r
- data.Normals[k * 3 + 1] = face.Vertices[k].Normal.Y;\r
- data.Normals[k * 3 + 2] = face.Vertices[k].Normal.Z;\r
- }\r
-\r
- data.BoundingSphere.R = (data.BoundingSphere.Max - data.BoundingSphere.Min).Length();\r
-\r
- // Indices for this face\r
- data.Indices = face.Indices.ToArray();\r
+ data.BoundingVolume.CreateBoundingVolume(face);\r
+ rprim.BoundingVolume.AddVolume(data.BoundingVolume);\r
\r
// With linear texture animation in effect, texture repeats and offset are ignored\r
if ((prim.TextureAnim.Flags & Primitive.TextureAnimMode.ANIM_ON) != 0\r
// Texture transform for this face\r
renderer.TransformTexCoords(face.Vertices, face.Center, teFace);\r
\r
- // Texcoords for this face\r
- data.TexCoords = new float[face.Vertices.Count * 2];\r
- for (int k = 0; k < face.Vertices.Count; k++)\r
- {\r
- data.TexCoords[k * 2 + 0] = face.Vertices[k].TexCoord.X;\r
- data.TexCoords[k * 2 + 1] = face.Vertices[k].TexCoord.Y;\r
- }\r
-\r
// Set the UserData for this face to our FaceData struct\r
face.UserData = data;\r
- mesh.Faces[j] = face;\r
-\r
+ rprim.Faces[j] = face;\r
\r
if (existingMesh != null &&\r
j < existingMesh.Faces.Count &&\r
\r
lock (Prims)\r
{\r
- Prims[prim.LocalID] = mesh;\r
+ Prims[prim.LocalID] = rprim;\r
}\r
}\r
\r