コード例 #1
0
        public GeometryMesh(MeshData meshData, Transform meshTransform, Matrix4x4 worldToVesselMatrix, GeometryPartModule module)
        {
            Vector3[] untransformedVerts = meshData.vertices;
            int[] triangles = meshData.triangles;
            Bounds meshBounds = meshData.bounds;

            vertices = new Vector3[untransformedVerts.Length];
            this.thisToVesselMatrix = worldToVesselMatrix * meshTransform.localToWorldMatrix;

            for (int i = 0; i < vertices.Length; i++)
            {
                //vertices[i] = thisToVesselMatrix.MultiplyPoint3x4(untransformedVerts[i]);
                Vector3 v = untransformedVerts[i];
                Vector3 vert = Vector3.zero;
                vert.x = thisToVesselMatrix.m00 * v.x + thisToVesselMatrix.m01 * v.y + thisToVesselMatrix.m02 * v.z + thisToVesselMatrix.m03;
                vert.y = thisToVesselMatrix.m10 * v.x + thisToVesselMatrix.m11 * v.y + thisToVesselMatrix.m12 * v.z + thisToVesselMatrix.m13;
                vert.z = thisToVesselMatrix.m20 * v.x + thisToVesselMatrix.m21 * v.y + thisToVesselMatrix.m22 * v.z + thisToVesselMatrix.m23;

                vertices[i] = vert;
            }

            this.triangles = triangles;
            this.meshTransform = meshTransform;

            bounds = TransformBounds(meshBounds, thisToVesselMatrix);

            this.module = module;
            this.part = module.part;

            if (!module.part.isMirrored)
                invertXYZ = 1;
            else
                invertXYZ = -1;
        }
コード例 #2
0
        public GeometryMesh(MeshData meshData, Transform meshTransform, Matrix4x4 worldToVesselMatrix, GeometryPartModule module)
        {
            this.meshLocalVerts = meshData.vertices;
            this.triangles = meshData.triangles;
            Bounds meshBounds = meshData.bounds;

            vertices = new Vector3[meshLocalVerts.Length];
            this.thisToVesselMatrix = worldToVesselMatrix * meshTransform.localToWorldMatrix;

            for (int i = 0; i < vertices.Length; i++)
            {
                //vertices[i] = thisToVesselMatrix.MultiplyPoint3x4(untransformedVerts[i]);
                Vector3 v = meshLocalVerts[i];
                Vector3 vert = Vector3.zero;
                vert.x = thisToVesselMatrix.m00 * v.x + thisToVesselMatrix.m01 * v.y + thisToVesselMatrix.m02 * v.z + thisToVesselMatrix.m03;
                vert.y = thisToVesselMatrix.m10 * v.x + thisToVesselMatrix.m11 * v.y + thisToVesselMatrix.m12 * v.z + thisToVesselMatrix.m13;
                vert.z = thisToVesselMatrix.m20 * v.x + thisToVesselMatrix.m21 * v.y + thisToVesselMatrix.m22 * v.z + thisToVesselMatrix.m23;

                float tmpTestVert = vert.x + vert.y + vert.z;
                if (float.IsNaN(tmpTestVert) || float.IsInfinity(tmpTestVert))
                    ThreadSafeDebugLogger.Instance.RegisterMessage("Mesh error in " + module.part.partInfo.title);
                vertices[i] = vert;
            }

            this.meshTransform = meshTransform;

            bounds = TransformBounds(meshBounds, thisToVesselMatrix);

            float tmpTestBounds = bounds.center.x + bounds.center.y + bounds.center.z +
                bounds.extents.x + bounds.extents.y + bounds.extents.z;
            if (float.IsNaN(tmpTestBounds) || float.IsInfinity(tmpTestBounds))
            {
                ThreadSafeDebugLogger.Instance.RegisterMessage("Bounds error in " + module.part.partInfo.title);
                valid = false;
            }
            else
                valid = true;

            this.module = module;
            this.part = module.part;
            
            if (!module.part.isMirrored)
                invertXYZ = 1;
            else
                invertXYZ = -1;
        }
コード例 #3
0
        public GeometryMesh(
            MeshData meshData,
            Transform meshTransform,
            Matrix4x4 worldToVesselMatrix,
            GeometryPartModule module
            )
        {
            meshLocalVerts = meshData.vertices;
            triangles      = meshData.triangles;
            isSkinned      = meshData.isSkinned;
            Bounds meshBounds = meshData.bounds;

            vertices           = new Vector3[meshLocalVerts.Length];
            this.meshTransform = meshTransform;
            UpdateLocalToWorldMatrix();
            thisToVesselMatrix = worldToVesselMatrix * meshLocalToWorld;

            for (int i = 0; i < vertices.Length; i++)
            {
                Vector3 v    = meshLocalVerts[i];
                Vector3 vert = Vector3.zero;
                vert.x = thisToVesselMatrix.m00 * v.x +
                         thisToVesselMatrix.m01 * v.y +
                         thisToVesselMatrix.m02 * v.z +
                         thisToVesselMatrix.m03;
                vert.y = thisToVesselMatrix.m10 * v.x +
                         thisToVesselMatrix.m11 * v.y +
                         thisToVesselMatrix.m12 * v.z +
                         thisToVesselMatrix.m13;
                vert.z = thisToVesselMatrix.m20 * v.x +
                         thisToVesselMatrix.m21 * v.y +
                         thisToVesselMatrix.m22 * v.z +
                         thisToVesselMatrix.m23;

                float tmpTestVert = vert.x + vert.y + vert.z;
                if (float.IsNaN(tmpTestVert) || float.IsInfinity(tmpTestVert))
                {
                    ThreadSafeDebugLogger.Instance.RegisterMessage("Mesh error in " + module.part.partInfo.title);
                }
                vertices[i] = vert;
            }

            gameObjectActiveInHierarchy = meshTransform.gameObject.activeInHierarchy;

            bounds = TransformBounds(meshBounds, thisToVesselMatrix);

            float tmpTestBounds = bounds.center.x +
                                  bounds.center.y +
                                  bounds.center.z +
                                  bounds.extents.x +
                                  bounds.extents.y +
                                  bounds.extents.z;

            if (float.IsNaN(tmpTestBounds) || float.IsInfinity(tmpTestBounds))
            {
                ThreadSafeDebugLogger.Instance.RegisterMessage("Bounds error in " + module.part.partInfo.title);
                valid = false;
            }
            else
            {
                valid = true;
            }

            this.module = module;
            part        = module.part;

            if (!module.part.isMirrored)
            {
                invertXYZ = 1;
            }
            else
            {
                invertXYZ = -1;
            }
        }
コード例 #4
0
        private List <MeshData> CreateMeshListFromTransforms(ref List <Transform> meshTransforms)
        {
            List <MeshData>  meshList           = new List <MeshData>();
            List <Transform> validTransformList = new List <Transform>();

            if (part.Modules.Contains <KerbalEVA>() || part.Modules.Contains <FlagSite>())
            {
                FARLogger.Info("Adding vox box to Kerbal / Flag");
                meshList.Add(CreateBoxMeshForKerbalEVA());
                validTransformList.Add(part.partTransform);
                meshTransforms = validTransformList;
                return(meshList);
            }

            Bounds rendererBounds = this.part.GetPartOverallMeshBoundsInBasis(part.partTransform.worldToLocalMatrix);
            Bounds colliderBounds = this.part.GetPartColliderBoundsInBasis(part.partTransform.worldToLocalMatrix);

            bool cantUseColliders = true;
            bool isFairing        = part.Modules.Contains <ModuleProceduralFairing>() || part.Modules.Contains("ProceduralFairingSide");
            bool isDrill          = part.Modules.Contains <ModuleAsteroidDrill>() || part.Modules.Contains <ModuleResourceHarvester>();

            //Voxelize colliders
            if ((forceUseColliders || isFairing || isDrill || (rendererBounds.size.x * rendererBounds.size.z < colliderBounds.size.x * colliderBounds.size.z * 1.6f && rendererBounds.size.y < colliderBounds.size.y * 1.2f && (rendererBounds.center - colliderBounds.center).magnitude < 0.3f)) && !forceUseMeshes)
            {
                foreach (Transform t in meshTransforms)
                {
                    MeshData md = GetColliderMeshData(t);
                    if (md == null)
                    {
                        continue;
                    }

                    meshList.Add(md);
                    validTransformList.Add(t);
                    cantUseColliders = false;
                }
            }


            if (part.Modules.Contains <ModuleJettison>())
            {
                List <ModuleJettison> jettisons          = part.Modules.GetModules <ModuleJettison>();
                HashSet <Transform>   jettisonTransforms = new HashSet <Transform>();
                for (int i = 0; i < jettisons.Count; i++)
                {
                    ModuleJettison j = jettisons[i];
                    if (j.jettisonTransform == null)
                    {
                        continue;
                    }

                    jettisonTransforms.Add(j.jettisonTransform);
                    if (j.isJettisoned)
                    {
                        continue;
                    }

                    Transform t = j.jettisonTransform;
                    if (t.gameObject.activeInHierarchy == false)
                    {
                        continue;
                    }

                    MeshData md = GetVisibleMeshData(t, false);
                    if (md == null)
                    {
                        continue;
                    }

                    meshList.Add(md);
                    validTransformList.Add(t);
                }

                //Voxelize Everything
                if ((cantUseColliders || forceUseMeshes || isFairing) && !isDrill)       //in this case, voxelize _everything_
                {
                    foreach (Transform t in meshTransforms)
                    {
                        if (jettisonTransforms.Contains(t))
                        {
                            continue;
                        }
                        MeshData md = GetVisibleMeshData(t, false);
                        if (md == null)
                        {
                            continue;
                        }

                        meshList.Add(md);
                        validTransformList.Add(t);
                    }
                }
            }
            else
            {
                //Voxelize Everything
                if ((cantUseColliders || forceUseMeshes || isFairing) && !isDrill)       //in this case, voxelize _everything_
                {
                    foreach (Transform t in meshTransforms)
                    {
                        MeshData md = GetVisibleMeshData(t, false);
                        if (md == null)
                        {
                            continue;
                        }

                        meshList.Add(md);
                        validTransformList.Add(t);
                    }
                }
            }
            meshTransforms = validTransformList;
            return(meshList);
        }
コード例 #5
0
        private List <MeshData> CreateMeshListFromTransforms(ref List <Transform> meshTransforms)
        {
            List <MeshData>  meshList           = new List <MeshData>();
            List <Transform> validTransformList = new List <Transform>();

            if (part.Modules.Contains("KerbalEVA"))
            {
                meshList.Add(CreateBoxMeshForKerbalEVA());
                validTransformList.Add(part.partTransform);
                meshTransforms = validTransformList;
                return(meshList);
            }

            Bounds rendererBounds = this.part.GetPartOverallMeshBoundsInBasis(part.partTransform.worldToLocalMatrix);
            Bounds colliderBounds = this.part.GetPartColliderBoundsInBasis(part.partTransform.worldToLocalMatrix);

            bool cantUseColliders = true;

            //Voxelize colliders
            if ((forceUseColliders || (rendererBounds.size.x * rendererBounds.size.z < colliderBounds.size.x * colliderBounds.size.z * 1.6f && rendererBounds.size.y < colliderBounds.size.y * 1.2f && (rendererBounds.center - colliderBounds.center).magnitude < 0.3f)) && !forceUseMeshes)
            {
                foreach (Transform t in meshTransforms)
                {
                    MeshData md = GetColliderMeshData(t);
                    if (md == null)
                    {
                        continue;
                    }

                    meshList.Add(md);
                    validTransformList.Add(t);
                    cantUseColliders = false;
                }
            }

            //Voxelize Everything
            if (cantUseColliders || forceUseMeshes)       //in this case, voxelize _everything_
            {
                foreach (Transform t in meshTransforms)
                {
                    MeshData md = GetVisibleMeshData(t, false);
                    if (md == null)
                    {
                        continue;
                    }

                    meshList.Add(md);
                    validTransformList.Add(t);
                }
            }

            if (part.Modules.Contains("ModuleJettison"))
            {
                ModuleJettison[] jettisons = part.GetComponents <ModuleJettison>();
                foreach (ModuleJettison j in jettisons)
                {
                    if (j.isJettisoned || j.jettisonTransform == null)
                    {
                        continue;
                    }

                    Transform t = j.jettisonTransform;
                    if (t.gameObject.activeInHierarchy == false)
                    {
                        continue;
                    }

                    MeshData md = GetVisibleMeshData(t, forceUseMeshes);
                    if (md == null)
                    {
                        continue;
                    }

                    meshList.Add(md);
                    validTransformList.Add(t);
                }
            }
            meshTransforms = validTransformList;
            return(meshList);
        }
コード例 #6
0
        private List <MeshData> CreateMeshListFromTransforms(ref List <Transform> meshTransforms)
        {
            DebugClear();
            var meshList           = new List <MeshData>();
            var validTransformList = new List <Transform>();

            if (part.Modules.Contains <KerbalEVA>() || part.Modules.Contains <FlagSite>())
            {
                FARLogger.Info("Adding vox box to Kerbal / Flag");
                meshList.Add(CreateBoxMeshForKerbalEVA());
                validTransformList.Add(part.partTransform);
                meshTransforms = validTransformList;
                return(meshList);
            }

            Matrix4x4 worldToLocalMatrix = part.partTransform.worldToLocalMatrix;
            Bounds    rendererBounds     = part.GetPartOverallMeshBoundsInBasis(worldToLocalMatrix);
            Bounds    colliderBounds     = part.GetPartColliderBoundsInBasis(worldToLocalMatrix);

            bool cantUseColliders = true;
            bool isFairing        = part.Modules.Contains <ModuleProceduralFairing>() ||
                                    part.Modules.Contains("ProceduralFairingSide");
            bool isDrill = part.Modules.Contains <ModuleAsteroidDrill>() ||
                           part.Modules.Contains <ModuleResourceHarvester>();

            //Voxelize colliders
            if ((forceUseColliders ||
                 isFairing ||
                 isDrill ||
                 rendererBounds.size.x * rendererBounds.size.z < colliderBounds.size.x * colliderBounds.size.z * 1.6f &&
                 rendererBounds.size.y < colliderBounds.size.y * 1.2f &&
                 (rendererBounds.center - colliderBounds.center).magnitude < 0.3f) &&
                !forceUseMeshes)
            {
                foreach (Transform t in meshTransforms)
                {
                    MeshData md = GetColliderMeshData(t);
                    if (md == null)
                    {
                        continue;
                    }

                    DebugAddCollider(t);
                    meshList.Add(md);
                    validTransformList.Add(t);
                    cantUseColliders = false;
                }
            }


            if (part.Modules.Contains <ModuleJettison>())
            {
                bool variants = part.Modules.Contains <ModulePartVariants>();
                List <ModuleJettison> jettisons = part.Modules.GetModules <ModuleJettison>();
                var jettisonTransforms          = new HashSet <string>();
                foreach (ModuleJettison j in jettisons)
                {
                    if (j.jettisonTransform == null)
                    {
                        continue;
                    }

                    if (variants)
                    {
                        // with part variants, jettison name is a comma separated list of transform names
                        foreach (string transformName in j.jettisonName.Split(','))
                        {
                            jettisonTransforms.Add(transformName);
                        }
                    }
                    else
                    {
                        jettisonTransforms.Add(j.jettisonTransform.name);
                    }
                    if (j.isJettisoned)
                    {
                        continue;
                    }

                    Transform t = j.jettisonTransform;
                    if (t.gameObject.activeInHierarchy == false)
                    {
                        continue;
                    }

                    MeshData md = GetVisibleMeshData(t, ignoreIfNoRenderer, false);
                    if (md == null)
                    {
                        continue;
                    }

                    DebugAddMesh(t);
                    meshList.Add(md);
                    validTransformList.Add(t);
                }

                //Voxelize Everything
                if ((cantUseColliders || forceUseMeshes || isFairing) && !isDrill)
                {
                    foreach (Transform t in meshTransforms)
                    {
                        if (jettisonTransforms.Contains(t.name))
                        {
                            continue;
                        }
                        MeshData md = GetVisibleMeshData(t, ignoreIfNoRenderer, false);
                        if (md == null)
                        {
                            continue;
                        }

                        DebugAddMesh(t);
                        meshList.Add(md);
                        validTransformList.Add(t);
                    }
                }
            }
            else
            {
                //Voxelize Everything
                if ((cantUseColliders || forceUseMeshes || isFairing) && !isDrill)
                {
                    foreach (Transform t in meshTransforms)
                    {
                        MeshData md = GetVisibleMeshData(t, ignoreIfNoRenderer, false);
                        if (md == null)
                        {
                            continue;
                        }

                        DebugAddMesh(t);
                        meshList.Add(md);
                        validTransformList.Add(t);
                    }
                }
            }

            DebugPrint();
            meshTransforms = validTransformList;
            return(meshList);
        }
コード例 #7
0
        private static MeshData CreateBoxMeshFromBoxCollider(Vector3 size, Vector3 center)
        {
            var Points = new List <Vector3>();
            var Verts  = new List <Vector3>();
            var Tris   = new List <int>();

            Vector3 extents = size * 0.5f;

            Points.Add(new Vector3(center.x - extents.x, center.y + extents.y, center.z - extents.z));
            Points.Add(new Vector3(center.x + extents.x, center.y + extents.y, center.z - extents.z));
            Points.Add(new Vector3(center.x + extents.x, center.y - extents.y, center.z - extents.z));
            Points.Add(new Vector3(center.x - extents.x, center.y - extents.y, center.z - extents.z));
            Points.Add(new Vector3(center.x + extents.x, center.y + extents.y, center.z + extents.z));
            Points.Add(new Vector3(center.x - extents.x, center.y + extents.y, center.z + extents.z));
            Points.Add(new Vector3(center.x - extents.x, center.y - extents.y, center.z + extents.z));
            Points.Add(new Vector3(center.x + extents.x, center.y - extents.y, center.z + extents.z));
            // Front plane
            Verts.Add(Points[0]);
            Verts.Add(Points[1]);
            Verts.Add(Points[2]);
            Verts.Add(Points[3]);
            // Back plane
            Verts.Add(Points[4]);
            Verts.Add(Points[5]);
            Verts.Add(Points[6]);
            Verts.Add(Points[7]);
            // Left plane
            Verts.Add(Points[5]);
            Verts.Add(Points[0]);
            Verts.Add(Points[3]);
            Verts.Add(Points[6]);
            // Right plane
            Verts.Add(Points[1]);
            Verts.Add(Points[4]);
            Verts.Add(Points[7]);
            Verts.Add(Points[2]);
            // Top plane
            Verts.Add(Points[5]);
            Verts.Add(Points[4]);
            Verts.Add(Points[1]);
            Verts.Add(Points[0]);
            // Bottom plane
            Verts.Add(Points[3]);
            Verts.Add(Points[2]);
            Verts.Add(Points[7]);
            Verts.Add(Points[6]);
            // Front Plane
            Tris.Add(0);
            Tris.Add(1);
            Tris.Add(2);
            Tris.Add(2);
            Tris.Add(3);
            Tris.Add(0);
            // Back Plane
            Tris.Add(4);
            Tris.Add(5);
            Tris.Add(6);
            Tris.Add(6);
            Tris.Add(7);
            Tris.Add(4);
            // Left Plane
            Tris.Add(8);
            Tris.Add(9);
            Tris.Add(10);
            Tris.Add(10);
            Tris.Add(11);
            Tris.Add(8);
            // Right Plane
            Tris.Add(12);
            Tris.Add(13);
            Tris.Add(14);
            Tris.Add(14);
            Tris.Add(15);
            Tris.Add(12);
            // Top Plane
            Tris.Add(16);
            Tris.Add(17);
            Tris.Add(18);
            Tris.Add(18);
            Tris.Add(19);
            Tris.Add(16);
            // Bottom Plane
            Tris.Add(20);
            Tris.Add(21);
            Tris.Add(22);
            Tris.Add(22);
            Tris.Add(23);
            Tris.Add(20);

            var mesh = new MeshData(Verts.ToArray(), Tris.ToArray(), new Bounds(center, size));

            return(mesh);
        }