Beispiel #1
0
        private void AddEdgeParts(Dictionary <MyInstanceBucket, Tuple <List <MyCubeInstanceMergedData>, Sandbox.Game.Entities.Cube.MyInstanceInfo> > instanceParts)
        {
            MyCubeInstanceData instance = new MyCubeInstanceData();

            instance.ResetBones();
            instance.SetTextureOffset(new Vector4UByte(0, 0, 1, 1));
            foreach (KeyValuePair <long, MyEdgeRenderData> pair in this.m_edgesToRender)
            {
                int            modelId  = pair.Value.ModelId;
                MyFourEdgeInfo edgeInfo = pair.Value.EdgeInfo;
                instance.PackedOrthoMatrix = edgeInfo.LocalOrthoMatrix;
                this.AddInstancePart(instanceParts, modelId, MyStringHash.NullOrEmpty, ref instance, null, 0, this.EdgeViewDistance);
            }
        }
        private void AddEdgeParts(Dictionary<ModelId, Tuple<List<MyCubeInstanceData>, 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;
                int 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;
                int 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)), MyStringId.Get(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, 0, EdgeViewDistance);
                }
            }
        }
        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);
                }
            }
        }