static void DrawTriMeshMarker( Metal::DeviceContext& devContext, ParsingContext& parserContext, const VisGeoBox& visBox, const ResolvedShader& shader, const RetainedEntity& obj, EntityInterface::RetainedEntities& objs) { static auto IndexListHash = ParameterBox::MakeParameterNameHash("IndexList"); if (!obj._properties.GetParameter(Parameters::Visible, true) || !GetShowMarker(obj)) return; // we need an index list with at least 3 indices (to make at least one triangle) auto indexListType = obj._properties.GetParameterType(IndexListHash); if (indexListType._type == ImpliedTyping::TypeCat::Void || indexListType._arrayCount < 3) return; auto ibData = std::make_unique<unsigned[]>(indexListType._arrayCount); bool success = obj._properties.GetParameter( IndexListHash, ibData.get(), ImpliedTyping::TypeDesc(ImpliedTyping::TypeCat::UInt32, indexListType._arrayCount)); if (!success) return; const auto& chld = obj._children; if (!chld.size()) return; auto vbData = std::make_unique<Float3[]>(chld.size()); for (size_t c=0; c<chld.size(); ++c) { const auto* e = objs.GetEntity(obj._doc, chld[c]); if (e) { vbData[c] = ExtractTranslation(GetTransform(*e)); } else { vbData[c] = Zero<Float3>(); } } const auto& cbLayout = ::Assets::GetAssetDep<Techniques::PredefinedCBLayout>( "game/xleres/BasicMaterialConstants.txt"); shader.Apply(devContext, parserContext, { MakeLocalTransformPacket( GetTransform(obj), ExtractTranslation(parserContext.GetProjectionDesc()._cameraToWorld)), cbLayout.BuildCBDataAsPkt(ParameterBox()) }); devContext.Bind(Techniques::CommonResources()._blendAdditive); devContext.Bind(Techniques::CommonResources()._dssReadOnly); devContext.Bind(Techniques::CommonResources()._cullDisable); Metal::VertexBuffer vb(vbData.get(), sizeof(Float3)*chld.size()); Metal::IndexBuffer ib(ibData.get(), sizeof(unsigned)*indexListType._arrayCount); devContext.Bind(MakeResourceList(vb), sizeof(Float3), 0); devContext.Bind(ib, Metal::NativeFormat::R32_UINT); devContext.Bind(Metal::Topology::TriangleList); devContext.DrawIndexed(indexListType._arrayCount); }
static void DrawObject( Metal::DeviceContext& devContext, ParsingContext& parserContext, const VisGeoBox& visBox, const ResolvedShader& shader, const RetainedEntity& obj) { if (!obj._properties.GetParameter(Parameters::Visible, true) || !GetShowMarker(obj)) return; const auto& cbLayout = ::Assets::GetAssetDep<Techniques::PredefinedCBLayout>( "game/xleres/BasicMaterialConstants.txt"); shader.Apply(devContext, parserContext, { MakeLocalTransformPacket( GetTransform(obj), ExtractTranslation(parserContext.GetProjectionDesc()._cameraToWorld)), cbLayout.BuildCBDataAsPkt(ParameterBox()) }); devContext.Bind(MakeResourceList(visBox._cubeVB), visBox._cubeVBStride, 0); devContext.Draw(visBox._cubeVBCount); }