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