Пример #1
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);
         }
     }
 }
Пример #2
0
        public void AddDecal(Vector3I position, MyCubeGrid.MyCubeGridHitInfo gridHitInfo, uint decalId)
        {
            MyCube cube;

            if (this.m_gridRender.CubeGrid.TryGetCube(position, out cube))
            {
                if (gridHitInfo.CubePartIndex != -1)
                {
                    MyCubePart part = cube.Parts[gridHitInfo.CubePartIndex];
                    this.GetOrAddCell(part.InstanceData.Translation, true).AddCubePartDecal(part, decalId);
                }
                ConcurrentQueue <MyDecalPartIdentity> orAdd = this.m_cubeDecals.GetOrAdd(position, x => new ConcurrentQueue <MyDecalPartIdentity>());
                if (orAdd.Count > 30)
                {
                    this.RemoveDecal(position, orAdd, cube);
                }
                MyDecalPartIdentity item = new MyDecalPartIdentity {
                    DecalId       = decalId,
                    CubePartIndex = gridHitInfo.CubePartIndex
                };
                orAdd.Enqueue(item);
            }
        }