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; }
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; }
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; } }
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); }
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); }
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); }
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); }