private static void RecordMeshPartCommands(MeshId model, LodMeshId lodModelId, MyRenderableComponent rendercomp, MyRenderLod renderLod, MyOutlineDesc desc, ref float maxThickness) { OutlineConstantsLayout constants = new OutlineConstantsLayout(); var submeshCount = lodModelId.Info.PartsNum; for (int submeshIndex = 0; submeshIndex < submeshCount; ++submeshIndex) { var part = MyMeshes.GetMeshPart(model, rendercomp.CurrentLod, submeshIndex); maxThickness = Math.Max(desc.Thickness, maxThickness); constants.Color = desc.Color.ToVector4(); if (desc.PulseTimeInFrames > 0) { constants.Color.W *= (float)Math.Pow((float)Math.Cos(2.0 * Math.PI * (float)MyRender11.Settings.GameplayFrame / (float)desc.PulseTimeInFrames), 2.0); } var mapping = MyMapping.MapDiscard(MyCommon.OutlineConstants); mapping.WriteAndPosition(ref constants); mapping.Unmap(); RC.BindShaders(renderLod.HighlightShaders[submeshIndex]); MyOutlinePass.Instance.RecordCommands(renderLod.RenderableProxies[submeshIndex]); } }
internal void Merge(MyActor child) { var r = child.GetRenderable(); var model = r.GetModel(); var material = MyMeshes.GetMeshPart(model, 0, 0).Info.Material; bool fracture = model.Info.RuntimeGenerated || model.Info.Dynamic; if (MyMeshMaterials1.IsMergable(material) && MyBigMeshTable.Table.IsMergable(model) && !fracture) { var materialRk = MyMeshMaterials1.Table[material.Index].RepresentationKey; var mergeGroupForMaterial = m_materialGroups.Get(materialRk); if (mergeGroupForMaterial == null) { var proxyIndex = m_materialGroups.Count; mergeGroupForMaterial = new MyMaterialMergeGroup(MyBigMeshTable.Table, material, proxyIndex); m_materialGroups[MyMeshMaterials1.Table[material.Index].RepresentationKey] = mergeGroupForMaterial; m_dirtyProxy = true; } r.SetStandaloneRendering(false); child.GetGroupLeaf().m_mergeGroup = mergeGroupForMaterial; mergeGroupForMaterial.AddEntity(child, model); mergeGroupForMaterial.UpdateEntity(child); } }
internal void TurnIntoSeparateRenderables() { foreach (var child in m_children) { var r = child.GetRenderable(); var model = r.GetModel(); var material = MyMeshes.GetMeshPart(model, 0, 0).Info.Material; bool fracture = model.Info.RuntimeGenerated || model.Info.Dynamic; if (MyMeshMaterials1.IsMergable(material) && MyBigMeshTable.Table.IsMergable(model) && !fracture) { if (child.GetGroupLeaf().m_mergeGroup != null) { var materialRk = MyMeshMaterials1.Table[material.Index].RepresentationKey; var mergeGroupForMaterial = m_materialGroups.Get(materialRk); if (mergeGroupForMaterial == null) { continue; } r.SetStandaloneRendering(true); child.GetGroupLeaf().m_mergeGroup = null; mergeGroupForMaterial.RemoveEntity(child); } } } m_isMerged = false; }
internal static void CreateCloudLayer( uint ID, Vector3D centerPoint, double altitude, double minScaledAltitude, bool scalingEnabled, double fadeOutRelativeAltitudeStart, double fadeOutRelativeAltitudeEnd, float applyFogRelativeDistance, double maxPlanetHillRadius, string model, List <string> textures, Vector3D rotationAxis, float angularVelocity, float radiansAroundAxis) { MeshId mesh = MyMeshes.GetMeshId(X.TEXT(model)); MyCloudLayer.MyCloudTextureInfo textureInfo; if (textures != null && textures.Count > 0) // TODO: Multiple textures { var cmTexture = textures[0].Insert(textures[0].LastIndexOf('.'), "_cm"); var alphaTexture = textures[0].Insert(textures[0].LastIndexOf('.'), "_alphamask"); var normalGlossTexture = textures[0].Insert(textures[0].LastIndexOf('.'), "_ng"); textureInfo = new MyCloudLayer.MyCloudTextureInfo { ColorMetalTexture = MyTextures.GetTexture(cmTexture, MyTextureEnum.COLOR_METAL), AlphaTexture = MyTextures.GetTexture(alphaTexture, MyTextureEnum.ALPHAMASK), NormalGlossTexture = MyTextures.GetTexture(normalGlossTexture, MyTextureEnum.NORMALMAP_GLOSS), }; } else { textureInfo = new MyCloudLayer.MyCloudTextureInfo { ColorMetalTexture = MyTextures.GetTexture(MyMeshes.GetMeshPart(mesh, 0, 0).Info.Material.Info.ColorMetal_Texture.ToString(), MyTextureEnum.COLOR_METAL), AlphaTexture = MyTextures.GetTexture(MyMeshes.GetMeshPart(mesh, 0, 0).Info.Material.Info.Alphamask_Texture.ToString(), MyTextureEnum.ALPHAMASK), NormalGlossTexture = MyTextures.GetTexture(MyMeshes.GetMeshPart(mesh, 0, 0).Info.Material.Info.NormalGloss_Texture.ToString(), MyTextureEnum.NORMALMAP_GLOSS), } }; m_cloudLayers.Add(ID, new MyCloudLayer { CenterPoint = centerPoint, Altitude = altitude, MinScaledAltitude = minScaledAltitude, ScalingEnabled = scalingEnabled, FadeOutRelativeAltitudeStart = fadeOutRelativeAltitudeStart, FadeOutRelativeAltitudeEnd = fadeOutRelativeAltitudeEnd, ApplyFogRelativeDistance = applyFogRelativeDistance, MaxPlanetHillRadius = maxPlanetHillRadius, Mesh = mesh, TextureInfo = textureInfo, RotationAxis = rotationAxis, AngularVelocity = angularVelocity, }); m_modifiableCloudLayerData.Add(ID, new MyModifiableCloudLayerData { RadiansAroundAxis = radiansAroundAxis, LastGameplayFrameUpdate = MyRender11.Settings.GameplayFrame }); }
static void RecordMeshPartCommands(MeshId model, LodMeshId lodModelId, MyRenderableComponent rendercomp, MyRenderLod renderLod, MyHighlightDesc desc) { WriteHighlightConstants(ref desc); var submeshCount = lodModelId.Info.PartsNum; for (int submeshIndex = 0; submeshIndex < submeshCount; ++submeshIndex) { var part = MyMeshes.GetMeshPart(model, rendercomp.CurrentLod, submeshIndex); MyRenderUtils.BindShaderBundle(RC, renderLod.RenderableProxies[submeshIndex].HighlightShaders); MyHighlightPass.Instance.RecordCommands(renderLod.RenderableProxies[submeshIndex], -1, desc.InstanceId); } }
private static void RecordMeshPartCommands(MeshId model, LodMeshId lodModelId, MyRenderableComponent rendercomp, MyRenderLod renderLod, MyOutlineDesc desc, ref OutlineConstantsLayout constants, ref float maxThickness) { var submeshCount = lodModelId.Info.PartsNum; for (int submeshIndex = 0; submeshIndex < submeshCount; ++submeshIndex) { var part = MyMeshes.GetMeshPart(model, rendercomp.CurrentLod, submeshIndex); maxThickness = Math.Max(desc.Thickness, maxThickness); constants.Color = desc.Color.ToVector4(); var mapping = MyMapping.MapDiscard(MyCommon.OutlineConstants); mapping.WriteAndPosition(ref constants); mapping.Unmap(); RC.BindShaders(renderLod.HighlightShaders[submeshIndex]); MyOutlinePass.Instance.RecordCommands(renderLod.RenderableProxies[submeshIndex]); } }
internal void Add(MyActor child) { child.AddComponent(MyComponentFactory <MyGroupLeafComponent> .Create()); child.GetGroupLeaf().m_parent = m_owner; m_children.Add(child); if (child.m_relativeTransform == null) { child.m_relativeTransform = (Matrix)(child.WorldMatrix * MatrixD.Invert(m_owner.WorldMatrix)); } if (!m_owner.m_localAabb.HasValue) { m_owner.m_localAabb = child.m_localAabb; } else { var localAabb = child.m_localAabb.Value; m_owner.m_localAabb = m_owner.m_localAabb.Value.Include(ref localAabb); } PropagateMatrixChange(child); if (child.GetRenderable() == null) { return; } //var mesh = child.GetRenderable().GetMesh(); var model = child.GetRenderable().GetModel(); var material = MyMeshes.GetMeshPart(model, 0, 0).Info.Material; bool fracture = model.Info.RuntimeGenerated || model.Info.Dynamic; if (MyMeshMaterials1.IsMergable(material) && MyBigMeshTable.Table.IsMergable(model) && !fracture) { child.GetGroupLeaf().m_mergable = true; MyBigMeshTable.Table.AddMesh(model); m_mergablesCounter++; if (!m_isMerged && m_mergablesCounter >= MERGE_THRESHOLD) { TurnIntoMergeInstancing(); } else if (m_isMerged) { Merge(child); } //var materialRk = MyMeshMaterials1.Table[material.Index].RepresentationKey; //var mergeGroupForMaterial = m_materialGroups.Get(materialRk); //if (mergeGroupForMaterial == null) //{ // var proxyIndex = m_materialGroups.Count; // mergeGroupForMaterial = new MyMaterialMergeGroup(MyBigMeshTable.Table, material, proxyIndex); // m_materialGroups[MyMeshMaterials1.Table[material.Index].RepresentationKey] = mergeGroupForMaterial; // m_dirtyProxy = true; //} //child.GetRenderable().SetStandaloneRendering(false); //child.GetGroupLeaf().m_mergeGroup = mergeGroupForMaterial; //mergeGroupForMaterial.AddEntity(child, model); //mergeGroupForMaterial.UpdateEntity(child); } else { //Debug.WriteLine(String.Format("Mesh {0}, material {1} is not mergable", mesh.Name, material)); } m_dirtyTree = true; }
internal static void Run() { // set resolved depth/ stencil // render all shit with proper depth-stencil state // bluuuur // blend to main target testing with stencil again MyOutlinePass.Instance.ViewProjection = MyEnvironment.ViewProjectionAt0; MyOutlinePass.Instance.Viewport = new MyViewport(MyRender11.ViewportResolution.X, MyRender11.ViewportResolution.Y); MyOutlinePass.Instance.PerFrame(); MyOutlinePass.Instance.Begin(); RC.Clear(); RC.Context.VertexShader.SetShaderResources(0, null, null, null, null, null, null); RC.Context.GeometryShader.SetShaderResources(0, null, null, null, null, null, null); RC.Context.PixelShader.SetShaderResources(0, null, null, null, null, null, null); RC.Context.ComputeShader.SetShaderResources(0, null, null, null, null, null, null); if (MyRender11.MultisamplingEnabled) { RC.Context.ClearRenderTargetView(MyRender11.m_rgba8_ms.m_RTV, new SharpDX.Color4(0, 0, 0, 0)); RC.Context.OutputMerger.SetTargets(MyGBuffer.Main.DepthStencil.m_DSV, MyRender11.m_rgba8_ms.m_RTV); } else { RC.Context.ClearRenderTargetView(MyRender11.m_rgba8_1.m_RTV, new SharpDX.Color4(0, 0, 0, 0)); RC.Context.OutputMerger.SetTargets(MyGBuffer.Main.DepthStencil.m_DSV, MyRender11.m_rgba8_1.m_RTV); } OutlineConstantsLayout constants; foreach (var kv in m_outlines) { var r = MyIDTracker <MyActor> .FindByID(kv.Key).GetRenderable(); var renderLod = r.m_lods[r.m_lod]; var submeshes = MyMeshes.GetLodMesh(r.GetModel(), r.m_lod).Info.PartsNum; for (int i = 0; i < submeshes; i++) { var part = MyMeshes.GetMeshPart(r.GetModel(), r.m_lod, i); for (int j = 0; j < kv.Value.Count; ++j) { if (part.Info.Material.Info.Name == kv.Value[j].Material) { constants.Color = kv.Value[j].Color.ToVector4(); constants.WorldToVolume = kv.Value[j].WorldToVolume.HasValue ? kv.Value[j].WorldToVolume.Value : Matrix.Zero; var mapping = MyMapping.MapDiscard(MyCommon.OutlineConstants); mapping.stream.Write(constants); mapping.Unmap(); RC.BindShaders(renderLod.HighlightShaders[i]); MyOutlinePass.Instance.RecordCommands(renderLod.RenderableProxies[i]); } } } } MyOutlinePass.Instance.End(); RC.Context.OutputMerger.SetTargets(null as DepthStencilView, null as RenderTargetView); RC.SetBS(null); if (MyRender11.MultisamplingEnabled) { RC.Context.PixelShader.SetShaderResource(0, MyRender11.m_rgba8_ms.m_SRV); } else { RC.Context.PixelShader.SetShaderResource(0, MyRender11.m_rgba8_1.m_SRV); } RC.Context.OutputMerger.SetTargets(null as DepthStencilView, MyRender11.m_rgba8_2.m_RTV); RC.SetPS(m_blurH); MyScreenPass.DrawFullscreenQuad(); RC.Context.PixelShader.SetShaderResource(0, null); RC.Context.OutputMerger.SetTargets(null as DepthStencilView, MyRender11.m_rgba8_1.m_RTV); RC.Context.PixelShader.SetShaderResource(0, MyRender11.m_rgba8_2.m_SRV); RC.SetPS(m_blurV); MyScreenPass.DrawFullscreenQuad(); RC.Context.OutputMerger.SetTargets(null as DepthStencilView, null as RenderTargetView); RC.Context.PixelShader.SetShaderResource(0, null); }