public MyEdgeInfo(ref Vector3 pos, ref Vector3I edgeDirection, ref Vector3 normal0, ref Vector3 normal1, ref VRageMath.Color color, MyStringHash edgeModel) { MyEdgeOrientationInfo info = MyCubeGridDefinitions.EdgeOrientations[edgeDirection]; this.PackedNormal0 = Base27Directions.GetDirection((Vector3)normal0); this.PackedNormal1 = Base27Directions.GetDirection((Vector3)normal1); this.m_packedColor = color; this.EdgeType = info.EdgeType; this.LocalOrthoMatrix = Vector4.PackOrthoMatrix(pos, info.Orientation.Forward, info.Orientation.Up); this.EdgeModel = edgeModel; }
public MyEdgeInfo(ref Vector3 pos, ref Vector3I edgeDirection, ref Vector3 normal0, ref Vector3 normal1, ref Color color, MyStringId edgeModel) { var info = MyCubeGridDefinitions.EdgeOrientations[edgeDirection]; Debug.Assert(info.EdgeType != MyCubeEdgeType.Hidden, "Hidden edge types are now allowed"); PackedNormal0 = Base27Directions.GetDirection(normal0); PackedNormal1 = Base27Directions.GetDirection(normal1); m_packedColor = color; EdgeType = info.EdgeType; LocalOrthoMatrix = Vector4.PackOrthoMatrix(pos, info.Orientation.Forward, info.Orientation.Up); EdgeModel = edgeModel; }
private bool IsEdgeVisible(MyFourEdgeInfo edgeInfo, out int modelId) { int[] numArray; modelId = 0; m_edgesToCompare.Clear(); if (edgeInfo.Full) { return(false); } for (int i = 0; i < 4; i++) { Color color; MyStringHash hash2; MyStringHash hash3; Base27Directions.Direction direction; Base27Directions.Direction direction2; if (edgeInfo.GetNormalInfo(i, out color, out hash3, out hash2, out direction, out direction2)) { EdgeInfoNormal item = new EdgeInfoNormal { Normal = Base27Directions.GetVector(direction), Color = color, SkinSubtypeId = hash3, EdgeModel = hash2 }; m_edgesToCompare.Add(item); item = new EdgeInfoNormal { Normal = Base27Directions.GetVector(direction2), Color = color, SkinSubtypeId = hash3, EdgeModel = hash2 }; m_edgesToCompare.Add(item); } } if (m_edgesToCompare.Count == 0) { return(false); } bool flag = m_edgesToCompare.Count == 4; MyStringHash edgeModel = m_edgesToCompare[0].EdgeModel; int index = 0; while (index < m_edgesToCompare.Count) { int num6 = index + 1; while (true) { if (num6 < m_edgesToCompare.Count) { if (!MyUtils.IsZero(m_edgesToCompare[index].Normal + m_edgesToCompare[num6].Normal, 0.1f)) { num6++; continue; } m_edgesToCompare.RemoveAt(num6); m_edgesToCompare.RemoveAt(index); index--; } index++; break; } } if (m_edgesToCompare.Count == 1) { return(false); } bool flag2 = false; bool flag3 = false; bool flag4 = false; if (m_edgesToCompare.Count > 0) { Color color = m_edgesToCompare[0].Color; MyStringHash skinSubtypeId = m_edgesToCompare[0].SkinSubtypeId; edgeModel = m_edgesToCompare[0].EdgeModel; for (int j = 1; j < m_edgesToCompare.Count; j++) { EdgeInfoNormal normal2 = m_edgesToCompare[j]; flag2 |= normal2.Color != color; flag4 |= normal2.SkinSubtypeId != skinSubtypeId; flag3 |= edgeModel != normal2.EdgeModel; if ((flag2 | flag3) | flag4) { break; } } } if (!((m_edgesToCompare.Count != 1) ? (!((flag2 | flag3) | flag4) ? ((m_edgesToCompare.Count <= 2) ? ((m_edgesToCompare.Count != 0) ? (Math.Abs(Vector3.Dot(m_edgesToCompare[0].Normal, m_edgesToCompare[1].Normal)) <= 0.85f) : flag) : true) : true) : false)) { return(false); } int edgeTypeCount = m_edgeTypeCount; if (!m_edgeModelIdCache.TryGetValue(edgeModel, out numArray)) { MyDefinitionId id = new MyDefinitionId(m_edgeDefinitionType, edgeModel); MyEdgesDefinition edgesDefinition = MyDefinitionManager.Static.GetEdgesDefinition(id); MyEdgesModelSet small = edgesDefinition.Small; MyEdgesModelSet large = edgesDefinition.Large; numArray = new int[m_edgeTypeCount * 2]; MyCubeEdgeType[] values = MyEnum <MyCubeEdgeType> .Values; int num8 = 0; while (true) { int num9; int num10; if (num8 >= values.Length) { m_edgeModelIdCache.Add(edgeModel, numArray); break; } MyCubeEdgeType type = values[num8]; switch (type) { case MyCubeEdgeType.Vertical: num9 = MyModel.GetId(small.Vertical); num10 = MyModel.GetId(large.Vertical); break; case MyCubeEdgeType.Vertical_Diagonal: num9 = MyModel.GetId(small.VerticalDiagonal); num10 = MyModel.GetId(large.VerticalDiagonal); break; case MyCubeEdgeType.Horizontal: num9 = MyModel.GetId(small.Horisontal); num10 = MyModel.GetId(large.Horisontal); break; case MyCubeEdgeType.Horizontal_Diagonal: num9 = MyModel.GetId(small.HorisontalDiagonal); num10 = MyModel.GetId(large.HorisontalDiagonal); break; case MyCubeEdgeType.Hidden: num9 = 0; num10 = 0; break; default: throw new Exception("Unhandled edge type"); } int num11 = (int)type; numArray[num11] = num9; numArray[num11 + edgeTypeCount] = num10; num8++; } } int edgeType = (int)edgeInfo.EdgeType; modelId = numArray[((this.m_gridRenderComponent.GridSizeEnum == MyCubeSize.Large) ? edgeTypeCount : 0) + edgeType]; return(true); }
private void AddEdgeParts(Dictionary <ModelId, Tuple <List <MyCubeInstanceMergedData>, MyInstanceInfo> > instanceParts) { // This can be optimized in same way as cube parts are m_edgesToCompare.Clear(); float reduceEpsilon = 0.1f; MyCubeInstanceData inst = new MyCubeInstanceData(); inst.ResetBones(); inst.SetTextureOffset(new Vector2(0, 0)); foreach (var edgeInfoPair in m_edgeInfosNew) { if (edgeInfoPair.Value.Full /* || edgeInfoPair.Value.Empty*/) { continue; } bool isVisible = false; m_edgesToCompare.Clear(); //Find opposite normals and remove them Color color; MyStringHash edgeModel; Base27Directions.Direction normal0, normal1; for (int i = 0; i < MyFourEdgeInfo.MaxInfoCount; i++) { if (edgeInfoPair.Value.GetNormalInfo(i, out color, out edgeModel, out normal0, out normal1)) { m_edgesToCompare.Add(new EdgeInfoNormal() { Normal = Base27Directions.GetVector(normal0), Color = color, EdgeModel = edgeModel }); m_edgesToCompare.Add(new EdgeInfoNormal() { Normal = Base27Directions.GetVector(normal1), Color = color, EdgeModel = edgeModel }); } } int c = 0; bool wasFour = m_edgesToCompare.Count == 4; var baseEdgeModel = m_edgesToCompare[0].EdgeModel; while (c < m_edgesToCompare.Count) { bool normalsRemoved = false; for (int c2 = c + 1; c2 < m_edgesToCompare.Count; c2++) { //opposite normals? if (MyUtils.IsZero(m_edgesToCompare[c].Normal + m_edgesToCompare[c2].Normal, reduceEpsilon)) { if (c > c2) { m_edgesToCompare.RemoveAt(c); m_edgesToCompare.RemoveAt(c2); } else { m_edgesToCompare.RemoveAt(c2); m_edgesToCompare.RemoveAt(c); } normalsRemoved = true; break; } } if (normalsRemoved) { continue; } c++; } Debug.Assert(m_edgesToCompare.Count != 1, "Alone edge with one normal cannot exist"); bool resultEdgesHaveDifferentColor = false; bool resultEdgesHaveDifferentArmorType = false; if (m_edgesToCompare.Count > 0) { Color baseColor = m_edgesToCompare[0].Color; foreach (var edge in m_edgesToCompare) { if (edge.Color != baseColor) { resultEdgesHaveDifferentColor = true; break; } } baseEdgeModel = m_edgesToCompare[0].EdgeModel; foreach (var edge in m_edgesToCompare) { resultEdgesHaveDifferentArmorType |= baseEdgeModel != edge.EdgeModel; } } if (m_edgesToCompare.Count == 1) { isVisible = false; } else if (resultEdgesHaveDifferentColor || resultEdgesHaveDifferentArmorType) { isVisible = true; } else if (m_edgesToCompare.Count > 2) { isVisible = true; } else if (m_edgesToCompare.Count == 0) { isVisible = wasFour; } else { Debug.Assert(m_edgesToCompare.Count == 2); //Check normals angle to get visibility float d = Vector3.Dot(m_edgesToCompare[0].Normal, m_edgesToCompare[1].Normal); Debug.Assert(d != -1, "We already removed opposite normals"); if (Math.Abs(d) > 0.85f) { //consider this without outline isVisible = false; } else { isVisible = true; } } if (isVisible) { var definition = MyDefinitionManager.Static.GetEdgesDefinition(new MyDefinitionId(new MyObjectBuilderType(typeof(MyObjectBuilder_EdgesDefinition)), baseEdgeModel)); var edgesSet = m_gridRenderComponent.GridSizeEnum == MyCubeSize.Large ? definition.Large : definition.Small; int modelId = 0; switch (edgeInfoPair.Value.EdgeType) { case MyCubeEdgeType.Horizontal: modelId = MyModel.GetId(edgesSet.Horisontal); break; case MyCubeEdgeType.Horizontal_Diagonal: modelId = MyModel.GetId(edgesSet.HorisontalDiagonal); break; case MyCubeEdgeType.Vertical: modelId = MyModel.GetId(edgesSet.Vertical); break; case MyCubeEdgeType.Vertical_Diagonal: modelId = MyModel.GetId(edgesSet.VerticalDiagonal); break; } //var modelId = resultEdgesHaveDifferentArmorType || baseHeavy ? // m_cubeHeavyEdgeModelIds[(int)Grid.GridSizeEnum][(int)edgeInfoPair.Value.EdgeType] : //m_cubeEdgeModelIds[(int)Grid.GridSizeEnum][(int)edgeInfoPair.Value.EdgeType]; inst.PackedOrthoMatrix = edgeInfoPair.Value.LocalOrthoMatrix; AddInstancePart(instanceParts, modelId, ref inst, null, 0, EdgeViewDistance); } } }