private static void UpdateDecalPositions(InstancingId id, List <MyCubeInstanceData> instanceData, List <MyCubeInstanceDecalData> decals) { m_tmpDecalsUpdate.Clear(); for (int it1 = 0; it1 < decals.Count; it1++) { MyCubeInstanceDecalData decal = decals[it1]; MyCubeInstanceData cubeData = instanceData[decal.InstanceIndex]; if (!cubeData.EnableSkinning) { break; } MyDecalTopoData decalTopo; bool found = MyScreenDecals.GetDecalTopoData(decal.DecalId, out decalTopo); if (!found) { continue; } Matrix localCubeMatrix; Matrix skinningMatrix = cubeData.ConstructDeformedCubeInstanceMatrix(ref decalTopo.BoneIndices, ref decalTopo.BoneWeights, out localCubeMatrix); Matrix localCubeMatrixInv; Matrix.Invert(ref localCubeMatrix, out localCubeMatrixInv); // TODO: Optimization: it would be cool if we keep original cube coordiates local intersection // and avoid matrix inversion here. Refer to MyCubeGrid.GetIntersectionWithLine(), MyCubeGridHitInfo Matrix invBinding = decalTopo.MatrixBinding * localCubeMatrixInv; Matrix transform = invBinding * skinningMatrix; m_tmpDecalsUpdate.Add(new MyDecalPositionUpdate() { ID = decal.DecalId, Transform = transform }); } MyScreenDecals.UpdateDecals(m_tmpDecalsUpdate); }
// TODO: this parameter won't be optional public void AddInstance(ModelId model, MatrixD matrix, ref MatrixD invGridWorldMatrix, Vector4 colorMaskHsv = default(Vector4), Vector3UByte[] bones = null, float gridSize = 1f) { Matrix localMatrix = (Matrix)(matrix * invGridWorldMatrix); MyBuilderInstanceData builderInstanceData; if (!m_instanceParts.TryGetValue(model, out builderInstanceData)) { builderInstanceData = new MyBuilderInstanceData(); builderInstanceData.Model = model; m_instanceParts.Add(model, builderInstanceData); } if (bones == null) { builderInstanceData.InstanceData.Add(new MyCubeInstanceData() { ColorMaskHSV = new Vector4(MyPlayer.SelectedColor, 0), EnableSkinning = false, LocalMatrix = localMatrix }); } else { var cubeInstance = new MyCubeInstanceData() { ColorMaskHSV = new Vector4(MyPlayer.SelectedColor, 0), EnableSkinning = true, LocalMatrix = localMatrix, }; cubeInstance.BoneRange = gridSize; for (int i = 0; i < 9; i++) { cubeInstance[i] = bones[i]; } builderInstanceData.InstanceData.Add(cubeInstance); } m_cubeBuilderAABB = m_cubeBuilderAABB.Include( new BoundingBox(new Vector3(-MyDefinitionManager.Static.GetCubeSize(MyCubeSize.Large)), new Vector3(MyDefinitionManager.Static.GetCubeSize(MyCubeSize.Large))).Transform(localMatrix)); }
/// <summary> /// Adds instance of the given model and returns its internal id which can be used for removing the instance. Local matrix specified will be changed to internal packed matrix. /// </summary> /// <param name="model"></param> /// <param name="localMatrix">Local transformation matrix. Changed to internal matrix.</param> /// <param name="colorMaskHsv"></param> public uint AddInstance(ModelId model, ref Matrix localMatrix, BoundingBox localAabb, Vector4 colorMaskHsv = default(Vector4)) { MyModelInstanceData builderInstanceData; if (!m_instanceParts.TryGetValue(model, out builderInstanceData)) { builderInstanceData = new MyModelInstanceData(m_instanceFlags, m_maxViewDistance); builderInstanceData.Model = model; m_instanceParts.Add(model, builderInstanceData); } uint instanceId = m_idCounter++; var instanceData = new MyCubeInstanceData() { ColorMaskHSV = colorMaskHsv, EnableSkinning = false, LocalMatrix = localMatrix }; instanceData.SetColorMaskHSV(colorMaskHsv); builderInstanceData.InstanceData.Add(instanceId, instanceData); // Matrix has been changed due to packing. localMatrix = builderInstanceData.InstanceData[instanceId].LocalMatrix; m_AABB = m_AABB.Include(localAabb.Transform(localMatrix)); return instanceId; }