Exemple #1
0
 public bool AddPoint(OpenTK.Vector3d vec, double eps)
 {
     if (eps <= 0)
     {
         return(false);
     }
     if (IsntEmpty)
     {
         MinX = (MinX < vec.X - eps) ? MinX : vec.X - eps;
         MinY = (MinY < vec.Y - eps) ? MinY : vec.Y - eps;
         MinZ = (MinZ < vec.Z - eps) ? MinZ : vec.Z - eps;
         MaxX = (MaxX > vec.X + eps) ? MaxX : vec.X + eps;
         MaxY = (MaxY > vec.Y + eps) ? MaxY : vec.Y + eps;
         MaxZ = (MaxZ > vec.Z + eps) ? MaxZ : vec.Z + eps;
     }
     else
     {
         IsntEmpty = true;
         MinX      = vec.X - eps;
         MinY      = vec.Y - eps;
         MinZ      = vec.Z - eps;
         MaxX      = vec.X + eps;
         MaxY      = vec.Y + eps;
         MaxZ      = vec.Z + eps;
     }
     return(true);
 }
Exemple #2
0
        public static void SetModelViewTransform(Camera camera)
        {
            //System.Diagnostics.Debug.WriteLine("SetModelViewTransform");
            {
                // pan the object
                double x;
                double y;
                double z;
                camera.GetCenterPosition(out x, out y, out z);
                //System.Diagnostics.Debug.WriteLine("CenterPosition = " + x + ", " + y + ", " + z);

                GL.Translate(x, y, z);
            }
            {
                // rotate
                OpenTK.Matrix4d rot = camera.RotMatrix44();

                GL.MultMatrix(ref rot);
            }
            {
                // put the origin at the center of object
                double          x;
                double          y;
                double          z;
                OpenTK.Vector3d objCenter = camera.ObjectCenter;
                x = objCenter.X;
                y = objCenter.Y;
                z = objCenter.Z;
                //System.Diagnostics.Debug.WriteLine("objCenter = " + x + ", " + y + ", " + z);

                GL.Translate(-x, -y, -z);
            }
        }
Exemple #3
0
        public void calculDistanceFromCurrent()
        {
            EDSystem _oSys = EDDatas.Instance.getCurrentSystem();

            OpenTK.Vector3d o = new OpenTK.Vector3d(_oSys.x, _oSys.y, _oSys.z);
            OpenTK.Vector3d d = new OpenTK.Vector3d(x, y, z);
            m_distanceFromCurrentSystem = Math.Round(OpenTK.Vector3d.Distance(o, d), 2);
        }
Exemple #4
0
        private void MakeNormal()
        {
            uint ptCnt = VertexArray.PointCount;

            if (NormalArray == null)
            {
                NormalArray = new double[ptCnt * 3];
            }
            for (int i = 0; i < 3 * ptCnt; i++)
            {
                NormalArray[i] = 0;
            }
            for (int idp = 0; idp < DrawParts.Count; idp++)
            {
                FaceFieldDrawPart dp = DrawParts[idp];
                uint elemCnt         = dp.ElemCount;
                for (int iElem = 0; iElem < elemCnt; iElem++)
                {
                    uint[]          vertexs = dp.GetVertexs((uint)iElem);
                    OpenTK.Vector3d c0      = new OpenTK.Vector3d(
                        VertexArray.VertexCoordArray[vertexs[0] * 3],
                        VertexArray.VertexCoordArray[vertexs[0] * 3 + 1],
                        VertexArray.VertexCoordArray[vertexs[0] * 3 + 2]);
                    OpenTK.Vector3d c1 = new OpenTK.Vector3d(
                        VertexArray.VertexCoordArray[vertexs[1] * 3],
                        VertexArray.VertexCoordArray[vertexs[1] * 3 + 1],
                        VertexArray.VertexCoordArray[vertexs[1] * 3 + 2]);
                    OpenTK.Vector3d c2 = new OpenTK.Vector3d(
                        VertexArray.VertexCoordArray[vertexs[2] * 3],
                        VertexArray.VertexCoordArray[vertexs[2] * 3 + 1],
                        VertexArray.VertexCoordArray[vertexs[2] * 3 + 2]);
                    double[] n;
                    double   area;
                    CadUtils.UnitNormalAreaTri3D(out n, out area, c0, c1, c2);
                    NormalArray[vertexs[0] * 3 + 0] += n[0];
                    NormalArray[vertexs[0] * 3 + 1] += n[1];
                    NormalArray[vertexs[0] * 3 + 2] += n[2];
                    NormalArray[vertexs[1] * 3 + 0] += n[0];
                    NormalArray[vertexs[1] * 3 + 1] += n[1];
                    NormalArray[vertexs[1] * 3 + 2] += n[2];
                    NormalArray[vertexs[2] * 3 + 0] += n[0];
                    NormalArray[vertexs[2] * 3 + 1] += n[1];
                    NormalArray[vertexs[2] * 3 + 2] += n[2];
                }
            }
            for (int iPt = 0; iPt < ptCnt; iPt++)
            {
                double[] p = new double[3];
                p[0] = NormalArray[iPt * 3];
                p[1] = NormalArray[iPt * 3 + 1];
                p[2] = NormalArray[iPt * 3 + 2];
                double invLen = 1.0 / Math.Sqrt(p[0] * p[0] + p[1] * p[1] + p[2] * p[2]);
                NormalArray[0] *= invLen;
                NormalArray[1] *= invLen;
                NormalArray[2] *= invLen;
            }
        }
Exemple #5
0
        // ECEF: earth-centered, earth-fixed
        public void LocationEnuPositionTest()
        {
            // 52.341362, 4.912569
            var myposition = new OpenTK.Vector3d(52.341362, 4.912569, 0);
            var enu        = locationPK.EnuPosition(myposition);

            Assert.IsTrue(enu.X == 0.41312640806427225);
            Assert.IsTrue(enu.Y == -42.097533230204135);
            Assert.IsTrue(enu.Z == -6391527.4270682726);
        }
Exemple #6
0
        public static V3d Average(IEnumerable <V3d> vectors)
        {
            var average = new V3d(0, 0, 0);

            foreach (var v in vectors)
            {
                average += v;
            }
            return(average / vectors.Count());
        }
Exemple #7
0
 public void SetObjectBoundingBox(BoundingBox3D bb)
 {
     ObjectCenter = new OpenTK.Vector3d(
         ((bb.MinX + bb.MaxX) * 0.5),
         ((bb.MinY + bb.MaxY) * 0.5),
         ((bb.MinZ + bb.MaxZ) * 0.5)
         );
     ObjectW = bb.MaxX - bb.MinX;
     ObjectH = bb.MaxY - bb.MinY;
     ObjectD = bb.MaxZ - bb.MinZ;
 }
Exemple #8
0
 public bool IsInside(OpenTK.Vector3d vec)
 {
     if (!IsntEmpty)
     {
         return(false);
     }
     if (vec.X >= MinX && vec.X <= MaxX &&
         vec.Y >= MinY && vec.Y <= MaxY &&
         vec.Z >= MinZ && vec.Z <= MaxZ)
     {
         return(true);
     }
     return(false);
 }
Exemple #9
0
        public static void UnitNormalAreaTri3D(out double[] n, out double a,
                                               OpenTK.Vector3d v1, OpenTK.Vector3d v2, OpenTK.Vector3d v3)
        {
            n    = new double[3];
            n[0] = (v2.Y - v1.Y) * (v3.Z - v1.Z) - (v3.Y - v1.Y) * (v2.Z - v1.Z);
            n[1] = (v2.Z - v1.Z) * (v3.X - v1.X) - (v3.Z - v1.Z) * (v2.X - v1.X);
            n[2] = (v2.X - v1.X) * (v3.Y - v1.Y) - (v3.X - v1.X) * (v2.Y - v1.Y);
            a    = Math.Sqrt(n[0] * n[0] + n[1] * n[1] + n[2] * n[2]) * 0.5;
            double invA = 0.5 / a;

            n[0] *= invA;
            n[1] *= invA;
            n[2] *= invA;
        }
Exemple #10
0
 public bool IsPossibilityIntersectSphere(OpenTK.Vector3d vec, double radius)
 {
     if (!IsntEmpty)
     {
         return(false);
     }
     if (vec.X < MinX - radius || vec.X > MaxX + radius ||
         vec.Y < MinY - radius || vec.Y > MaxY + radius ||
         vec.Z < MinZ - radius || vec.Z > MaxZ + radius)
     {
         return(false);
     }
     // 干渉しないやつが含まれているが、アバウトなままでよい
     return(true);
 }
Exemple #11
0
 void LookAt(double eyeX,double eyeY,double eyeZ,double centerX,double centerY,double centerZ,double upX,double upY,double upZ)
 {
     OpenTK.Vector3d F = new OpenTK.Vector3d(centerX - eyeX, centerX - eyeY, centerZ - eyeZ);
     OpenTK.Vector3d UP = new OpenTK.Vector3d(upX, upY, upZ);
     F.Normalize();
     UP.Normalize();
     OpenTK.Vector3d s = new OpenTK.Vector3d(F.Y * UP.Z - F.Z * UP.Y,
                                             F.Z * UP.X - F.X * UP.Z,
                                             F.X * UP.Y - F.Y * UP.X);
     OpenTK.Vector3d u = new OpenTK.Vector3d(s.Y * F.Z - s.Z * F.Y,
                                             s.Z * F.X - s.X * F.Z,
                                             s.X * F.Y - s.Y * F.X);
     OpenTK.Matrix4d m = new OpenTK.Matrix4d(s.X, s.Y, s.Z, 0, u.X, u.Y, u.Z, 0, -F.X, -F.Y, -F.Z, 0, 0, 0, 0, 1);
     GL.MultMatrix(ref m);
     GL.Translate(-eyeX, -eyeY, -eyeZ);
 }
Exemple #12
0
 /// <summary>
 /// Z軸(001)を引数のベクトルvに回転させる行列を生成する
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public static M3d CreateRotationFromZ(V3d v)
 {
     v.Normalize();
     if (Math.Abs(v.Z - 1) < Th)
     {
         return(M3d.Identity);
     }
     else if (Math.Abs(v.Z + 1) < Th)
     {
         return(M3d.CreateRotationX(Math.PI));
     }
     else
     {
         return(M3d.CreateFromAxisAngle(V3d.Cross(v, Z), V3d.CalculateAngle(Z, v)));
     }
 }
Exemple #13
0
        /// <summary>
        /// Z軸(001)を引数のベクトルvに回転させる行列を生成する
        /// </summary>
        /// <param name="v"></param>
        /// <returns></returns>
        public static M3d CreateRotationToZ(V3d v)
        {
            M3d rot;

            v.Normalize();
            if (Math.Abs(v.Z - 1) < Th)
            {
                rot = M3d.Identity;
            }
            else if (Math.Abs(v.Z + 1) < Th)
            {
                rot = M3d.CreateRotationX(Math.PI);
            }
            else
            {
                rot = M3d.CreateFromAxisAngle(V3d.Cross(Z, v), V3d.CalculateAngle(Z, v));
            }
            return(rot);
        }
Exemple #14
0
        /// <summary>
        /// 平面上に分布する点集合が与えられたとき、その点集合が作る多角形の情報を返す
        /// 1. 頂点index (originから見て反時計回り)
        /// 2. 法線ベクトル
        /// 3. 中心座標
        /// </summary>
        /// <param name="points"></param>
        /// <returns></returns>
        public static (int[] Indices, V3d Center, V3d Norm) PolygonInfo(IEnumerable <V3d> points, V3d origin)
        {
            var center = new V3d(points.Average(p => p.X), points.Average(p => p.Y), points.Average(p => p.Z));
            var prm    = Geometriy.GetPlaneEquationFromPoints(points.Select(p => p.ToVector3DBase()));
            var norm   = new V3d(prm[0], prm[1], prm[2]);

            if (V3d.Dot(norm, (center - origin)) < 0)
            {
                norm = -norm;
            }

            //座標変換 (XY平面に投影)
            var rot = CreateRotationToZ(norm);

            var vXY = points.Select(p => p - center).Select(p => new V2d(rot.M11 * p.X + rot.M12 * p.Y + rot.M13 * p.Z, rot.M21 * p.X + rot.M22 * p.Y + rot.M23 * p.Z)).ToList();

            int i = vXY.FindIndex(p => p.LengthSquared == vXY.Max(q => q.LengthSquared));//原点から最も距離の遠い点を選ぶ

            //もう一つ点を選び、直線の方程式を産出
            List <int> iList = new List <int>(new[] { i });

            do
            {
                for (int j = 0; j < vXY.Count; j++)
                {
                    if (j != i)
                    {
                        var V = new V2d(vXY[j].Y - vXY[i].Y, vXY[i].X - vXY[j].X);
                        var c = vXY[j].X * vXY[i].Y - vXY[i].X * vXY[j].Y;

                        if (vXY.All(p => V2d.Dot(p, V) + c <= Th))
                        {
                            iList.Add(j);
                            i = j;
                            break;
                        }
                    }
                }
            } while (i != iList[0]);

            return(iList.ToArray(), center, norm);
        }
Exemple #15
0
 public void ProjectOnLine(out double minR, out double maxR, OpenTK.Vector3d org, OpenTK.Vector3d dir)
 {
     double[] d = new double[8]
     {
         OpenTK.Vector3d.Dot(dir, new OpenTK.Vector3d(MinX, MinY, MinZ) - org),
         OpenTK.Vector3d.Dot(dir, new OpenTK.Vector3d(MaxX, MinY, MinZ) - org),
         OpenTK.Vector3d.Dot(dir, new OpenTK.Vector3d(MinX, MaxY, MinZ) - org),
         OpenTK.Vector3d.Dot(dir, new OpenTK.Vector3d(MaxX, MaxY, MinZ) - org),
         OpenTK.Vector3d.Dot(dir, new OpenTK.Vector3d(MinX, MinY, MaxZ) - org),
         OpenTK.Vector3d.Dot(dir, new OpenTK.Vector3d(MaxX, MinY, MaxZ) - org),
         OpenTK.Vector3d.Dot(dir, new OpenTK.Vector3d(MinX, MaxY, MaxZ) - org),
         OpenTK.Vector3d.Dot(dir, new OpenTK.Vector3d(MaxX, MaxY, MaxZ) - org)
     };
     minR = d[0];
     maxR = d[0];
     for (uint i = 1; i < 8; i++)
     {
         minR = (d[i] < minR) ? d[i] : minR;
         maxR = (d[i] > maxR) ? d[i] : maxR;
     }
 }
 public void ClearActors()
 {
     Actors      = new List <ZActor>();
     CenterPoint = new OpenTK.Vector3d();
 }
Exemple #17
0
        private void WriteSceneCollision()
        {
            /* Fix scene header */
            Helpers.Overwrite32(ref SceneData, CmdCollisionOffset + 4, (uint)(0x02000000 | SceneData.Count));

            /* Determine collision's minimum/maximum coordinates... */
            OpenTK.Vector3d MinCoordinate = new OpenTK.Vector3d(0, 0, 0);
            OpenTK.Vector3d MaxCoordinate = new OpenTK.Vector3d(0, 0, 0);

            foreach (ObjFile.Vertex Vtx in ColModel.Vertices)
            {
                /* Minimum... */
                MinCoordinate.X = Math.Min(MinCoordinate.X, Vtx.X * Scale);
                MinCoordinate.Y = Math.Min(MinCoordinate.Y, Vtx.Y * Scale);
                MinCoordinate.Z = Math.Min(MinCoordinate.Z, Vtx.Z * Scale);

                /* Maximum... */
                MaxCoordinate.X = Math.Max(MaxCoordinate.X, Vtx.X * Scale);
                MaxCoordinate.Y = Math.Max(MaxCoordinate.Y, Vtx.Y * Scale);
                MaxCoordinate.Z = Math.Max(MaxCoordinate.Z, Vtx.Z * Scale);
            }

            /* Prepare variables */
            int CmdVertexArray = -1, CmdPolygonArray = -1, CmdPolygonTypes = -1, CmdWaterBoxes = -1;
            int VertexArrayOffset = -1, PolygonArrayOffset = -1, PolygonTypesOffset = -1, WaterBoxesOffset = -1;

            /* Write collision header */
            Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MinCoordinate.X));  /* Absolute minimum X/Y/Z */
            Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MinCoordinate.Y));
            Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MinCoordinate.Z));
            Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MaxCoordinate.X));  /* Absolute maximum X/Y/Z */
            Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MaxCoordinate.Y));
            Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MaxCoordinate.Z));
            CmdVertexArray = SceneData.Count;
            Helpers.Append32(ref SceneData, 0x00000000);                                /* Vertex count */
            Helpers.Append32(ref SceneData, 0x00000000);                                /* Vertex array offset */
            CmdPolygonArray = SceneData.Count;
            Helpers.Append32(ref SceneData, 0x00000000);                                /* Polygon count */
            Helpers.Append32(ref SceneData, 0x00000000);                                /* Polygon array offset */
            CmdPolygonTypes = SceneData.Count;
            Helpers.Append32(ref SceneData, 0x00000000);                                /* Polygon type offset */
            Helpers.Append32(ref SceneData, 0x00000000);                                /* Camera data offset (NULL) */
            CmdWaterBoxes = SceneData.Count;
            Helpers.Append32(ref SceneData, 0x00000000);                                /* Waterbox count */
            Helpers.Append32(ref SceneData, 0x00000000);                                /* Waterbox offset */

            AddPadding(ref SceneData, 8);

            /* Write vertex array & fix command */
            VertexArrayOffset = SceneData.Count;
            foreach (ObjFile.Vertex Vtx in ColModel.Vertices)
            {
                Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(Vtx.X * Scale));
                Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(Vtx.Y * Scale));
                Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(Vtx.Z * Scale));
            }
            Helpers.Overwrite32(ref SceneData, CmdVertexArray, (uint)(ColModel.Vertices.Count << 16));
            Helpers.Overwrite32(ref SceneData, CmdVertexArray + 4, (uint)(0x02000000 | VertexArrayOffset));

            AddPadding(ref SceneData, 8);

            /* Write polygon array & fix command */
            PolygonArrayOffset = SceneData.Count;
            int TriangleTotal = 0;

            foreach (ObjFile.Group Group in ColModel.Groups)
            {
                foreach (ObjFile.Triangle Tri in Group.Triangles)
                {
                    Helpers.Append16(ref SceneData, (ushort)Group.PolyType);    /* Polygon type */
                    Helpers.Append16(ref SceneData, (ushort)Tri.VertIndex[0]);  /* Index of vertex 1 */
                    Helpers.Append16(ref SceneData, (ushort)Tri.VertIndex[1]);  /* Index of vertex 2 */
                    Helpers.Append16(ref SceneData, (ushort)Tri.VertIndex[2]);  /* Index of vertex 3 */
                    Helpers.Append16(ref SceneData, 0x7FFF);                    /* Collision normals X/Y/Z */
                    Helpers.Append16(ref SceneData, 0x7FFF);
                    Helpers.Append16(ref SceneData, 0x7FFF);
                    Helpers.Append16(ref SceneData, 0x0000);                    /* Distance from origin */
                }
                TriangleTotal += Group.Triangles.Count;
            }
            Helpers.Overwrite32(ref SceneData, CmdPolygonArray, (uint)(TriangleTotal << 16));
            Helpers.Overwrite32(ref SceneData, CmdPolygonArray + 4, (uint)(0x02000000 | PolygonArrayOffset));

            FixCollision(ref SceneData, VertexArrayOffset, PolygonArrayOffset, TriangleTotal);

            AddPadding(ref SceneData, 8);

            /* Write polygon types & fix command */
            PolygonTypesOffset = SceneData.Count;
            foreach (ZColPolyType PT in PolyTypes)
            {
                Helpers.Append64(ref SceneData, PT.Raw);
            }
            Helpers.Overwrite32(ref SceneData, CmdPolygonTypes, (uint)(0x02000000 | PolygonTypesOffset));

            AddPadding(ref SceneData, 8);

            /* Write waterboxes & fix command */
            WaterBoxesOffset = SceneData.Count;
            foreach (ZWaterbox WBox in Waterboxes)
            {
                Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.XPos));
                Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.YPos));
                Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.ZPos));
                Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.XSize));
                Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.ZSize));
                Helpers.Append16(ref SceneData, 0x0000);
                Helpers.Append32(ref SceneData, WBox.Properties);
            }
            Helpers.Overwrite32(ref SceneData, CmdWaterBoxes, (uint)(Waterboxes.Count << 16));
            Helpers.Overwrite32(ref SceneData, CmdWaterBoxes + 4, (uint)(0x02000000 | WaterBoxesOffset));

            /* Padding for good measure */
            AddPadding(ref SceneData, 0x800);
        }
Exemple #18
0
        private void WriteSceneCollision()
        {
            /* Fix scene header */
            Helpers.Overwrite32(ref SceneData, CmdCollisionOffset + 4, (uint)(0x02000000 | SceneData.Count));

            /* Determine collision's minimum/maximum coordinates... */
            OpenTK.Vector3d MinCoordinate = new OpenTK.Vector3d(0, 0, 0);
            OpenTK.Vector3d MaxCoordinate = new OpenTK.Vector3d(0, 0, 0);

            foreach (ObjFile.Vertex Vtx in ColModel.Vertices)
            {
                /* Minimum... */
                MinCoordinate.X = Math.Min(MinCoordinate.X, Vtx.X * Scale);
                MinCoordinate.Y = Math.Min(MinCoordinate.Y, Vtx.Y * Scale);
                MinCoordinate.Z = Math.Min(MinCoordinate.Z, Vtx.Z * Scale);

                /* Maximum... */
                MaxCoordinate.X = Math.Max(MaxCoordinate.X, Vtx.X * Scale);
                MaxCoordinate.Y = Math.Max(MaxCoordinate.Y, Vtx.Y * Scale);
                MaxCoordinate.Z = Math.Max(MaxCoordinate.Z, Vtx.Z * Scale);
            }

            /* Prepare variables */
            int CmdVertexArray = -1, CmdPolygonArray = -1, CmdPolygonTypes = -1, CmdWaterBoxes = -1;
            int VertexArrayOffset = -1, PolygonArrayOffset = -1, PolygonTypesOffset = -1, WaterBoxesOffset = -1;

            /* Write collision header */
            Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MinCoordinate.X));  /* Absolute minimum X/Y/Z */
            Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MinCoordinate.Y));
            Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MinCoordinate.Z));
            Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MaxCoordinate.X));  /* Absolute maximum X/Y/Z */
            Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MaxCoordinate.Y));
            Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(MaxCoordinate.Z));
            CmdVertexArray = SceneData.Count;
            Helpers.Append32(ref SceneData, 0x00000000);                                /* Vertex count */
            Helpers.Append32(ref SceneData, 0x00000000);                                /* Vertex array offset */
            CmdPolygonArray = SceneData.Count;
            Helpers.Append32(ref SceneData, 0x00000000);                                /* Polygon count */
            Helpers.Append32(ref SceneData, 0x00000000);                                /* Polygon array offset */
            CmdPolygonTypes = SceneData.Count;
            Helpers.Append32(ref SceneData, 0x00000000);                                /* Polygon type offset */
            Helpers.Append32(ref SceneData, 0x00000000);                                /* Camera data offset (NULL) */
            CmdWaterBoxes = SceneData.Count;
            Helpers.Append32(ref SceneData, 0x00000000);                                /* Waterbox count */
            Helpers.Append32(ref SceneData, 0x00000000);                                /* Waterbox offset */

            AddPadding(ref SceneData, 8);

            /* Write vertex array & fix command */
            VertexArrayOffset = SceneData.Count;
            foreach (ObjFile.Vertex Vtx in ColModel.Vertices)
            {
                Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(Vtx.X * Scale));
                Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(Vtx.Y * Scale));
                Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(Vtx.Z * Scale));
            }
            Helpers.Overwrite32(ref SceneData, CmdVertexArray, (uint)(ColModel.Vertices.Count << 16));
            Helpers.Overwrite32(ref SceneData, CmdVertexArray + 4, (uint)(0x02000000 | VertexArrayOffset));

            AddPadding(ref SceneData, 8);

            /* Write polygon array & fix command */
            PolygonArrayOffset = SceneData.Count;
            int TriangleTotal = 0;
            foreach (ObjFile.Group Group in ColModel.Groups)
            {
                foreach (ObjFile.Triangle Tri in Group.Triangles)
                {
                    Helpers.Append16(ref SceneData, (ushort)Group.PolyType);    /* Polygon type */
                    Helpers.Append16(ref SceneData, (ushort)Tri.VertIndex[0]);  /* Index of vertex 1 */
                    Helpers.Append16(ref SceneData, (ushort)Tri.VertIndex[1]);  /* Index of vertex 2 */
                    Helpers.Append16(ref SceneData, (ushort)Tri.VertIndex[2]);  /* Index of vertex 3 */
                    Helpers.Append16(ref SceneData, 0x7FFF);                    /* Collision normals X/Y/Z */
                    Helpers.Append16(ref SceneData, 0x7FFF);
                    Helpers.Append16(ref SceneData, 0x7FFF);
                    Helpers.Append16(ref SceneData, 0x0000);                    /* Distance from origin */
                }
                TriangleTotal += Group.Triangles.Count;
            }
            Helpers.Overwrite32(ref SceneData, CmdPolygonArray, (uint)(TriangleTotal << 16));
            Helpers.Overwrite32(ref SceneData, CmdPolygonArray + 4, (uint)(0x02000000 | PolygonArrayOffset));

            FixCollision(ref SceneData, VertexArrayOffset, PolygonArrayOffset, TriangleTotal);

            AddPadding(ref SceneData, 8);

            /* Write polygon types & fix command */
            PolygonTypesOffset = SceneData.Count;
            foreach (ZColPolyType PT in PolyTypes)
                Helpers.Append64(ref SceneData, PT.Raw);
            Helpers.Overwrite32(ref SceneData, CmdPolygonTypes, (uint)(0x02000000 | PolygonTypesOffset));

            AddPadding(ref SceneData, 8);

            /* Write waterboxes & fix command */
            WaterBoxesOffset = SceneData.Count;
            foreach (ZWaterbox WBox in Waterboxes)
            {
                Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.XPos));
                Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.YPos));
                Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.ZPos));
                Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.XSize));
                Helpers.Append16(ref SceneData, (ushort)Convert.ToInt16(WBox.ZSize));
                Helpers.Append16(ref SceneData, 0x0000);
                Helpers.Append32(ref SceneData, WBox.Properties);
            }
            Helpers.Overwrite32(ref SceneData, CmdWaterBoxes, (uint)(Waterboxes.Count << 16));
            Helpers.Overwrite32(ref SceneData, CmdWaterBoxes + 4, (uint)(0x02000000 | WaterBoxesOffset));

            /* Padding for good measure */
            AddPadding(ref SceneData, 0x800);
        }
 public void ClearActors()
 {
     Actors = new List<ZActor>();
     CenterPoint = new OpenTK.Vector3d();
 }
Exemple #20
0
 /// <summary>
 /// 拡張メソッド.
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public static V3f ToV3f(this V3d v) => new V3f((float)v.X, (float)v.Y, (float)v.Z);
Exemple #21
0
 private static Vector3D Lerp(Vector3D v0, Vector3D v1, double t)
 {
     return((1 - t) * v0 + t * v1);
 }
Exemple #22
0
 /// <summary>
 /// 拡張メソッド.
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public static V4d ToV4d(this V3d v) => new V4d(v.X, v.Y, v.Z, 1);
Exemple #23
0
 public Coord(Vec3d pos, Quatd rot)
 {
     Position = pos;
     Rotation = rot;
 }
Exemple #24
0
 private static double GetMaxComponent(this Vector3D color)
 {
     return(Math.Max(color.X, Math.Max(color.Y, color.Z)));
 }
Exemple #25
0
 private static double GetPerceivedBrightness(this Vector3D color)
 {
     return(Math.Sqrt(0.299 * color.X * color.X + 0.587 * color.Y * color.Y + 0.114 * color.Z * color.Z));
 }
Exemple #26
0
 public void SetObjectCenter(double x, double y, double z)
 {
     ObjectCenter = new OpenTK.Vector3d(x, y, z);
 }
Exemple #27
0
 /// <summary>
 /// 拡張メソッド.
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public static V3d Mult(this M3d m, V3d v) => new V3d(
     m.M11 * v.X + m.M12 * v.Y + m.M13 * v.Z,
     m.M21 * v.X + m.M22 * v.Y + m.M23 * v.Z,
     m.M31 * v.X + m.M32 * v.Y + m.M33 * v.Z
     );
Exemple #28
0
 /// <summary>
 /// 拡張メソッド.
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public static Vector3DBase ToVector3DBase(this V3d v) => new Vector3DBase(v.X, v.Y, v.Z);
Exemple #29
0
 public Coord(Vec3d pos, Quatd rot)
 {
     Position = pos;
     Rotation = rot;
 }
Exemple #30
0
 private static Vector3D Clamp(Vector3D color)
 {
     return(new Vector3D(Clamp(color.X), Clamp(color.Y), Clamp(color.Z)));
 }