コード例 #1
0
        public BoundingBox ToContainerBox()
        {
            Vector3[] corners = LocalBoundingBox.GetCorners();

            Vector3 min = Common.Math.ToVector3(Vector3.Transform(corners[0], Transformation));
            Vector3 max = min;

            for (int i = 1; i < corners.Length; i++)
            {
                Vector3 p = Common.Math.ToVector3(Vector3.Transform(corners[i], Transformation));
                min = Vector3.Minimize(min, p);
                max = Vector3.Maximize(max, p);
            }

            //Vector3 min = LocalBoundingBox.Minimum;
            //Vector3 max = LocalBoundingBox.Maximum;
            //float dx = max.X - min.X, dy = max.Y - min.Y, dz = max.Z - min.Z;

            //Vector3 p1 =

            //return new BoundingBox(
            //    Common.Math.ToVector3(Vector3.Transform(LocalBoundingBox.Minimum, Transformation)),
            //    Common.Math.ToVector3(Vector3.Transform(LocalBoundingBox.Maximum, Transformation)));


            //Vector3 t1 = Common.Math.ToVector3(Vector3.Transform(LocalBoundingBox.Minimum, Transformation));
            //Vector3 t2 = Common.Math.ToVector3(Vector3.Transform(LocalBoundingBox.Maximum, Transformation));
            //Vector3 p1 = Vector3.Minimize(t1, t2);
            //Vector3 p2 = Vector3.Maximize(t1, t2);
            return(new BoundingBox(min, max));
        }
コード例 #2
0
 internal override void Draw(SpriteBatch batch, Camera2D cam = null)
 {
     base.Draw(batch, cam);
     if (!visible)
     {
         return;
     }
     // Draw overlay
     if (DataHandler.isValid(overlay))
     {
         RectangleF rect = LocalBoundingBox.Inflate(-Width * border, -Height * border);
         if (cam == null)
         {
             batch.Draw(DataHandler.getTexture(overlay.RefKey) /*Texture2D from file*/, cam == null ? rect.ToRectangle() : cam.Transform(rect).ToRectangle() /*on-screen box*/, DataHandler.getTextureSource(overlay) /*Rectange on the sheet*/, Color.White /*white=no tint*/);
         }
         else if (cam.isInsideView(rect))
         {
             RectangleF nocrop;
             RectangleF cropped = cam.TransformWithCropping(rect, out nocrop);
             RectangleF source  = DataHandler.getTextureSource(overlay);
             source = source.Mask(nocrop, cropped);
             batch.Draw(DataHandler.getTexture(overlay.RefKey) /*Texture2D from file*/, cropped.Offset(parent.GlobalPosition).ToRectangle() /*on-screen box*/, source.ToRectangle() /*Rectange on the sheet*/, Color.White /*white=no tint*/);
         }
     }
     // Siblings
     foreach (UIVisibleObject obj in siblings.Where(t => t is UIVisibleObject))
     {
         obj.Draw(batch, cam);
     }
     // Children
     foreach (UIVisibleObject obj in children.Where(t => t is UIVisibleObject))
     {
         obj.Draw(batch, cam);
     }
     // Draw text
     if (text != "" && text != "\0")
     {
         Vector2 tsize = font.MeasureString(text);
         if (cam == null || cam.isInsideView(LocalCenter))
         {
             batch.DrawString(font, text, GlobalCenter - tsize / 2 - cam.ActualView.Location, color);
         }
     }
 }
コード例 #3
0
        public PhysSceneNode(Scene scene, PhysAggregateData phys)
            : base(scene)
        {
            this.phys = phys;

            var verts = new List <float>();
            var inds  = new List <int>();

            var bindPose = phys.Data.GetArray("m_bindPose")
                           .Select(v => Matrix4x4FromArray(v
                                                           .Select(m => Convert.ToSingle(m.Value))
                                                           .ToArray()))
                           .ToArray();

            if (bindPose.Length == 0)
            {
                bindPose = new Matrix4x4[] { Matrix4x4.Identity };
            }
            //m_boneParents

            bool firstBbox = true;

            var parts = phys.Data.GetArray("m_parts");

            for (int p = 0; p < parts.Length; p++)
            {
                var shape = parts[p].GetSubCollection("m_rnShape");

                var spheres = shape.GetArray("m_spheres");
                foreach (var s in spheres)
                {
                    var sphere = s.GetSubCollection("m_Sphere");
                    var center = sphere.GetSubCollection("m_vCenter").ToVector3();
                    var radius = sphere.GetFloatProperty("m_flRadius");

                    if (bindPose.Any())
                    {
                        center = Vector3.Transform(center, bindPose[p]);
                    }

                    AddSphere(verts, inds, center, radius);

                    AABB bbox = new AABB(center + new Vector3(radius),
                                         center - new Vector3(radius));
                    LocalBoundingBox = firstBbox ? bbox : LocalBoundingBox.Union(bbox);
                    firstBbox        = false;
                }

                var capsules = shape.GetArray("m_capsules");
                foreach (var c in capsules)
                {
                    var capsule = c.GetSubCollection("m_Capsule");
                    var center  = capsule.GetArray("m_vCenter").Select(v => v.ToVector3()).ToArray();
                    var radius  = capsule.GetFloatProperty("m_flRadius");

                    center[0] = Vector3.Transform(center[0], bindPose[p]);
                    center[1] = Vector3.Transform(center[1], bindPose[p]);

                    AddCapsule(verts, inds, center[0], center[1], radius);
                    foreach (var cn in center)
                    {
                        AABB bbox = new AABB(cn + new Vector3(radius),
                                             cn - new Vector3(radius));
                        LocalBoundingBox = firstBbox ? bbox : LocalBoundingBox.Union(bbox);
                        firstBbox        = false;
                    }
                }
                var hulls = shape.GetArray("m_hulls");
                foreach (var h in hulls)
                {
                    var hull = h.GetSubCollection("m_Hull");
                    //m_vCentroid
                    //m_flMaxAngularRadius
                    //m_Vertices
                    var vertices   = hull.GetArray("m_Vertices");
                    var vertOffset = verts.Count / 7;
                    foreach (var v in vertices)
                    {
                        var vec = v.ToVector3();
                        if (bindPose.Any())
                        {
                            vec = Vector3.Transform(vec, bindPose[p]);
                        }
                        verts.Add(vec.X);
                        verts.Add(vec.Y);
                        verts.Add(vec.Z);
                        //color red
                        verts.Add(1);
                        verts.Add(0);
                        verts.Add(0);
                        verts.Add(1);
                    }
                    //m_Planes
                    var edges = hull.GetArray("m_Edges");
                    foreach (var e in edges)
                    {
                        inds.Add((int)(vertOffset + e.GetIntegerProperty("m_nOrigin")));
                        var next = edges[e.GetIntegerProperty("m_nNext")];
                        inds.Add((int)(vertOffset + next.GetIntegerProperty("m_nOrigin")));
                    }
                    //m_Faces
                    var  bounds = hull.GetSubCollection("m_Bounds");
                    AABB bbox   = new AABB(bounds.GetSubCollection("m_vMinBounds").ToVector3(),
                                           bounds.GetSubCollection("m_vMaxBounds").ToVector3());

                    LocalBoundingBox = firstBbox ? bbox : LocalBoundingBox.Union(bbox);
                    firstBbox        = false;
                }
                var meshes = shape.GetArray("m_meshes");
                foreach (var m in meshes)
                {
                    var mesh = m.GetSubCollection("m_Mesh");
                    //m_Nodes

                    var       vertOffset = verts.Count / 7;
                    Vector3[] vertices   = null;
                    if (mesh is NTROStruct)
                    {
                        //NTRO has vertices as array of structs
                        var verticesArr = mesh.GetArray("m_Vertices");
                        vertices = verticesArr.Select(v => v.ToVector3()).ToArray();
                    }
                    else
                    {
                        //KV3 has vertices as blob
                        var verticesBlob = mesh.GetArray <byte>("m_Vertices");
                        vertices = Enumerable.Range(0, verticesBlob.Length / 12)
                                   .Select(i => new Vector3(BitConverter.ToSingle(verticesBlob, i * 12),
                                                            BitConverter.ToSingle(verticesBlob, (i * 12) + 4),
                                                            BitConverter.ToSingle(verticesBlob, (i * 12) + 8)))
                                   .ToArray();
                    }

                    foreach (var vec in vertices)
                    {
                        var v = vec;
                        if (bindPose.Any())
                        {
                            v = Vector3.Transform(vec, bindPose[p]);
                        }
                        verts.Add(v.X);
                        verts.Add(v.Y);
                        verts.Add(v.Z);
                        //color green
                        verts.Add(0);
                        verts.Add(1);
                        verts.Add(0);
                        verts.Add(1);
                    }

                    int[] triangles = null;
                    if (mesh is NTROStruct)
                    {
                        //NTRO and SOME KV3 has triangles as array of structs
                        var trianglesArr = mesh.GetArray("m_Triangles");
                        triangles = trianglesArr.SelectMany(t => t.GetArray <object>("m_nIndex").
                                                            Select(Convert.ToInt32)).ToArray();
                    }
                    else
                    {
                        //some KV3 has triangles as blob
                        var trianglesBlob = mesh.GetArray <byte>("m_Triangles");
                        triangles = new int[trianglesBlob.Length / 4];
                        System.Buffer.BlockCopy(trianglesBlob, 0, triangles, 0, trianglesBlob.Length);
                    }

                    for (int i = 0; i < triangles.Length; i += 3)
                    {
                        inds.Add(vertOffset + triangles[i]);
                        inds.Add(vertOffset + triangles[i + 1]);
                        inds.Add(vertOffset + triangles[i + 1]);
                        inds.Add(vertOffset + triangles[i + 2]);
                        inds.Add(vertOffset + triangles[i + 2]);
                        inds.Add(vertOffset + triangles[i]);
                    }

                    AABB bbox = new AABB(mesh.GetSubCollection("m_vMin").ToVector3(),
                                         mesh.GetSubCollection("m_vMax").ToVector3());
                    LocalBoundingBox = firstBbox ? bbox : LocalBoundingBox.Union(bbox);
                    firstBbox        = false;
                }
                //m_CollisionAttributeIndices

                //Console.WriteLine($"Phys mesh verts {verts.Count} inds {inds.Count}");
            }

            shader = Scene.GuiContext.ShaderLoader.LoadShader("vrf.grid", new Dictionary <string, bool>());
            GL.UseProgram(shader.Program);

            vaoHandle = GL.GenVertexArray();
            GL.BindVertexArray(vaoHandle);

            vboHandle = GL.GenBuffer();
            GL.BindBuffer(BufferTarget.ArrayBuffer, vboHandle);
            GL.BufferData(BufferTarget.ArrayBuffer, verts.Count * sizeof(float), verts.ToArray(), BufferUsageHint.StaticDraw);

            iboHandle  = GL.GenBuffer();
            indexCount = inds.Count;
            GL.BindBuffer(BufferTarget.ElementArrayBuffer, iboHandle);
            GL.BufferData(BufferTarget.ElementArrayBuffer, inds.Count * sizeof(int), inds.ToArray(), BufferUsageHint.StaticDraw);

            const int stride = sizeof(float) * 7;
            var       positionAttributeLocation = GL.GetAttribLocation(shader.Program, "aVertexPosition");

            GL.EnableVertexAttribArray(positionAttributeLocation);
            GL.VertexAttribPointer(positionAttributeLocation, 3, VertexAttribPointerType.Float, false, stride, 0);

            var colorAttributeLocation = GL.GetAttribLocation(shader.Program, "aVertexColor");

            GL.EnableVertexAttribArray(colorAttributeLocation);
            GL.VertexAttribPointer(colorAttributeLocation, 4, VertexAttribPointerType.Float, false, stride, sizeof(float) * 3);

            GL.BindVertexArray(0);
        }
コード例 #4
0
 public override string ToString()
 {
     return(this.GetType() + ":" + id + "\nLocal:" + LocalBoundingBox.ToString() + "\nGlobal:" + BoundingBox.ToString());
 }