Example #1
0
        uint? IMyDecalHandler.AddDecal(ref MyDecalRenderInfo data)
        {
            CheckEnabled();

            IReadOnlyList<MyDecalMaterial> materials;
            bool found = MyDecalMaterials.TryGetDecalMaterial(Source.String, data.Material.String, out materials);
            if (!found)
            {
                if (MyFakes.ENABLE_USE_DEFAULT_DAMAGE_DECAL)
                    found = MyDecalMaterials.TryGetDecalMaterial(DEFAULT, DEFAULT, out materials);

                if (!found)
                    return null;
            }

            int index = (int)Math.Round(MyRandom.Instance.NextFloat() * (materials.Count - 1));
            MyDecalMaterial material = materials[index];

            float rotation = material.Rotation;
            if (material.Rotation == float.PositiveInfinity)
                rotation = MyRandom.Instance.NextFloat() * MathHelper.TwoPi;

            var size = material.MinSize;
            if (material.MaxSize > material.MinSize)
                size += MyRandom.Instance.NextFloat() * (material.MaxSize - material.MinSize);

            MyDecalTopoData topoData = new MyDecalTopoData();
            topoData.Position = data.Position;
            topoData.Normal = data.Normal;
            topoData.Scale = new Vector3(size, size, material.Depth);
            topoData.Rotation = rotation;

            string sourceTarget = MyDecalMaterials.GetStringId(Source, data.Material);
            return MyRenderProxy.CreateDecal(data.RenderObjectId, ref topoData, data.Flags, sourceTarget, material.StringId, index);
        }
        void IMyDecalProxy.AddDecals(MyHitInfo hitInfo, MyStringHash source, object customdata, IMyDecalHandler decalHandler)
        {
            Debug.Assert(m_mapIdToBlock.Count > 0);
            MyCubeGridHitInfo            gridHitInfo      = customdata as MyCubeGridHitInfo;
            MySlimBlock                  block            = m_mapIdToBlock.First().Value;
            MyPhysicalMaterialDefinition physicalMaterial = block.BlockDefinition.PhysicalMaterial;
            MyDecalRenderInfo            renderable       = new MyDecalRenderInfo();

            renderable.Flags          = physicalMaterial.Transparent ? MyDecalFlags.Transparent : MyDecalFlags.None;
            renderable.Position       = Vector3D.Transform(hitInfo.Position, CubeGrid.PositionComp.WorldMatrixInvScaled);
            renderable.Normal         = Vector3D.TransformNormal(hitInfo.Normal, CubeGrid.PositionComp.WorldMatrixInvScaled);
            renderable.RenderObjectId = CubeGrid.Render.GetRenderObjectID();
            renderable.Material       = MyStringHash.GetOrCompute(physicalMaterial.Id.SubtypeName);

            if (gridHitInfo != null)
            {
                VertexBoneIndicesWeights?boneIndicesWeights = gridHitInfo.Triangle.GetAffectingBoneIndicesWeights(ref m_boneIndexWeightTmp);
                if (boneIndicesWeights.HasValue)
                {
                    renderable.BoneIndices = boneIndicesWeights.Value.Indices;
                    renderable.BoneWeights = boneIndicesWeights.Value.Weights;

                    var decalId = decalHandler.AddDecal(ref renderable);
                    if (decalId != null)
                    {
                        CubeGrid.RenderData.AddDecal(Position, gridHitInfo, decalId.Value);
                    }

                    return;
                }
            }

            decalHandler.AddDecal(ref renderable);
        }
Example #3
0
 void IMyDecalProxy.AddDecals(ref MyHitInfo hitInfo, MyStringHash source, object customdata, IMyDecalHandler decalHandler, MyStringHash material)
 {
     MyCubeGrid.MyCubeGridHitInfo gridHitInfo = customdata as MyCubeGrid.MyCubeGridHitInfo;
     if (gridHitInfo != null)
     {
         MyPhysicalMaterialDefinition physicalMaterial = this.m_mapIdToBlock.First <KeyValuePair <ushort, MySlimBlock> >().Value.BlockDefinition.PhysicalMaterial;
         MyDecalRenderInfo            renderInfo       = new MyDecalRenderInfo {
             Position        = Vector3D.Transform(hitInfo.Position, base.CubeGrid.PositionComp.WorldMatrixInvScaled),
             Normal          = (Vector3)Vector3D.TransformNormal(hitInfo.Normal, base.CubeGrid.PositionComp.WorldMatrixInvScaled),
             RenderObjectIds = base.CubeGrid.Render.RenderObjectIDs,
             Source          = source
         };
         VertexBoneIndicesWeights?affectingBoneIndicesWeights = gridHitInfo.Triangle.GetAffectingBoneIndicesWeights(ref m_boneIndexWeightTmp);
         if (affectingBoneIndicesWeights != null)
         {
             renderInfo.BoneIndices = affectingBoneIndicesWeights.Value.Indices;
             renderInfo.BoneWeights = affectingBoneIndicesWeights.Value.Weights;
         }
         renderInfo.Material = (material.GetHashCode() != 0) ? material : MyStringHash.GetOrCompute(physicalMaterial.Id.SubtypeName);
         m_tmpIds.Clear();
         decalHandler.AddDecal(ref renderInfo, m_tmpIds);
         foreach (uint num in m_tmpIds)
         {
             base.CubeGrid.RenderData.AddDecal(base.Position, gridHitInfo, num);
         }
     }
 }
Example #4
0
        void IMyDecalProxy.AddDecals(MyHitInfo hitInfo, MyStringHash source, object customdata, IMyDecalHandler decalHandler)
        {
            MyDecalRenderInfo info = new MyDecalRenderInfo();

            info.Position       = hitInfo.Position;
            info.Normal         = hitInfo.Normal;
            info.RenderObjectId = -1;
            info.Flags          = MyDecalFlags.World;
            info.Material       = Physics.MaterialType;
            decalHandler.AddDecal(ref info);
        }
Example #5
0
        void IMyDecalProxy.AddDecals(MyHitInfo hitInfo, MyStringHash source, object customdata, IMyDecalHandler decalHandler)
        {
            MyDecalRenderInfo renderable = new MyDecalRenderInfo();

            renderable.Flags          = MyDecalFlags.World;
            renderable.Position       = hitInfo.Position;
            renderable.Normal         = hitInfo.Normal;
            renderable.RenderObjectId = Render.GetRenderObjectID();
            renderable.Material       = Physics.GetMaterialAt(hitInfo.Position);

            decalHandler.AddDecal(ref renderable);
        }
Example #6
0
        void IMyDecalProxy.AddDecals(ref MyHitInfo hitInfo, MyStringHash source, object customdata, IMyDecalHandler decalHandler, MyStringHash material)
        {
            MyDecalRenderInfo renderInfo = new MyDecalRenderInfo {
                Position        = hitInfo.Position,
                Normal          = hitInfo.Normal,
                RenderObjectIds = null,
                Flags           = MyDecalFlags.World,
                Source          = source
            };

            renderInfo.Material = (material.GetHashCode() != 0) ? material : base.Physics.MaterialType;
            decalHandler.AddDecal(ref renderInfo, null);
        }
        void IMyDecalProxy.AddDecals(MyHitInfo hitInfo, MyStringHash source, object customdata, IMyDecalHandler decalHandler)
        {
            Debug.Assert(m_mapIdToBlock.Count > 0);
            MySlimBlock block = m_mapIdToBlock.First().Value;
            MyPhysicalMaterialDefinition physicalMaterial = block.BlockDefinition.PhysicalMaterial;
            MyDecalRenderInfo            renderable       = new MyDecalRenderInfo();

            renderable.Flags          = physicalMaterial.Transparent ? MyDecalFlags.Transparent : MyDecalFlags.None;
            renderable.Position       = Vector3D.Transform(hitInfo.Position, CubeGrid.PositionComp.WorldMatrixInvScaled);
            renderable.Normal         = Vector3D.TransformNormal(hitInfo.Normal, CubeGrid.PositionComp.WorldMatrixInvScaled);
            renderable.RenderObjectId = CubeGrid.Render.GetRenderObjectID();
            renderable.Material       = MyStringHash.GetOrCompute(physicalMaterial.Id.SubtypeName);

            var decalId = decalHandler.AddDecal(ref renderable);

            if (decalId != null)
            {
                CubeGrid.RenderData.AddDecal(Position, decalId.Value);
            }
        }
Example #8
0
        uint?IMyDecalHandler.AddDecal(ref MyDecalRenderInfo data)
        {
            CheckEnabled();

            IReadOnlyList <MyDecalMaterial> materials;
            bool found = MyDecalMaterials.TryGetDecalMaterial(Source.String, data.Material.String, out materials);

            if (!found)
            {
                if (MyFakes.ENABLE_USE_DEFAULT_DAMAGE_DECAL)
                {
                    found = MyDecalMaterials.TryGetDecalMaterial(DEFAULT, DEFAULT, out materials);
                }

                if (!found)
                {
                    return(null);
                }
            }

            MyDecalBindingInfo binding;

            if (data.Binding == null)
            {
                binding                = new MyDecalBindingInfo();
                binding.Position       = data.Position;
                binding.Normal         = data.Normal;
                binding.Transformation = Matrix.Identity;
            }
            else
            {
                binding = data.Binding.Value;
            }

            int             index    = (int)Math.Round(MyRandom.Instance.NextFloat() * (materials.Count - 1));
            MyDecalMaterial material = materials[index];

            float rotation = material.Rotation;

            if (material.Rotation == float.PositiveInfinity)
            {
                rotation = MyRandom.Instance.NextFloat() * MathHelper.TwoPi;
            }

            var bindingPerp = Vector3.CalculatePerpendicularVector(binding.Normal);

            if (rotation != 0)
            {
                // Rotate around normal
                Quaternion q = Quaternion.CreateFromAxisAngle(binding.Normal, rotation);
                bindingPerp = new Vector3((new Quaternion(bindingPerp, 0) * q).ToVector4());
            }
            bindingPerp = Vector3.Normalize(bindingPerp);

            var size = material.MinSize;

            if (material.MaxSize > material.MinSize)
            {
                size += MyRandom.Instance.NextFloat() * (material.MaxSize - material.MinSize);
            }

            Vector3         scale    = new Vector3(size, size, material.Depth);
            MyDecalTopoData topoData = new MyDecalTopoData();

            Matrix  pos;
            Vector3 worldPosition;

            if (data.Flags.HasFlag(MyDecalFlags.World))
            {
                // Using tre translation component here would loose accuracy
                pos           = Matrix.CreateWorld(Vector3.Zero, binding.Normal, bindingPerp);
                worldPosition = data.Position;
            }
            else
            {
                pos           = Matrix.CreateWorld(binding.Position, binding.Normal, bindingPerp);
                worldPosition = Vector3.Invalid; // Set in the render thread
            }

            topoData.MatrixBinding = Matrix.CreateScale(scale) * pos;
            topoData.WorldPosition = worldPosition;
            topoData.MatrixCurrent = binding.Transformation * topoData.MatrixBinding;
            topoData.BoneIndices   = data.BoneIndices;
            topoData.BoneWeights   = data.BoneWeights;

            string sourceTarget = MyDecalMaterials.GetStringId(Source, data.Material);

            return(MyRenderProxy.CreateDecal(data.RenderObjectId, ref topoData, data.Flags, sourceTarget, material.StringId, index));
        }