From 25842949a93de5ed73035ab5951884e426213043 Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Tue, 17 Mar 2020 15:56:14 -0700 Subject: [PATCH 001/224] Initial MP2 fixes --- DataSpec/DNACommon/CMDL.cpp | 5 +- DataSpec/DNAMP1/CMDLMaterials.cpp | 716 +++++++++++++++++++----------- DataSpec/DNAMP2/CINF.cpp | 117 +++++ DataSpec/DNAMP2/CINF.hpp | 17 + DataSpec/DNAMP2/DNAMP2.cpp | 3 + DataSpec/DNAMP2/DeafBabe.cpp | 7 +- 6 files changed, 596 insertions(+), 269 deletions(-) diff --git a/DataSpec/DNACommon/CMDL.cpp b/DataSpec/DNACommon/CMDL.cpp index 394d437fe..b20cc4067 100644 --- a/DataSpec/DNACommon/CMDL.cpp +++ b/DataSpec/DNACommon/CMDL.cpp @@ -521,7 +521,10 @@ void FinishBlenderMesh(hecl::blender::PyOutStream& os, unsigned matSetCount, int " use_vert_dict = vert_dict[0]\n" " merge_verts = [use_vert_dict[fv[od_entry['bm'].verts.layers.int['CMDLOriginalPosIdxs']]] for fv in " "face.verts]\n" - " if bm.faces.get(merge_verts) is not None:\n" + " try:\n" + " if bm.faces.get(merge_verts) is not None:\n" + " continue\n" + " except:\n" " continue\n" " merge_face = bm.faces.new(merge_verts)\n" " for i in range(len(face.loops)):\n" diff --git a/DataSpec/DNAMP1/CMDLMaterials.cpp b/DataSpec/DNAMP1/CMDLMaterials.cpp index 1d7543c3f..61aac9a43 100644 --- a/DataSpec/DNAMP1/CMDLMaterials.cpp +++ b/DataSpec/DNAMP1/CMDLMaterials.cpp @@ -34,12 +34,11 @@ void Material::AddTexture(Stream& out, GX::TexGenSrc type, int mtxIdx, uint32_t else texLabel = "Texture"; - out.format(fmt( - "# Texture\n" - "tex_node = new_nodetree.nodes.new('ShaderNodeTexImage')\n" - "tex_node.label = '{} {}'\n" - "texture_nodes.append(tex_node)\n"), - texLabel, texIdx); + out.format(fmt("# Texture\n" + "tex_node = new_nodetree.nodes.new('ShaderNodeTexImage')\n" + "tex_node.label = '{} {}'\n" + "texture_nodes.append(tex_node)\n"), + texLabel, texIdx); if (texIdx != 0xff) out.format(fmt("tex_node.image = tex_maps[{}]\n"), texIdx); @@ -52,11 +51,10 @@ void Material::AddTexture(Stream& out, GX::TexGenSrc type, int mtxIdx, uint32_t "tex_links.append(new_nodetree.links.new(tex_uv_node.outputs['Normal'], tex_node.inputs['Vector']))\n"; else if (type >= GX::TG_TEX0 && type <= GX::TG_TEX7) { uint8_t texIdx = type - GX::TG_TEX0; - out.format(fmt( - "tex_uv_node = new_nodetree.nodes.new('ShaderNodeUVMap')\n" - "tex_links.append(new_nodetree.links.new(tex_uv_node.outputs['UV'], tex_node.inputs['Vector']))\n" - "tex_uv_node.uv_map = 'UV_{}'\n"), - texIdx); + out.format(fmt("tex_uv_node = new_nodetree.nodes.new('ShaderNodeUVMap')\n" + "tex_links.append(new_nodetree.links.new(tex_uv_node.outputs['UV'], tex_node.inputs['Vector']))\n" + "tex_uv_node.uv_map = 'UV_{}'\n"), + texIdx); } out.format(fmt("tex_uv_node.label = '{}'\n"), mtxLabel); @@ -72,171 +70,162 @@ void Material::AddTexture(Stream& out, GX::TexGenSrc type, int mtxIdx, uint32_t void Material::AddTextureAnim(Stream& out, UVAnimation::Mode type, unsigned idx, const float* vals) { switch (type) { case UVAnimation::Mode::MvInvNoTranslation: - out.format(fmt( - "for link in list(tex_links):\n" - " if link.from_node.label == 'MTX_{}':\n" - " tex_links.remove(link)\n" - " soc_from = link.from_socket\n" - " soc_to = link.to_socket\n" - " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" - " node.node_tree = bpy.data.node_groups['RetroUVMode0NodeN']\n" - " node.location[0] = link.from_node.location[0] + 50\n" - " node.location[1] = link.from_node.location[1] - 50\n" - " new_nodetree.links.remove(link)\n" - " new_nodetree.links.new(soc_from, node.inputs[0])\n" - " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), - idx); + out.format(fmt("for link in list(tex_links):\n" + " if link.from_node.label == 'MTX_{}':\n" + " tex_links.remove(link)\n" + " soc_from = link.from_socket\n" + " soc_to = link.to_socket\n" + " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" + " node.node_tree = bpy.data.node_groups['RetroUVMode0NodeN']\n" + " node.location[0] = link.from_node.location[0] + 50\n" + " node.location[1] = link.from_node.location[1] - 50\n" + " new_nodetree.links.remove(link)\n" + " new_nodetree.links.new(soc_from, node.inputs[0])\n" + " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), + idx); break; case UVAnimation::Mode::MvInv: - out.format(fmt( - "for link in list(tex_links):\n" - " if link.from_node.label == 'MTX_{}':\n" - " tex_links.remove(link)\n" - " soc_from = link.from_socket\n" - " soc_to = link.to_socket\n" - " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" - " node.node_tree = bpy.data.node_groups['RetroUVMode1NodeN']\n" - " node.location[0] = link.from_node.location[0] + 50\n" - " node.location[1] = link.from_node.location[1] - 50\n" - " new_nodetree.links.remove(link)\n" - " new_nodetree.links.new(soc_from, node.inputs[0])\n" - " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), - idx); + out.format(fmt("for link in list(tex_links):\n" + " if link.from_node.label == 'MTX_{}':\n" + " tex_links.remove(link)\n" + " soc_from = link.from_socket\n" + " soc_to = link.to_socket\n" + " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" + " node.node_tree = bpy.data.node_groups['RetroUVMode1NodeN']\n" + " node.location[0] = link.from_node.location[0] + 50\n" + " node.location[1] = link.from_node.location[1] - 50\n" + " new_nodetree.links.remove(link)\n" + " new_nodetree.links.new(soc_from, node.inputs[0])\n" + " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), + idx); break; case UVAnimation::Mode::Scroll: - out.format(fmt( - "for link in list(tex_links):\n" - " if link.from_node.label == 'MTX_{}':\n" - " tex_links.remove(link)\n" - " soc_from = link.from_socket\n" - " soc_to = link.to_socket\n" - " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" - " node.node_tree = bpy.data.node_groups['RetroUVMode2Node']\n" - " node.location[0] = link.from_node.location[0] + 50\n" - " node.location[1] = link.from_node.location[1] - 50\n" - " node.inputs[1].default_value = ({},{},0)\n" - " node.inputs[2].default_value = ({},{},0)\n" - " new_nodetree.links.remove(link)\n" - " new_nodetree.links.new(soc_from, node.inputs[0])\n" - " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), - idx, vals[0], vals[1], vals[2], vals[3]); + out.format(fmt("for link in list(tex_links):\n" + " if link.from_node.label == 'MTX_{}':\n" + " tex_links.remove(link)\n" + " soc_from = link.from_socket\n" + " soc_to = link.to_socket\n" + " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" + " node.node_tree = bpy.data.node_groups['RetroUVMode2Node']\n" + " node.location[0] = link.from_node.location[0] + 50\n" + " node.location[1] = link.from_node.location[1] - 50\n" + " node.inputs[1].default_value = ({},{},0)\n" + " node.inputs[2].default_value = ({},{},0)\n" + " new_nodetree.links.remove(link)\n" + " new_nodetree.links.new(soc_from, node.inputs[0])\n" + " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), + idx, vals[0], vals[1], vals[2], vals[3]); break; case UVAnimation::Mode::Rotation: - out.format(fmt( - "for link in list(tex_links):\n" - " if link.from_node.label == 'MTX_{}':\n" - " tex_links.remove(link)\n" - " soc_from = link.from_socket\n" - " soc_to = link.to_socket\n" - " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" - " node.node_tree = bpy.data.node_groups['RetroUVMode3Node']\n" - " node.location[0] = link.from_node.location[0] + 50\n" - " node.location[1] = link.from_node.location[1] - 50\n" - " node.inputs[1].default_value = {}\n" - " node.inputs[2].default_value = {}\n" - " new_nodetree.links.remove(link)\n" - " new_nodetree.links.new(soc_from, node.inputs[0])\n" - " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), - idx, vals[0], vals[1]); + out.format(fmt("for link in list(tex_links):\n" + " if link.from_node.label == 'MTX_{}':\n" + " tex_links.remove(link)\n" + " soc_from = link.from_socket\n" + " soc_to = link.to_socket\n" + " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" + " node.node_tree = bpy.data.node_groups['RetroUVMode3Node']\n" + " node.location[0] = link.from_node.location[0] + 50\n" + " node.location[1] = link.from_node.location[1] - 50\n" + " node.inputs[1].default_value = {}\n" + " node.inputs[2].default_value = {}\n" + " new_nodetree.links.remove(link)\n" + " new_nodetree.links.new(soc_from, node.inputs[0])\n" + " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), + idx, vals[0], vals[1]); break; case UVAnimation::Mode::HStrip: - out.format(fmt( - "for link in list(tex_links):\n" - " if link.from_node.label == 'MTX_{}':\n" - " tex_links.remove(link)\n" - " soc_from = link.from_socket\n" - " soc_to = link.to_socket\n" - " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" - " node.node_tree = bpy.data.node_groups['RetroUVMode4Node']\n" - " node.location[0] = link.from_node.location[0] + 50\n" - " node.location[1] = link.from_node.location[1] - 50\n" - " node.inputs[1].default_value = {}\n" - " node.inputs[2].default_value = {}\n" - " node.inputs[3].default_value = {}\n" - " node.inputs[4].default_value = {}\n" - " new_nodetree.links.remove(link)\n" - " new_nodetree.links.new(soc_from, node.inputs[0])\n" - " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), - idx, vals[0], vals[1], vals[2], vals[3]); + out.format(fmt("for link in list(tex_links):\n" + " if link.from_node.label == 'MTX_{}':\n" + " tex_links.remove(link)\n" + " soc_from = link.from_socket\n" + " soc_to = link.to_socket\n" + " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" + " node.node_tree = bpy.data.node_groups['RetroUVMode4Node']\n" + " node.location[0] = link.from_node.location[0] + 50\n" + " node.location[1] = link.from_node.location[1] - 50\n" + " node.inputs[1].default_value = {}\n" + " node.inputs[2].default_value = {}\n" + " node.inputs[3].default_value = {}\n" + " node.inputs[4].default_value = {}\n" + " new_nodetree.links.remove(link)\n" + " new_nodetree.links.new(soc_from, node.inputs[0])\n" + " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), + idx, vals[0], vals[1], vals[2], vals[3]); break; case UVAnimation::Mode::VStrip: - out.format(fmt( - "for link in list(tex_links):\n" - " if link.from_node.label == 'MTX_{}':\n" - " tex_links.remove(link)\n" - " soc_from = link.from_socket\n" - " soc_to = link.to_socket\n" - " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" - " node.node_tree = bpy.data.node_groups['RetroUVMode5Node']\n" - " node.location[0] = link.from_node.location[0] + 50\n" - " node.location[1] = link.from_node.location[1] - 50\n" - " node.inputs[1].default_value = {}\n" - " node.inputs[2].default_value = {}\n" - " node.inputs[3].default_value = {}\n" - " node.inputs[4].default_value = {}\n" - " new_nodetree.links.remove(link)\n" - " new_nodetree.links.new(soc_from, node.inputs[0])\n" - " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), - idx, vals[0], vals[1], vals[2], vals[3]); + out.format(fmt("for link in list(tex_links):\n" + " if link.from_node.label == 'MTX_{}':\n" + " tex_links.remove(link)\n" + " soc_from = link.from_socket\n" + " soc_to = link.to_socket\n" + " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" + " node.node_tree = bpy.data.node_groups['RetroUVMode5Node']\n" + " node.location[0] = link.from_node.location[0] + 50\n" + " node.location[1] = link.from_node.location[1] - 50\n" + " node.inputs[1].default_value = {}\n" + " node.inputs[2].default_value = {}\n" + " node.inputs[3].default_value = {}\n" + " node.inputs[4].default_value = {}\n" + " new_nodetree.links.remove(link)\n" + " new_nodetree.links.new(soc_from, node.inputs[0])\n" + " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), + idx, vals[0], vals[1], vals[2], vals[3]); break; case UVAnimation::Mode::Model: - out.format(fmt( - "for link in list(tex_links):\n" - " if link.from_node.label == 'MTX_{}':\n" - " tex_links.remove(link)\n" - " soc_from = link.from_socket\n" - " soc_to = link.to_socket\n" - " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" - " node.node_tree = bpy.data.node_groups['RetroUVMode6NodeN']\n" - " node.location[0] = link.from_node.location[0] + 50\n" - " node.location[1] = link.from_node.location[1] - 50\n" - " new_nodetree.links.remove(link)\n" - " new_nodetree.links.new(soc_from, node.inputs[0])\n" - " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), - idx); + out.format(fmt("for link in list(tex_links):\n" + " if link.from_node.label == 'MTX_{}':\n" + " tex_links.remove(link)\n" + " soc_from = link.from_socket\n" + " soc_to = link.to_socket\n" + " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" + " node.node_tree = bpy.data.node_groups['RetroUVMode6NodeN']\n" + " node.location[0] = link.from_node.location[0] + 50\n" + " node.location[1] = link.from_node.location[1] - 50\n" + " new_nodetree.links.remove(link)\n" + " new_nodetree.links.new(soc_from, node.inputs[0])\n" + " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), + idx); break; case UVAnimation::Mode::CylinderEnvironment: - out.format(fmt( - "for link in list(tex_links):\n" - " if link.from_node.label == 'MTX_{}':\n" - " tex_links.remove(link)\n" - " soc_from = link.from_socket\n" - " soc_to = link.to_socket\n" - " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" - " node.node_tree = bpy.data.node_groups['RetroUVMode7NodeN']\n" - " node.location[0] = link.from_node.location[0] + 50\n" - " node.location[1] = link.from_node.location[1] - 50\n" - " node.inputs[1].default_value = {}\n" - " node.inputs[2].default_value = {}\n" - " new_nodetree.links.remove(link)\n" - " new_nodetree.links.new(soc_from, node.inputs[0])\n" - " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), - idx, vals[0], vals[1]); + out.format(fmt("for link in list(tex_links):\n" + " if link.from_node.label == 'MTX_{}':\n" + " tex_links.remove(link)\n" + " soc_from = link.from_socket\n" + " soc_to = link.to_socket\n" + " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" + " node.node_tree = bpy.data.node_groups['RetroUVMode7NodeN']\n" + " node.location[0] = link.from_node.location[0] + 50\n" + " node.location[1] = link.from_node.location[1] - 50\n" + " node.inputs[1].default_value = {}\n" + " node.inputs[2].default_value = {}\n" + " new_nodetree.links.remove(link)\n" + " new_nodetree.links.new(soc_from, node.inputs[0])\n" + " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), + idx, vals[0], vals[1]); break; case UVAnimation::Mode::Eight: - out.format(fmt( - "for link in list(tex_links):\n" - " if link.from_node.label == 'MTX_{}':\n" - " tex_links.remove(link)\n" - " soc_from = link.from_socket\n" - " soc_to = link.to_socket\n" - " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" - " node.node_tree = bpy.data.node_groups['RetroUVMode8Node']\n" - " node.location[0] = link.from_node.location[0] + 50\n" - " node.location[1] = link.from_node.location[1] - 50\n" - " node.inputs[1].default_value = {}\n" - " node.inputs[2].default_value = {}\n" - " node.inputs[3].default_value = {}\n" - " node.inputs[4].default_value = {}\n" - " node.inputs[5].default_value = {}\n" - " node.inputs[6].default_value = {}\n" - " node.inputs[7].default_value = {}\n" - " node.inputs[8].default_value = {}\n" - " node.inputs[9].default_value = {}\n" - " new_nodetree.links.remove(link)\n" - " new_nodetree.links.new(soc_from, node.inputs[0])\n" - " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), - idx, vals[0], vals[1], vals[2], vals[3], vals[4], vals[5], vals[6], vals[7], vals[8]); + out.format(fmt("for link in list(tex_links):\n" + " if link.from_node.label == 'MTX_{}':\n" + " tex_links.remove(link)\n" + " soc_from = link.from_socket\n" + " soc_to = link.to_socket\n" + " node = new_nodetree.nodes.new('ShaderNodeGroup')\n" + " node.node_tree = bpy.data.node_groups['RetroUVMode8Node']\n" + " node.location[0] = link.from_node.location[0] + 50\n" + " node.location[1] = link.from_node.location[1] - 50\n" + " node.inputs[1].default_value = {}\n" + " node.inputs[2].default_value = {}\n" + " node.inputs[3].default_value = {}\n" + " node.inputs[4].default_value = {}\n" + " node.inputs[5].default_value = {}\n" + " node.inputs[6].default_value = {}\n" + " node.inputs[7].default_value = {}\n" + " node.inputs[8].default_value = {}\n" + " node.inputs[9].default_value = {}\n" + " new_nodetree.links.remove(link)\n" + " new_nodetree.links.new(soc_from, node.inputs[0])\n" + " new_nodetree.links.new(node.outputs[0], soc_to)\n\n"), + idx, vals[0], vals[1], vals[2], vals[3], vals[4], vals[5], vals[6], vals[7], vals[8]); break; default: break; @@ -244,12 +233,12 @@ void Material::AddTextureAnim(Stream& out, UVAnimation::Mode type, unsigned idx, } void Material::AddKcolor(Stream& out, const GX::Color& col, unsigned idx) { - out.format(fmt( - "kcolors[{}] = ({}, {}, {}, {})\n" - "kalphas[{}] = {}\n" - "\n"), - idx, (float)col.color[0] / (float)0xff, (float)col.color[1] / (float)0xff, (float)col.color[2] / (float)0xff, - (float)col.color[3] / (float)0xff, idx, (float)col.color[3] / (float)0xff); + out.format(fmt("kcolors[{}] = ({}, {}, {}, {})\n" + "kalphas[{}] = {}\n" + "\n"), + idx, (float)col.color[0] / (float)0xff, (float)col.color[1] / (float)0xff, + (float)col.color[2] / (float)0xff, (float)col.color[3] / (float)0xff, idx, + (float)col.color[3] / (float)0xff); } template @@ -354,11 +343,10 @@ template static void _DescribeTEV(const MAT& mat) { for (uint32_t i = 0; i < mat.tevStageCount; ++i) { const auto& stage = mat.tevStages[i]; - fmt::print(stderr, fmt("A:{} B:{} C:{} D:{} -> {} | A:{} B:{} C:{} D:{} -> {}\n"), - ToString(stage.colorInA()), ToString(stage.colorInB()), - ToString(stage.colorInC()), ToString(stage.colorInD()), ToString(stage.colorOpOutReg()), - ToString(stage.alphaInA()), ToString(stage.alphaInB()), - ToString(stage.alphaInC()), ToString(stage.alphaInD()), ToString(stage.alphaOpOutReg())); + fmt::print(stderr, fmt("A:{} B:{} C:{} D:{} -> {} | A:{} B:{} C:{} D:{} -> {}\n"), ToString(stage.colorInA()), + ToString(stage.colorInB()), ToString(stage.colorInC()), ToString(stage.colorInD()), + ToString(stage.colorOpOutReg()), ToString(stage.alphaInA()), ToString(stage.alphaInB()), + ToString(stage.alphaInC()), ToString(stage.alphaInD()), ToString(stage.alphaOpOutReg())); } bool hasInd = mat.flags.samusReflectionIndirectTexture(); bool hasLm = mat.flags.lightmap(); @@ -388,12 +376,10 @@ struct KColLink { struct WhiteColorLink { const char* shaderInput; - explicit WhiteColorLink(const char* shaderInput) - : shaderInput(shaderInput) {} + explicit WhiteColorLink(const char* shaderInput) : shaderInput(shaderInput) {} }; -static void _GenerateRootShader(Stream& out, int) { - /* End of shader links */ +static void _GenerateRootShader(Stream& out, int) { /* End of shader links */ } template @@ -401,8 +387,8 @@ static void _GenerateRootShader(Stream& out, int tidx, TexLink tex, Targs... arg int texIdx = tex.texidx == -1 ? tidx : tex.texidx; out << "texture_nodes[" << texIdx << "].name = '" << tex.shaderInput << "'\n"; out << "texture_nodes[" << texIdx << "].label = '" << tex.shaderInput << "'\n"; - out << "new_nodetree.links.new(texture_nodes[" << texIdx << "].outputs['" << - (tex.alpha ? "Alpha" : "Color") << "'], node.inputs['" << tex.shaderInput << "'])\n"; + out << "new_nodetree.links.new(texture_nodes[" << texIdx << "].outputs['" << (tex.alpha ? "Alpha" : "Color") + << "'], node.inputs['" << tex.shaderInput << "'])\n"; if (tex.texidx == -1) ++tidx; _GenerateRootShader(out, tidx, args...); @@ -422,8 +408,8 @@ static void _GenerateRootShader(Stream& out, int tidx, ExtendedSpecularLink tex, template static void _GenerateRootShader(Stream& out, int tidx, KColLink kcol, Targs... args) { - out << "node.inputs['" << kcol.shaderInput << "'].default_value = " << - (kcol.alpha ? "kalphas[" : "kcolors[") << kcol.kcidx << "]\n"; + out << "node.inputs['" << kcol.shaderInput << "'].default_value = " << (kcol.alpha ? "kalphas[" : "kcolors[") + << kcol.kcidx << "]\n"; _GenerateRootShader(out, tidx, args...); } @@ -437,16 +423,18 @@ template static void _GenerateRootShader(Stream& out, const char* type, Targs... args) { out << "node = new_nodetree.nodes.new('ShaderNodeGroup')\n" "node.name = 'Output'\n" - "node.node_tree = bpy.data.node_groups['" << type << "']\n" + "node.node_tree = bpy.data.node_groups['" + << type + << "']\n" "gridder.place_node(node, 1)\n" "new_nodetree.links.new(node.outputs['Surface'], blend_node.inputs['Surface'])\n"; _GenerateRootShader(out, 0, args...); } -static TexLink operator "" _tex(const char* str, size_t) { return TexLink(str); } -static TexLink operator "" _texa(const char* str, size_t) { return TexLink(str, -1, true); } -static KColLink operator "" _kcol(const char* str, size_t) { return KColLink(str); } -static KColLink operator "" _kcola(const char* str, size_t) { return KColLink(str, 0, true); } +static TexLink operator"" _tex(const char* str, size_t) { return TexLink(str); } +static TexLink operator"" _texa(const char* str, size_t) { return TexLink(str, -1, true); } +static KColLink operator"" _kcol(const char* str, size_t) { return KColLink(str); } +static KColLink operator"" _kcola(const char* str, size_t) { return KColLink(str, 0, true); } template static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupIdx, unsigned matIdx) { @@ -470,22 +458,21 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI "\n"; /* Material Flags */ - out.format(fmt( - "new_material.retro_depth_sort = {}\n" - "new_material.retro_alpha_test = {}\n" - "new_material.retro_samus_reflection = {}\n" - "new_material.retro_depth_write = {}\n" - "new_material.retro_samus_reflection_persp = {}\n" - "new_material.retro_shadow_occluder = {}\n" - "new_material.retro_samus_reflection_indirect = {}\n" - "new_material.retro_lightmapped = {}\n" - "new_material.diffuse_color = (1, 1, 1, {})\n"), - material.flags.depthSorting() ? "True" : "False", material.flags.alphaTest() ? "True" : "False", - material.flags.samusReflection() ? "True" : "False", material.flags.depthWrite() ? "True" : "False", - material.flags.samusReflectionSurfaceEye() ? "True" : "False", - material.flags.shadowOccluderMesh() ? "True" : "False", - material.flags.samusReflectionIndirectTexture() ? "True" : "False", material.flags.lightmap() ? "True" : "False", - material.flags.shadowOccluderMesh() ? "0" : "1"); + out.format(fmt("new_material.retro_depth_sort = {}\n" + "new_material.retro_alpha_test = {}\n" + "new_material.retro_samus_reflection = {}\n" + "new_material.retro_depth_write = {}\n" + "new_material.retro_samus_reflection_persp = {}\n" + "new_material.retro_shadow_occluder = {}\n" + "new_material.retro_samus_reflection_indirect = {}\n" + "new_material.retro_lightmapped = {}\n" + "new_material.diffuse_color = (1, 1, 1, {})\n"), + material.flags.depthSorting() ? "True" : "False", material.flags.alphaTest() ? "True" : "False", + material.flags.samusReflection() ? "True" : "False", material.flags.depthWrite() ? "True" : "False", + material.flags.samusReflectionSurfaceEye() ? "True" : "False", + material.flags.shadowOccluderMesh() ? "True" : "False", + material.flags.samusReflectionIndirectTexture() ? "True" : "False", + material.flags.lightmap() ? "True" : "False", material.flags.shadowOccluderMesh() ? "0" : "1"); /* Texture Indices */ out << "tex_maps = []\n"; @@ -538,130 +525,329 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI uint32_t hash = _HashTextureConfig(material); switch (hash) { case 0x0473AE40: /* RetroShader: Lightmap, Diffuse, Emissive, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex); + break; case 0x072D2CB3: /* RetroShader: Diffuse, Emissive, Reflection, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, WhiteColorLink("Specular"), "Reflection"_tex); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, WhiteColorLink("Specular"), + "Reflection"_tex); + break; case 0x0879D346: /* RetroShader: KColorDiffuse, Alpha=Texture */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_kcol, "Alpha"_tex); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_kcol, "Alpha"_tex); + break; case 0x0DA256BB: /* Lightmap, Diffuse, Specular, Reflection, Alpha=KAlpha */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, "Alpha"_kcola); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, + "Alpha"_kcola); + break; case 0x11C41DA4: /* RetroDynamicCharacterShader: Diffuse, DynamicMaskTex, Specular, Reflection, Alpha=1.0 */ - _GenerateRootShader(out, "RetroDynamicCharacterShader", "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, "Reflection"_tex); break; + _GenerateRootShader(out, "RetroDynamicCharacterShader", "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, + "Reflection"_tex); + break; case 0x1218F83E: /* RetroShader: ObjLightmap, Diffuse, ExtendedSpecular, Reflection, Alpha=DiffuseAlpha */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, ExtendedSpecularLink(), "Reflection"_tex, TexLink("Alpha", 1, true)); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, ExtendedSpecularLink(), "Reflection"_tex, + TexLink("Alpha", 1, true)); + break; case 0x129B8578: /* RetroShader: KColorDiffuse, Emissive, Alpha=KAlpha */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_kcol, "Emissive"_tex, "Alpha"_kcola); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_kcol, "Emissive"_tex, "Alpha"_kcola); + break; case 0x15A3E6E5: /* RetroShader: Diffuse, Alpha=KAlpha */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Alpha"_kcola); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Alpha"_kcola); + break; case 0x1BEB3E15: /* RetroShader: Diffuse, Alpha=DiffuseAlpha */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, TexLink("Alpha", 0, true)); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, TexLink("Alpha", 0, true)); + break; case 0x2261E0EB: /* RetroShader: Diffuse, Emissive, Specular, Reflection, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, "Reflection"_tex); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, "Reflection"_tex); + break; case 0x239C7724: /* RetroDynamicShader: Diffuse*Dynamic, Emissive*Dynamic, Alpha=1.0 */ - _GenerateRootShader(out, "RetroDynamicShader", "Diffuse"_tex, "Emissive"_tex); break; + _GenerateRootShader(out, "RetroDynamicShader", "Diffuse"_tex, "Emissive"_tex); + break; case 0x240C4C84: /* RetroShader: Lightmap, KColorDiffuse, Specular, Reflection, Alpha=KAlpha */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_kcol, "Specular"_tex, "Reflection"_tex, "Alpha"_kcola); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_kcol, "Specular"_tex, "Reflection"_tex, + "Alpha"_kcola); + break; case 0x2523A379: /* RetroDynamicShader: Emissive*Dynamic, Specular, Reflection, Alpha=1.0 */ - _GenerateRootShader(out, "RetroDynamicShader", "Emissive"_tex, "Specular"_tex, "Reflection"_tex); break; + _GenerateRootShader(out, "RetroDynamicShader", "Emissive"_tex, "Specular"_tex, "Reflection"_tex); + break; case 0x25E85017: /* RetroShader: Lightmap, KColorDiffuse, Alpha=KAlpha */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_kcol, "Alpha"_kcola); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_kcol, "Alpha"_kcola); + break; case 0x27FD5C6C: /* RetroShader: ObjLightmap, Diffuse, Specular, Reflection, Alpha=DiffuseAlpha */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, TexLink("Alpha", 1, true)); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, + TexLink("Alpha", 1, true)); + break; case 0x2AD9F535: /* RetroShader: Emissive, Reflection, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", "Emissive"_tex, WhiteColorLink("Specular"), "Reflection"_tex); break; + _GenerateRootShader(out, "RetroShader", "Emissive"_tex, WhiteColorLink("Specular"), "Reflection"_tex); + break; case 0x2C9F5104: /* RetroShader: Diffuse, Specular, Reflection, Alpha=KAlpha */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, "Alpha"_kcola); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, "Alpha"_kcola); + break; case 0x2D059429: /* RetroShader: Diffuse, Emissive, ExtendedSpecular, Reflection, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, ExtendedSpecularLink(), "Reflection"_tex); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, ExtendedSpecularLink(), "Reflection"_tex); + break; case 0x30AC64BB: /* RetroShader: Diffuse, Specular, Reflection, Alpha=KAlpha, IndirectTex */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, "IndirectTex"_tex, "Alpha"_kcola); break; - case 0x39BC4809: /* RetroDynamicShader: ObjLightmap*Dynamic, Diffuse*Dynamic, Emissive*Dynamic, Specular, Reflection, Alpha=1.0 */ - _GenerateRootShader(out, "RetroDynamicShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, "Reflection"_tex); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, "IndirectTex"_tex, + "Alpha"_kcola); + break; + case 0x39BC4809: /* RetroDynamicShader: ObjLightmap*Dynamic, Diffuse*Dynamic, Emissive*Dynamic, Specular, Reflection, + Alpha=1.0 */ + _GenerateRootShader(out, "RetroDynamicShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, + "Reflection"_tex); + break; case 0x3BF97299: /* RetroShader: Lightmap, Diffuse, Specular, Reflection, Alpha=KAlpha, IndirectTex */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, "IndirectTex"_tex, "Alpha"_kcola); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, + "IndirectTex"_tex, "Alpha"_kcola); + break; case 0x47ECF3ED: /* RetroShader: Diffuse, Specular, Reflection, Emissive, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, "Emissive"_tex); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, "Emissive"_tex); + break; case 0x4BBDFFA6: /* RetroShader: Diffuse, Emissive, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex); + break; case 0x4D4127A3: /* RetroShader: Lightmap, Diffuse, Specular, Reflection, Alpha=DiffuseAlpha */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, TexLink("Alpha", 1, true)); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, + TexLink("Alpha", 1, true)); + break; case 0x54A92F25: /* RetroShader: ObjLightmap, KColorDiffuse, Alpha=KAlpha */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_kcol, "Alpha"_kcola); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_kcol, "Alpha"_kcola); + break; + case 0x07AA75D7: + /* TODO: Properly implement TEV configuration: + A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV + A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV + HasIndirect: false HasLightmap: false + */ + case 0x72BEDDAC: + /* TODO: Properly implement TEV configuration: + A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_ZERO -> TEVREG0 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG0 + A:CC_ZERO B:CC_C0 C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV + A:CC_ZERO B:CC_TEXC C:CC_ONE D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV + A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_TEXC -> TEVREG2 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG2 + A:CC_ZERO B:CC_C2 C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV + HasIndirect: false HasLightmap: true + */ + case 0x03FEE002: + /* TODO: Properly implement TEV configuration: + A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV + A:CC_ZERO B:CC_TEXC C:CC_ONE D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV + A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV + HasIndirect: false HasLightmap: false + */ + case 0xF4DA0A86: + /* TODO: Properly implement TEV configuration: + A:CC_ZERO B:CC_RASC C:CC_KONST D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV + A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV + HasIndirect: false HasLightmap: false + */ + case 0xF345C16E: + /* TODO: Properly implement TEV configuration: + A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV + A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV + HasIndirect: false HasLightmap: false + */ + case 0x8C562AB1: + /* TODO: Properly implement TEV configuration: + A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV + A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV + HasIndirect: false HasLightmap: false + */ + case 0xE92F1340: + /* TODO: Properly implement TEV configuration: + A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV + A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_TEXA C:CA_APREV D:CA_ZERO -> TEVPREV + HasIndirect: false HasLightmap: false + */ + case 0xCE06F3F2: + /* TODO: Properly implement TEV configuration: + A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV + A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_TEXA C:CA_APREV D:CA_ZERO -> TEVPREV + HasIndirect: false HasLightmap: false + */ + case 0xC0E3FF1F: + /* TODO: Properly implement TEV configuration: + A:CC_ZERO B:CC_RASC C:CC_KONST D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV + A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_TEXC -> TEVREG2 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG2 + A:CC_ZERO B:CC_C2 C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV + HasIndirect: false HasLightmap: false + */ + case 0xFC2761B8: + /* TODO: Properly implement TEV configuration: + A:CC_ZERO B:CC_C1 C:CC_TEXC D:CC_RASC -> TEVREG0 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG0 + A:CC_ZERO B:CC_C0 C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV + A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_TEXA C:CA_APREV D:CA_ZERO -> TEVPREV + HasIndirect: false HasLightmap: true + */ + case 0xE64D1085: + /* TODO: Properly implement TEV configuration: + A:CC_ZERO B:CC_C1 C:CC_TEXC D:CC_RASC -> TEVREG0 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG0 + A:CC_ZERO B:CC_C0 C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV + A:CC_ZERO B:CC_TEXC C:CC_ONE D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV + A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV + HasIndirect: false HasLightmap: true + */ + case 0xB26E9E2E: + /* TODO: Properly implement TEV configuration: + A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV + A:CC_ZERO B:CC_TEXC C:CC_ONE D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV + A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_TEXC -> TEVREG2 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG2 + A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_C2 -> TEVREG2 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG2 + HasIndirect: false HasLightmap: false + */ + case 0x4184FBCA: + /* TODO: Properly implement TEV configuration: + A:CC_ZERO B:CC_C1 C:CC_TEXC D:CC_RASC -> TEVREG0 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG0 + A:CC_ZERO B:CC_C0 C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV + A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV + HasIndirect: false HasLightmap: true + */ + case 0x81106196: + /* TODO: Properly implement TEV configuration: + A:CC_ZERO B:CC_C1 C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV + HasIndirect: false HasLightmap: false + */ + case 0x15A00948: + /* TODO: Properly implement TEV configuration: + A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV + A:CC_ZERO B:CC_TEXC C:CC_ONE D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV + A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_TEXC -> TEVREG2 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG2 + A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_C2 -> TEVREG2 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG2 + A:CC_ZERO B:CC_C2 C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV + HasIndirect: false HasLightmap: false + */ + case 0xFFF3CEBB: + /* TODO: Properly implement TEV configuration: + A:CC_ZERO B:CC_C1 C:CC_TEXC D:CC_RASC -> TEVREG0 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG0 + A:CC_ZERO B:CC_C0 C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV + A:CC_ZERO B:CC_TEXC C:CC_ONE D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV + A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_TEXA C:CA_APREV D:CA_ZERO -> TEVPREV + HasIndirect: false HasLightmap: true + */ + case 0x58BAA415: + /* TODO: Properly implement TEV configuration: + A:CC_ZERO B:CC_C1 C:CC_TEXC D:CC_RASC -> TEVREG0 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG0 + A:CC_ZERO B:CC_C0 C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV + A:CC_ZERO B:CC_TEXC C:CC_ONE D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV + A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_TEXC -> TEVREG2 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG2 + HasIndirect: false HasLightmap: true + */ case 0x54C6204C: - _GenerateRootShader(out, "RetroShader"); break; + _GenerateRootShader(out, "RetroShader"); + break; case 0x5A62D5F0: /* RetroShader: Lightmap, Diffuse, UnusedExtendedSpecular?, Alpha=DiffuseAlpha */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, TexLink("Alpha", 1, true)); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, TexLink("Alpha", 1, true)); + break; case 0x5CB59821: /* RetroShader: Diffuse, UnusedSpecular?, Alpha=KAlpha */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Alpha"_kcola); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Alpha"_kcola); + break; case 0x5D0F0069: /* RetroShader: Diffuse, Emissive, Alpha=DiffuseAlpha */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, TexLink("Alpha", 0, true)); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, TexLink("Alpha", 0, true)); + break; case 0x5D80E53C: /* RetroShader: Emissive, Specular, Reflection, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", "Emissive"_tex, "Specular"_tex, "Reflection"_tex); break; + _GenerateRootShader(out, "RetroShader", "Emissive"_tex, "Specular"_tex, "Reflection"_tex); + break; case 0x5F0AB0E9: /* RetroShader: Lightmap, Diffuse, UnusedSpecular?, Alpha=DiffuseAlpha */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, TexLink("Alpha", 1, true)); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, TexLink("Alpha", 1, true)); + break; case 0x5F189425: /* RetroShader: Lightmap, Diffuse, UnusedSpecular?, Alpha=KAlpha */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Alpha"_kcola); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Alpha"_kcola); + break; case 0x6601D113: /* RetroShader: Emissive, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", "Emissive"_tex); break; + _GenerateRootShader(out, "RetroShader", "Emissive"_tex); + break; case 0x694287FA: /* RetroShader: Diffuse, Emissive, Reflection, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, WhiteColorLink("Specular"), "Reflection"_tex); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, WhiteColorLink("Specular"), + "Reflection"_tex); + break; case 0x6D98D689: /* RetroDynamicAlphaShader: Diffuse*Dynamic, Specular, Reflection, Alpha=KAlpha*Dynamic */ - _GenerateRootShader(out, "RetroDynamicAlphaShader", "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, "Alpha"_kcola); break; + _GenerateRootShader(out, "RetroDynamicAlphaShader", "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, "Alpha"_kcola); + break; case 0x7252CB90: /* RetroShader: Lightmap, Diffuse, Alpha=KAlpha */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Alpha"_kcola); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Alpha"_kcola); + break; case 0x76BEA57E: /* RetroShader: Lightmap, Diffuse, Emissive, Specular, Reflection, Alpha=1.0, IndirectTex */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, "Reflection"_tex, "IndirectTex"_tex); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, + "Reflection"_tex, "IndirectTex"_tex); + break; case 0x7D6A4487: /* RetroShader: Diffuse, Specular, Reflection, Alpha=DiffuseAlpha */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, TexLink("Alpha", 0, true)); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, TexLink("Alpha", 0, true)); + break; case 0x84319328: /* RetroShader: Reflection, UnusedSpecular?, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", WhiteColorLink("Specular"), "Reflection"_tex); break; + _GenerateRootShader(out, "RetroShader", WhiteColorLink("Specular"), "Reflection"_tex); + break; case 0x846215DA: /* RetroShader: Diffuse, Specular, Reflection, Alpha=DiffuseAlpha, IndirectTex */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, "IndirectTex"_tex, TexLink("Alpha", 0, true)); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, "IndirectTex"_tex, + TexLink("Alpha", 0, true)); + break; case 0x8E916C01: /* RetroShader: NULL, all inputs 0 */ - _GenerateRootShader(out, "RetroShader"); break; + _GenerateRootShader(out, "RetroShader"); + break; case 0x957709F8: /* RetroShader: Emissive, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", "Emissive"_tex); break; + _GenerateRootShader(out, "RetroShader", "Emissive"_tex); + break; case 0x96ABB2D3: /* RetroShader: Lightmap, Diffuse, Alpha=DiffuseAlpha */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, TexLink("Alpha", 1, true)); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, TexLink("Alpha", 1, true)); + break; case 0x985A0B67: /* RetroShader: Diffuse, UnusedSpecular?, Alpha=DiffuseAlpha */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, TexLink("Alpha", 0, true)); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, TexLink("Alpha", 0, true)); + break; case 0x9B4453A2: /* RetroShader: Diffuse, Emissive, ExtendedSpecular, Reflection, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, ExtendedSpecularLink(), "Reflection"_tex); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, ExtendedSpecularLink(), "Reflection"_tex); + break; case 0xA187C630: /* RetroShader: Diffuse, Emissive, UnusedReflection?, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex); + break; case 0xC138DCFA: /* RetroShader: Diffuse, Emissive, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex); + break; case 0xC3C8B1C8: /* RetroShader: KColorDiffuse, Alpha=KAlpha */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_kcol, "Alpha"_kcola); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_kcol, "Alpha"_kcola); + break; case 0xC689C8C6: /* RetroShader: Diffuse, ExtendedSpecular, Reflection, Alpha=DiffuseAlpha */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, ExtendedSpecularLink(), "Reflection"_tex, TexLink("Alpha", 0, true)); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, ExtendedSpecularLink(), "Reflection"_tex, + TexLink("Alpha", 0, true)); + break; case 0xC6B18B28: /* RetroShader: Diffuse, Alpha=DiffuseAlpha */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, TexLink("Alpha", 0, true)); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, TexLink("Alpha", 0, true)); + break; case 0xCD92D4C5: /* RetroShader: Diffuse, Reflection, Alpha=KAlpha */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, WhiteColorLink("Specular"), "Reflection"_tex, "Alpha"_kcola); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, WhiteColorLink("Specular"), "Reflection"_tex, "Alpha"_kcola); + break; case 0xD73E7728: /* RetroShader: ObjLightmap, Diffuse, Alpha=DiffuseAlpha */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, TexLink("Alpha", 1, true)); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, TexLink("Alpha", 1, true)); + break; case 0xDB8F01AD: /* RetroDynamicShader: Diffuse*Dynamic, Emissive*Dynamic, UnusedSpecular?, Alpha=1.0 */ - _GenerateRootShader(out, "RetroDynamicShader", "Diffuse"_tex, "Emissive"_tex); break; + _GenerateRootShader(out, "RetroDynamicShader", "Diffuse"_tex, "Emissive"_tex); + break; case 0xE6784B10: /* RetroShader: Lightmap, Diffuse, Specular, Reflection, Alpha=DiffuseAlpha, IndirectTex */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, "IndirectTex"_tex, TexLink("Alpha", 1, true)); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, + "IndirectTex"_tex, TexLink("Alpha", 1, true)); + break; case 0xE68FF182: /* RetroShader: Diffuse, Emissive, Specular, Reflection, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, "Reflection"_tex); break; + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, "Reflection"_tex); + break; case 0xEB4645CF: /* RetroDynamicAlphaShader: Diffuse*Dynamic, Alpha=DiffuseAlpha*Dynamic */ - _GenerateRootShader(out, "RetroDynamicAlphaShader", "Diffuse"_tex, TexLink("Alpha", 0, true)); break; + _GenerateRootShader(out, "RetroDynamicAlphaShader", "Diffuse"_tex, TexLink("Alpha", 0, true)); + break; case 0xECEF8D1F: /* RetroDynamicShader: Diffuse*Dynamic, Emissive*Dynamic, Specular, Reflection, Alpha=1.0 */ - _GenerateRootShader(out, "RetroDynamicShader", "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, "Reflection"_tex); break; + _GenerateRootShader(out, "RetroDynamicShader", "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, "Reflection"_tex); + break; case 0xF1C26570: /* RetroShader: Lightmap, Diffuse, Specular, ExtendedSpecular, Reflection, Alpha=DiffuseAlpha */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Specular"_tex, "ExtendedSpecular"_tex, "Reflection"_tex, TexLink("Alpha", 1, true)); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Specular"_tex, "ExtendedSpecular"_tex, + "Reflection"_tex, TexLink("Alpha", 1, true)); + break; case 0xF559DB08: /* RetroShader: Lightmap, Diffuse, Emissive, Specular, Reflection, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, "Reflection"_tex); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, + "Reflection"_tex); + break; case 0xF9324367: /* RetroShader: Lightmap, Diffuse, Emissive, Alpha=1.0 */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex); + break; case 0xFD95D7FD: /* RetroShader: ObjLightmap, Diffuse, Alpha=DiffuseAlpha */ - _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, TexLink("Alpha", 1, true)); break; + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, TexLink("Alpha", 1, true)); + break; default: _DescribeTEV(material); - Log.report(logvisor::Fatal, fmt("Unable to resolve shader hash {:08X}\n"), hash); break; + Log.report(logvisor::Fatal, fmt("Unable to resolve shader hash {:08X}\n"), hash); + break; } /* Has Lightmap? */ @@ -682,8 +868,7 @@ void MaterialSet::ConstructMaterial(Stream& out, const MaterialSet::Material& ma _ConstructMaterial(out, material, groupIdx, matIdx); } -MaterialSet::Material::Material(const hecl::blender::Material& mat, - std::vector& texPathsOut, +MaterialSet::Material::Material(const hecl::blender::Material& mat, std::vector& texPathsOut, int colorCount, bool lightmapUVs, bool matrixSkinning) { /* TODO: Rewrite for new shader rep */ XXH32_state_t xxHash; @@ -1090,7 +1275,6 @@ void HMDLMaterialSet::Material::PASS::Enumerate(typename Op::StreamT& s) { AT_SPECIALIZE_DNA(HMDLMaterialSet::Material::PASS) - std::string_view HMDLMaterialSet::Material::PASS::DNAType() { return "DataSpec::DNAMP1::HMDLMaterialSet::Material::PASS"sv; } diff --git a/DataSpec/DNAMP2/CINF.cpp b/DataSpec/DNAMP2/CINF.cpp index ab7cb48ab..f0b5f39b7 100644 --- a/DataSpec/DNAMP2/CINF.cpp +++ b/DataSpec/DNAMP2/CINF.cpp @@ -79,4 +79,121 @@ void CINF::sendCINFToBlender(hecl::blender::PyOutStream& os, const UniqueID32& c std::string CINF::GetCINFArmatureName(const UniqueID32& cinfId) { return fmt::format(fmt("CINF_{}"), cinfId); } +int CINF::RecursiveAddArmatureBone(const Armature& armature, const BlenderBone* bone, int parent, int& curId, + std::unordered_map& idMap, + std::map& nameMap) { + int selId; + auto search = idMap.find(bone->name); + if (search == idMap.end()) { + selId = curId++; + idMap.emplace(std::make_pair(bone->name, selId)); + } else + selId = search->second; + + bones.emplace_back(); + Bone& boneOut = bones.back(); + nameMap[bone->name] = selId; + boneOut.id = selId; + boneOut.parentId = parent; + boneOut.origin = bone->origin; + boneOut.linkedCount = bone->children.size() + 1; + boneOut.linked.reserve(boneOut.linkedCount); + + const BlenderBone* child; + boneOut.linked.push_back(parent); + for (size_t i = 0; (child = armature.getChild(bone, i)); ++i) + boneOut.linked.push_back(RecursiveAddArmatureBone(armature, child, boneOut.id, curId, idMap, nameMap)); + + return boneOut.id; +} + +CINF::CINF(const Armature& armature, std::unordered_map& idMap) { + idMap.reserve(armature.bones.size()); + bones.reserve(armature.bones.size()); + + std::map nameMap; + + const BlenderBone* bone = armature.getRoot(); + if (bone) { + if (bone->children.size()) { + int curId = 4; + const BlenderBone* child; + for (size_t i = 0; (child = armature.getChild(bone, i)); ++i) + RecursiveAddArmatureBone(armature, child, 3, curId, idMap, nameMap); + } + + bones.emplace_back(); + Bone& boneOut = bones.back(); + nameMap[bone->name] = 3; + boneOut.id = 3; + boneOut.parentId = 2; + boneOut.origin = bone->origin; + idMap.emplace(std::make_pair(bone->name, 3)); + + if (bone->children.size()) { + boneOut.linkedCount = 2; + boneOut.linked = {2, 4}; + } else { + boneOut.linkedCount = 1; + boneOut.linked = {2}; + } + } + + boneCount = bones.size(); + + names.reserve(nameMap.size()); + nameCount = nameMap.size(); + for (const auto& name : nameMap) { + names.emplace_back(); + Name& nameOut = names.back(); + nameOut.name = name.first; + nameOut.boneId = name.second; + } + + boneIdCount = boneCount; + boneIds.reserve(boneIdCount); + for (auto it = bones.crbegin(); it != bones.crend(); ++it) + boneIds.push_back(it->id); +} + +bool CINF::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, + PAKRouter& pakRouter, const PAK::Entry& entry, bool force, hecl::blender::Token& btok, + std::function fileChanged) { + if (!force && outPath.isFile()) + return true; + + auto& conn = btok.getBlenderConnection(); + if (!conn.createBlend(outPath, hecl::blender::BlendType::Armature)) + return false; + auto os = conn.beginPythonOut(true); + + os.format(fmt("import bpy\n" + "from mathutils import Vector\n" + "bpy.context.scene.name = 'CINF_{}'\n" + "bpy.context.scene.hecl_arm_obj = bpy.context.scene.name\n" + "\n" + "# Clear Scene\n" + "if len(bpy.data.collections):\n" + " bpy.data.collections.remove(bpy.data.collections[0])\n" + "\n"), entry.id); + + CINF cinf; + cinf.read(rs); + cinf.sendCINFToBlender(os, entry.id); + os.centerView(); + os.close(); + return conn.saveBlend(); +} + +bool CINF::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, + const hecl::blender::Armature& armature) { + std::unordered_map boneIdMap; + CINF cinf(armature, boneIdMap); + + /* Write out CINF resource */ + athena::io::TransactionalFileWriter w(outPath.getAbsolutePath()); + cinf.write(w); + return true; +} + } // namespace DataSpec::DNAMP2 diff --git a/DataSpec/DNAMP2/CINF.hpp b/DataSpec/DNAMP2/CINF.hpp index 6cebbd0c1..5f3637477 100644 --- a/DataSpec/DNAMP2/CINF.hpp +++ b/DataSpec/DNAMP2/CINF.hpp @@ -2,6 +2,7 @@ #include "DataSpec/DNACommon/DNACommon.hpp" #include "DataSpec/DNACommon/RigInverter.hpp" +#include "DNAMP2.hpp" namespace DataSpec::DNAMP2 { @@ -37,6 +38,22 @@ struct CINF : BigDNA { void sendVertexGroupsToBlender(hecl::blender::PyOutStream& os) const; void sendCINFToBlender(hecl::blender::PyOutStream& os, const UniqueID32& cinfId) const; static std::string GetCINFArmatureName(const UniqueID32& cinfId); + + CINF() = default; + using Armature = hecl::blender::Armature; + using BlenderBone = hecl::blender::Bone; + + int RecursiveAddArmatureBone(const Armature& armature, const BlenderBone* bone, int parent, int& curId, + std::unordered_map& idMap, std::map& nameMap); + + CINF(const Armature& armature, std::unordered_map& idMap); + + static bool Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, + PAKRouter& pakRouter, const PAK::Entry& entry, bool force, hecl::blender::Token& btok, + std::function fileChanged); + + static bool Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, + const hecl::blender::Armature& armature); }; } // namespace DataSpec::DNAMP2 diff --git a/DataSpec/DNAMP2/DNAMP2.cpp b/DataSpec/DNAMP2/DNAMP2.cpp index 1f6027844..d95d84fe1 100644 --- a/DataSpec/DNAMP2/DNAMP2.cpp +++ b/DataSpec/DNAMP2/DNAMP2.cpp @@ -4,6 +4,7 @@ #include "MLVL.hpp" #include "CMDL.hpp" #include "ANCS.hpp" +#include "CINF.hpp" #include "MREA.hpp" #include "MAPA.hpp" #include "MAPU.hpp" @@ -234,6 +235,8 @@ ResExtractor PAKBridge::LookupExtractor(const nod::Node& pakNode, con return {SAVWCommon::ExtractSAVW, {_SYS_STR(".yaml")}}; case SBIG('CMDL'): return {CMDL::Extract, {_SYS_STR(".blend")}, 1}; + case SBIG('CINF'): + return {CINF::Extract, {_SYS_STR(".blend")}, 1}; case SBIG('ANCS'): return {ANCS::Extract, {_SYS_STR(".yaml"), _SYS_STR(".blend")}, 2}; case SBIG('MLVL'): diff --git a/DataSpec/DNAMP2/DeafBabe.cpp b/DataSpec/DNAMP2/DeafBabe.cpp index 36a5e9b3c..e1c699914 100644 --- a/DataSpec/DNAMP2/DeafBabe.cpp +++ b/DataSpec/DNAMP2/DeafBabe.cpp @@ -26,12 +26,15 @@ void DeafBabe::BlenderInit(hecl::blender::PyOutStream& os) { " 'Rubber':(0.09, 0.02, 0.01)}\n" "\n" "# Diffuse Color Maker\n" + "from mathutils import Color\n" "def make_color(index, mat_type, name):\n" " new_mat = bpy.data.materials.new(name)\n" " if mat_type in TYPE_COLORS:\n" - " new_mat.diffuse_color = TYPE_COLORS[mat_type]\n" + " new_mat.diffuse_color = TYPE_COLORS[mat_type] + (1.0,)\n" " else:\n" - " new_mat.diffuse_color.hsv = ((index / 6.0) % 1.0, 1.0-((index // 6) / 6.0), 1)\n" + " col = Color()\n" + " col.hsv = ((index / 6.0) % 1.0, 1.0-((index // 6) / 6.0), 1)\n" + " new_mat.diffuse_color = tuple(col) + (1.0,)\n" " return new_mat\n" "\n" "bpy.types.Material.retro_unknown = bpy.props.BoolProperty(description='Retro: Unknown (U)')\n" From eb9efbf8c3058a8ee8faa7fbad3d60116a297b1e Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Tue, 17 Mar 2020 23:12:43 -0700 Subject: [PATCH 002/224] Initial PATH support for MP2 --- DataSpec/DNACommon/AROTBuilder.cpp | 8 +- DataSpec/DNACommon/AROTBuilder.hpp | 7 +- DataSpec/DNACommon/CMakeLists.txt | 2 + DataSpec/DNACommon/PATH.cpp | 222 ++++++++++++++++++++++++++++ DataSpec/DNACommon/PATH.hpp | 74 ++++++++++ DataSpec/DNAMP1/CMakeLists.txt | 1 - DataSpec/DNAMP1/PATH.cpp | 223 +---------------------------- DataSpec/DNAMP1/PATH.hpp | 76 +--------- DataSpec/DNAMP2/CMakeLists.txt | 1 + DataSpec/DNAMP2/DNAMP2.cpp | 27 ++++ DataSpec/DNAMP2/DNAMP2.hpp | 3 + DataSpec/DNAMP2/MREA.cpp | 17 +++ DataSpec/DNAMP2/MREA.hpp | 2 + DataSpec/DNAMP2/PATH.cpp | 26 ++++ DataSpec/DNAMP2/PATH.hpp | 14 ++ DataSpec/SpecMP1.cpp | 2 +- DataSpec/SpecMP2.cpp | 7 +- Runtime/MP1/MP1.hpp | 2 +- 18 files changed, 411 insertions(+), 303 deletions(-) create mode 100644 DataSpec/DNACommon/PATH.cpp create mode 100644 DataSpec/DNACommon/PATH.hpp create mode 100644 DataSpec/DNAMP2/PATH.cpp create mode 100644 DataSpec/DNAMP2/PATH.hpp diff --git a/DataSpec/DNACommon/AROTBuilder.cpp b/DataSpec/DNACommon/AROTBuilder.cpp index 52315572a..6cdc4a351 100644 --- a/DataSpec/DNACommon/AROTBuilder.cpp +++ b/DataSpec/DNACommon/AROTBuilder.cpp @@ -272,10 +272,10 @@ void AROTBuilder::Node::pathCountNodesAndLookups(size_t& nodeCount, size_t& look } } -void AROTBuilder::Node::pathWrite(DNAMP1::PATH& path, const zeus::CAABox& curAABB) { +void AROTBuilder::Node::pathWrite(DNAPATH::PATH& path, const zeus::CAABox& curAABB) { if (childNodes.empty()) { path.octree.emplace_back(); - DNAMP1::PATH::OctreeNode& n = path.octree.back(); + DNAPATH::PATH::OctreeNode& n = path.octree.back(); n.isLeaf = 1; n.aabb[0] = curAABB.min; n.aabb[1] = curAABB.max; @@ -401,12 +401,12 @@ std::pair, uint32_t> AROTBuilder::buildCol(const ColM return {std::move(ret), totalSize}; } -void AROTBuilder::buildPath(DNAMP1::PATH& path) { +void AROTBuilder::buildPath(DNAPATH::PATH& path) { /* Accumulate total AABB and gather region boxes */ std::vector regionBoxes; regionBoxes.reserve(path.regions.size()); zeus::CAABox fullAABB; - for (const DNAMP1::PATH::Region& r : path.regions) { + for (const DNAPATH::PATH::Region& r : path.regions) { regionBoxes.emplace_back(r.aabb[0], r.aabb[1]); fullAABB.accumulateBounds(regionBoxes.back()); } diff --git a/DataSpec/DNACommon/AROTBuilder.hpp b/DataSpec/DNACommon/AROTBuilder.hpp index 1ecabbce7..2ec6f4a57 100644 --- a/DataSpec/DNACommon/AROTBuilder.hpp +++ b/DataSpec/DNACommon/AROTBuilder.hpp @@ -7,10 +7,11 @@ #include namespace DataSpec { -namespace DNAMP1 { +namespace DNAPATH { struct PATH; } + struct AROTBuilder { using ColMesh = hecl::blender::ColMesh; @@ -42,13 +43,13 @@ struct AROTBuilder { void writeColNodes(uint8_t*& ptr, const zeus::CAABox& curAABB); void pathCountNodesAndLookups(size_t& nodeCount, size_t& lookupCount); - void pathWrite(DNAMP1::PATH& path, const zeus::CAABox& curAABB); + void pathWrite(DNAPATH::PATH& path, const zeus::CAABox& curAABB); } rootNode; void build(std::vector>& secs, const zeus::CAABox& fullAabb, const std::vector& meshAabbs, const std::vector& meshes); std::pair, uint32_t> buildCol(const ColMesh& mesh, BspNodeType& rootOut); - void buildPath(DNAMP1::PATH& path); + void buildPath(DNAPATH::PATH& path); }; } // namespace DataSpec diff --git a/DataSpec/DNACommon/CMakeLists.txt b/DataSpec/DNACommon/CMakeLists.txt index 39a616532..4d77c84cf 100644 --- a/DataSpec/DNACommon/CMakeLists.txt +++ b/DataSpec/DNACommon/CMakeLists.txt @@ -4,6 +4,7 @@ make_dnalist(CMDL FSM2 MAPA MAPU + PATH MayaSpline EGMC SAVWCommon @@ -19,6 +20,7 @@ set(DNACOMMON_SOURCES CMDL.cpp MAPA.cpp MAPU.cpp + PATH.hpp PATH.cpp STRG.hpp STRG.cpp TXTR.hpp TXTR.cpp ANCS.hpp ANCS.cpp diff --git a/DataSpec/DNACommon/PATH.cpp b/DataSpec/DNACommon/PATH.cpp new file mode 100644 index 000000000..16a499d9e --- /dev/null +++ b/DataSpec/DNACommon/PATH.cpp @@ -0,0 +1,222 @@ +#include "PATH.hpp" +#include "hecl/Blender/Connection.hpp" +#include "zeus/CAABox.hpp" +#include "DataSpec/DNACommon/AROTBuilder.hpp" + +namespace DataSpec::DNAPATH { + +#define DUMP_OCTREE 0 + +#if DUMP_OCTREE +/* octree dumper */ +static void OutputOctreeNode(hecl::blender::PyOutStream& os, int idx, const zeus::CAABox& aabb) { + const zeus::CVector3f pos = aabb.center(); + const zeus::CVector3f extent = aabb.extents(); + os.format( + "obj = bpy.data.objects.new('Leaf_%d', None)\n" + "bpy.context.scene.collection.objects.link(obj)\n" + "obj.location = (%f,%f,%f)\n" + "obj.scale = (%f,%f,%f)\n" + "obj.empty_display_type = 'CUBE'\n" + "obj.layers[1] = True\n" + "obj.layers[0] = False\n", idx, + pos.x(), pos.y(), pos.z(), extent.x(), extent.y(), extent.z()); +} +#endif + +void PATH::sendToBlender(hecl::blender::Connection& conn, std::string_view entryName, const zeus::CMatrix4f* xf, + const std::string& areaPath) { + /* Open Py Stream and read sections */ + hecl::blender::PyOutStream os = conn.beginPythonOut(true); + os << + "import bpy\n" + "import bmesh\n" + "from mathutils import Vector, Matrix\n" + "\n" + "bpy.types.Material.retro_path_idx_mask = bpy.props.IntProperty(name='Retro: Path Index Mask')\n" + "bpy.types.Material.retro_path_type_mask = bpy.props.IntProperty(name='Retro: Path Type Mask')\n" + "\n" + "material_dict = {}\n" + "material_index = []\n" + "def make_ground_material(idxMask):\n" + " mat = bpy.data.materials.new('Ground %X' % idxMask)\n" + " mat.diffuse_color = (0.8, 0.460, 0.194, 1.0)\n" + " return mat\n" + "def make_flyer_material(idxMask):\n" + " mat = bpy.data.materials.new('Flyer %X' % idxMask)\n" + " mat.diffuse_color = (0.016, 0.8, 0.8, 1.0)\n" + " return mat\n" + "def make_swimmer_material(idxMask):\n" + " mat = bpy.data.materials.new('Swimmer %X' % idxMask)\n" + " mat.diffuse_color = (0.074, 0.293, 0.8, 1.0)\n" + " return mat\n" + "def select_material(meshIdxMask, meshTypeMask):\n" + " key = (meshIdxMask, meshTypeMask)\n" + " if key in material_index:\n" + " return material_index.index(key)\n" + " elif key in material_dict:\n" + " material_index.append(key)\n" + " return len(material_index)-1\n" + " else:\n" + " if meshTypeMask == 0x2:\n" + " mat = make_flyer_material(meshIdxMask)\n" + " elif meshTypeMask == 0x4:\n" + " mat = make_swimmer_material(meshIdxMask)\n" + " else:\n" + " mat = make_ground_material(meshIdxMask)\n" + " mat.retro_path_idx_mask = meshIdxMask\n" + " mat.retro_path_type_mask = meshTypeMask\n" + " material_dict[key] = mat\n" + " material_index.append(key)\n" + " return len(material_index)-1\n" + "\n"; + os.format(fmt("bpy.context.scene.name = '{}'\n"), entryName); + os << + "# Clear Scene\n" + "if len(bpy.data.collections):\n" + " bpy.data.collections.remove(bpy.data.collections[0])\n" + "\n" + "bm = bmesh.new()\n" + "height_lay = bm.faces.layers.float.new('Height')\n"; + + for (const Node& n : nodes) { + zeus::simd_floats f(n.position.simd); + os.format(fmt("bm.verts.new(({},{},{}))\n"), f[0], f[1], f[2]); + } + + os << "bm.verts.ensure_lookup_table()\n"; + + for (const Region& r : regions) { + os << "tri_verts = []\n"; + for (atUint32 i = 0; i < r.nodeCount; ++i) + os.format(fmt("tri_verts.append(bm.verts[{}])\n"), r.nodeStart + i); + + os.format(fmt( + "face = bm.faces.get(tri_verts)\n" + "if face is None:\n" + " face = bm.faces.new(tri_verts)\n" + " face.normal_flip()\n" + "face.material_index = select_material(0x{:04X}, 0x{:04X})\n" + "face.smooth = False\n" + "face[height_lay] = {}\n" + "\n"), + r.meshIndexMask, r.meshTypeMask, r.height); + +#if 0 + const zeus::CVector3f center = xf->multiplyOneOverW(r.centroid); + zeus::CAABox aabb(xf->multiplyOneOverW(r.aabb[0]), xf->multiplyOneOverW(r.aabb[1])); + os.format(fmt("aabb = bpy.data.objects.new('AABB', None)\n") + "aabb.location = (%f,%f,%f)\n" + "aabb.scale = (%f,%f,%f)\n" + "aabb.empty_display_type = 'CUBE'\n" + "bpy.context.scene.collection.objects.link(aabb)\n" + "centr = bpy.data.objects.new('Center', None)\n" + "centr.location = (%f,%f,%f)\n" + "bpy.context.scene.collection.objects.link(centr)\n", + aabb.min[0] + (aabb.max[0] - aabb.min[0]) / 2.f, + aabb.min[1] + (aabb.max[1] - aabb.min[1]) / 2.f, + aabb.min[2] + (aabb.max[2] - aabb.min[2]) / 2.f, + (aabb.max[0] - aabb.min[0]) / 2.f, + (aabb.max[1] - aabb.min[1]) / 2.f, + (aabb.max[2] - aabb.min[2]) / 2.f, + center.x(), center.y(), center.z()); +#endif + } + +#if 0 + for (const Node& n : nodes) { + zeus::simd_floats f(n.position.simd); + zeus::simd_floats no(n.position.simd + n.normal.simd); + os.format(fmt("v = bm.verts.new((%f,%f,%f))\n") + "v2 = bm.verts.new((%f,%f,%f))\n" + "bm.edges.new((v, v2))\n", f[0], f[1], f[2], no[0], no[1], no[2]); + } +#endif + + os << "bmesh.ops.remove_doubles(bm, verts=bm.verts, dist=0.001)\n" + "path_mesh = bpy.data.meshes.new('PATH')\n" + "bm.to_mesh(path_mesh)\n" + "path_mesh_obj = bpy.data.objects.new(path_mesh.name, path_mesh)\n" + "\n" + "for mat_name in material_index:\n" + " mat = material_dict[mat_name]\n" + " path_mesh.materials.append(mat)\n" + "\n" + "bpy.context.scene.collection.objects.link(path_mesh_obj)\n" + "path_mesh_obj.display_type = 'SOLID'\n" + "bpy.context.scene.hecl_path_obj = path_mesh_obj.name\n" + "\n"; + + if (xf) { + const zeus::CMatrix4f& w = *xf; + zeus::simd_floats xfMtxF[4]; + for (int i = 0; i < 4; ++i) + w.m[i].mSimd.copy_to(xfMtxF[i]); + os.format(fmt( + "mtx = Matrix((({},{},{},{}),({},{},{},{}),({},{},{},{}),(0.0,0.0,0.0,1.0)))\n" + "mtxd = mtx.decompose()\n" + "path_mesh_obj.rotation_mode = 'QUATERNION'\n" + "path_mesh_obj.location = mtxd[0]\n" + "path_mesh_obj.rotation_quaternion = mtxd[1]\n" + "path_mesh_obj.scale = mtxd[2]\n"), + xfMtxF[0][0], xfMtxF[1][0], xfMtxF[2][0], xfMtxF[3][0], xfMtxF[0][1], xfMtxF[1][1], xfMtxF[2][1], xfMtxF[3][1], + xfMtxF[0][2], xfMtxF[1][2], xfMtxF[2][2], xfMtxF[3][2]); + } + +#if DUMP_OCTREE + { + int idx = 0; + for (const auto& n : octree) { + if (n.isLeaf) + OutputOctreeNode(os, idx, zeus::CAABox(n.aabb[0], n.aabb[1])); + ++idx; + } + } +#endif + + os.linkBackground(fmt::format(fmt("//{}"), areaPath)); + os.centerView(); + os.close(); +} + +bool PATH::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, + const PathMesh& mesh, hecl::blender::Token& btok) { + athena::io::MemoryReader r(mesh.data.data(), mesh.data.size()); + PATH path; + path.read(r); + if (!path.regions.empty()) { + AROTBuilder octreeBuilder; + octreeBuilder.buildPath(path); + } else { + path.octreeNodeCount = 1; + path.octree.emplace_back(); + OctreeNode& n = path.octree.back(); + n.isLeaf = 1; + n.aabb[0] = zeus::CVector3f{FLT_MAX, FLT_MAX, FLT_MAX}; + n.aabb[1] = zeus::CVector3f{-FLT_MAX, -FLT_MAX, -FLT_MAX}; + for (int i = 0; i < 8; ++i) + n.children[i] = 0xffffffff; + } + +#if DUMP_OCTREE + { + hecl::blender::Connection& conn = btok.getBlenderConnection(); + if (!conn.createBlend(inPath.getWithExtension(_SYS_STR(".octree.blend"), true), hecl::blender::BlendType::PathMesh)) + return false; + + zeus::CMatrix4f xf; + path.sendToBlender(conn, "PATH"sv, &xf); + conn.saveBlend(); + } +#endif + + athena::io::FileWriter w(outPath.getAbsolutePath()); + path.write(w); + int64_t rem = w.position() % 32; + if (rem) + for (int64_t i = 0; i < 32 - rem; ++i) + w.writeUByte(0xff); + return true; +} + +} // namespace DataSpec::DNAMP1 \ No newline at end of file diff --git a/DataSpec/DNACommon/PATH.hpp b/DataSpec/DNACommon/PATH.hpp new file mode 100644 index 000000000..67dc2e64d --- /dev/null +++ b/DataSpec/DNACommon/PATH.hpp @@ -0,0 +1,74 @@ +#pragma once + +#include "DataSpec/DNACommon/DNACommon.hpp" +#include "DataSpec/DNACommon/PAK.hpp" + +namespace DataSpec::DNAPATH { +struct PATH : BigDNA { + using PathMesh = hecl::blender::PathMesh; + + AT_DECL_DNA + Value version; + + struct Node : BigDNA { + AT_DECL_DNA + Value position; + Value normal; + }; + Value nodeCount; + Vector nodes; + + struct Link : BigDNA { + AT_DECL_DNA + Value nodeIdx; + Value regionIdx; + Value width2d; + Value oneOverWidth2d; + }; + Value linkCount; + Vector links; + + struct Region : BigDNA { + AT_DECL_DNA + Value nodeCount; + Value nodeStart; + Value linkCount; + Value linkStart; + Value meshIndexMask; + Value meshTypeMask; + Value height; + Value normal; + Value regionIdx; + Value centroid; + Value aabb[2]; + Value regionIdxPtr; + }; + Value regionCount; + Vector regions; + + Vector bitmap1; + Vector bitmap2; + Vector bitmap3; + + Value octreeRegionLookupCount; + Vector octreeRegionLookup; + + struct OctreeNode : BigDNA { + AT_DECL_DNA + Value isLeaf; + Value aabb[2]; + Value centroid; + Value children[8]; + Value regionCount; + Value regionStart; + }; + Value octreeNodeCount; + Vector octree; + + void sendToBlender(hecl::blender::Connection& conn, std::string_view entryName, const zeus::CMatrix4f* xf, + const std::string& areaPath); + + static bool Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, + const PathMesh& mesh, hecl::blender::Token& btok); +}; +} // namespace DataSpec::DNAMP1 diff --git a/DataSpec/DNAMP1/CMakeLists.txt b/DataSpec/DNAMP1/CMakeLists.txt index 3520e76c4..12f703bbb 100644 --- a/DataSpec/DNAMP1/CMakeLists.txt +++ b/DataSpec/DNAMP1/CMakeLists.txt @@ -11,7 +11,6 @@ make_dnalist(PAK CINF CSKR EVNT - PATH CMDLMaterials MREA DeafBabe diff --git a/DataSpec/DNAMP1/PATH.cpp b/DataSpec/DNAMP1/PATH.cpp index 506995484..68dd16fdf 100644 --- a/DataSpec/DNAMP1/PATH.cpp +++ b/DataSpec/DNAMP1/PATH.cpp @@ -1,184 +1,8 @@ -#include "PATH.hpp" -#include "hecl/Blender/Connection.hpp" -#include "zeus/CAABox.hpp" +#include "DataSpec/DNAMP1/PATH.hpp" #include "DataSpec/DNACommon/AROTBuilder.hpp" +#include "hecl/Blender/Connection.hpp" namespace DataSpec::DNAMP1 { - -#define DUMP_OCTREE 0 - -#if DUMP_OCTREE -/* octree dumper */ -static void OutputOctreeNode(hecl::blender::PyOutStream& os, int idx, const zeus::CAABox& aabb) { - const zeus::CVector3f pos = aabb.center(); - const zeus::CVector3f extent = aabb.extents(); - os.format( - "obj = bpy.data.objects.new('Leaf_%d', None)\n" - "bpy.context.scene.collection.objects.link(obj)\n" - "obj.location = (%f,%f,%f)\n" - "obj.scale = (%f,%f,%f)\n" - "obj.empty_display_type = 'CUBE'\n" - "obj.layers[1] = True\n" - "obj.layers[0] = False\n", idx, - pos.x(), pos.y(), pos.z(), extent.x(), extent.y(), extent.z()); -} -#endif - -void PATH::sendToBlender(hecl::blender::Connection& conn, std::string_view entryName, const zeus::CMatrix4f* xf, - const std::string& areaPath) { - /* Open Py Stream and read sections */ - hecl::blender::PyOutStream os = conn.beginPythonOut(true); - os << - "import bpy\n" - "import bmesh\n" - "from mathutils import Vector, Matrix\n" - "\n" - "bpy.types.Material.retro_path_idx_mask = bpy.props.IntProperty(name='Retro: Path Index Mask')\n" - "bpy.types.Material.retro_path_type_mask = bpy.props.IntProperty(name='Retro: Path Type Mask')\n" - "\n" - "material_dict = {}\n" - "material_index = []\n" - "def make_ground_material(idxMask):\n" - " mat = bpy.data.materials.new('Ground %X' % idxMask)\n" - " mat.diffuse_color = (0.8, 0.460, 0.194, 1.0)\n" - " return mat\n" - "def make_flyer_material(idxMask):\n" - " mat = bpy.data.materials.new('Flyer %X' % idxMask)\n" - " mat.diffuse_color = (0.016, 0.8, 0.8, 1.0)\n" - " return mat\n" - "def make_swimmer_material(idxMask):\n" - " mat = bpy.data.materials.new('Swimmer %X' % idxMask)\n" - " mat.diffuse_color = (0.074, 0.293, 0.8, 1.0)\n" - " return mat\n" - "def select_material(meshIdxMask, meshTypeMask):\n" - " key = (meshIdxMask, meshTypeMask)\n" - " if key in material_index:\n" - " return material_index.index(key)\n" - " elif key in material_dict:\n" - " material_index.append(key)\n" - " return len(material_index)-1\n" - " else:\n" - " if meshTypeMask == 0x2:\n" - " mat = make_flyer_material(meshIdxMask)\n" - " elif meshTypeMask == 0x4:\n" - " mat = make_swimmer_material(meshIdxMask)\n" - " else:\n" - " mat = make_ground_material(meshIdxMask)\n" - " mat.retro_path_idx_mask = meshIdxMask\n" - " mat.retro_path_type_mask = meshTypeMask\n" - " material_dict[key] = mat\n" - " material_index.append(key)\n" - " return len(material_index)-1\n" - "\n"; - os.format(fmt("bpy.context.scene.name = '{}'\n"), entryName); - os << - "# Clear Scene\n" - "if len(bpy.data.collections):\n" - " bpy.data.collections.remove(bpy.data.collections[0])\n" - "\n" - "bm = bmesh.new()\n" - "height_lay = bm.faces.layers.float.new('Height')\n"; - - for (const Node& n : nodes) { - zeus::simd_floats f(n.position.simd); - os.format(fmt("bm.verts.new(({},{},{}))\n"), f[0], f[1], f[2]); - } - - os << "bm.verts.ensure_lookup_table()\n"; - - for (const Region& r : regions) { - os << "tri_verts = []\n"; - for (atUint32 i = 0; i < r.nodeCount; ++i) - os.format(fmt("tri_verts.append(bm.verts[{}])\n"), r.nodeStart + i); - - os.format(fmt( - "face = bm.faces.get(tri_verts)\n" - "if face is None:\n" - " face = bm.faces.new(tri_verts)\n" - " face.normal_flip()\n" - "face.material_index = select_material(0x{:04X}, 0x{:04X})\n" - "face.smooth = False\n" - "face[height_lay] = {}\n" - "\n"), - r.meshIndexMask, r.meshTypeMask, r.height); - -#if 0 - const zeus::CVector3f center = xf->multiplyOneOverW(r.centroid); - zeus::CAABox aabb(xf->multiplyOneOverW(r.aabb[0]), xf->multiplyOneOverW(r.aabb[1])); - os.format(fmt("aabb = bpy.data.objects.new('AABB', None)\n") - "aabb.location = (%f,%f,%f)\n" - "aabb.scale = (%f,%f,%f)\n" - "aabb.empty_display_type = 'CUBE'\n" - "bpy.context.scene.collection.objects.link(aabb)\n" - "centr = bpy.data.objects.new('Center', None)\n" - "centr.location = (%f,%f,%f)\n" - "bpy.context.scene.collection.objects.link(centr)\n", - aabb.min[0] + (aabb.max[0] - aabb.min[0]) / 2.f, - aabb.min[1] + (aabb.max[1] - aabb.min[1]) / 2.f, - aabb.min[2] + (aabb.max[2] - aabb.min[2]) / 2.f, - (aabb.max[0] - aabb.min[0]) / 2.f, - (aabb.max[1] - aabb.min[1]) / 2.f, - (aabb.max[2] - aabb.min[2]) / 2.f, - center.x(), center.y(), center.z()); -#endif - } - -#if 0 - for (const Node& n : nodes) { - zeus::simd_floats f(n.position.simd); - zeus::simd_floats no(n.position.simd + n.normal.simd); - os.format(fmt("v = bm.verts.new((%f,%f,%f))\n") - "v2 = bm.verts.new((%f,%f,%f))\n" - "bm.edges.new((v, v2))\n", f[0], f[1], f[2], no[0], no[1], no[2]); - } -#endif - - os << "bmesh.ops.remove_doubles(bm, verts=bm.verts, dist=0.001)\n" - "path_mesh = bpy.data.meshes.new('PATH')\n" - "bm.to_mesh(path_mesh)\n" - "path_mesh_obj = bpy.data.objects.new(path_mesh.name, path_mesh)\n" - "\n" - "for mat_name in material_index:\n" - " mat = material_dict[mat_name]\n" - " path_mesh.materials.append(mat)\n" - "\n" - "bpy.context.scene.collection.objects.link(path_mesh_obj)\n" - "path_mesh_obj.display_type = 'SOLID'\n" - "bpy.context.scene.hecl_path_obj = path_mesh_obj.name\n" - "\n"; - - if (xf) { - const zeus::CMatrix4f& w = *xf; - zeus::simd_floats xfMtxF[4]; - for (int i = 0; i < 4; ++i) - w.m[i].mSimd.copy_to(xfMtxF[i]); - os.format(fmt( - "mtx = Matrix((({},{},{},{}),({},{},{},{}),({},{},{},{}),(0.0,0.0,0.0,1.0)))\n" - "mtxd = mtx.decompose()\n" - "path_mesh_obj.rotation_mode = 'QUATERNION'\n" - "path_mesh_obj.location = mtxd[0]\n" - "path_mesh_obj.rotation_quaternion = mtxd[1]\n" - "path_mesh_obj.scale = mtxd[2]\n"), - xfMtxF[0][0], xfMtxF[1][0], xfMtxF[2][0], xfMtxF[3][0], xfMtxF[0][1], xfMtxF[1][1], xfMtxF[2][1], xfMtxF[3][1], - xfMtxF[0][2], xfMtxF[1][2], xfMtxF[2][2], xfMtxF[3][2]); - } - -#if DUMP_OCTREE - { - int idx = 0; - for (const auto& n : octree) { - if (n.isLeaf) - OutputOctreeNode(os, idx, zeus::CAABox(n.aabb[0], n.aabb[1])); - ++idx; - } - } -#endif - - os.linkBackground(fmt::format(fmt("//{}"), areaPath)); - os.centerView(); - os.close(); -} - bool PATH::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, PAKRouter& pakRouter, const PAK::Entry& entry, bool force, hecl::blender::Token& btok, std::function fileChanged) { @@ -200,45 +24,4 @@ bool PATH::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: path.sendToBlender(conn, pakRouter.getBestEntryName(entry, false), xf, areaPath); return conn.saveBlend(); } - -bool PATH::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, - const PathMesh& mesh, hecl::blender::Token& btok) { - athena::io::MemoryReader r(mesh.data.data(), mesh.data.size()); - PATH path; - path.read(r); - if (!path.regions.empty()) { - AROTBuilder octreeBuilder; - octreeBuilder.buildPath(path); - } else { - path.octreeNodeCount = 1; - path.octree.emplace_back(); - OctreeNode& n = path.octree.back(); - n.isLeaf = 1; - n.aabb[0] = zeus::CVector3f{FLT_MAX, FLT_MAX, FLT_MAX}; - n.aabb[1] = zeus::CVector3f{-FLT_MAX, -FLT_MAX, -FLT_MAX}; - for (int i = 0; i < 8; ++i) - n.children[i] = 0xffffffff; - } - -#if DUMP_OCTREE - { - hecl::blender::Connection& conn = btok.getBlenderConnection(); - if (!conn.createBlend(inPath.getWithExtension(_SYS_STR(".octree.blend"), true), hecl::blender::BlendType::PathMesh)) - return false; - - zeus::CMatrix4f xf; - path.sendToBlender(conn, "PATH"sv, &xf); - conn.saveBlend(); - } -#endif - - athena::io::FileWriter w(outPath.getAbsolutePath()); - path.write(w); - int64_t rem = w.position() % 32; - if (rem) - for (int64_t i = 0; i < 32 - rem; ++i) - w.writeUByte(0xff); - return true; -} - -} // namespace DataSpec::DNAMP1 \ No newline at end of file +} \ No newline at end of file diff --git a/DataSpec/DNAMP1/PATH.hpp b/DataSpec/DNAMP1/PATH.hpp index 284a27fa0..5b954559b 100644 --- a/DataSpec/DNAMP1/PATH.hpp +++ b/DataSpec/DNAMP1/PATH.hpp @@ -1,79 +1,11 @@ #pragma once - -#include "DataSpec/DNACommon/DNACommon.hpp" -#include "DataSpec/DNACommon/PAK.hpp" -#include "DNAMP1.hpp" +#include "DataSpec/DNACommon/PATH.hpp" +#include "DataSpec/DNAMP1/DNAMP1.hpp" namespace DataSpec::DNAMP1 { -struct PATH : BigDNA { - using PathMesh = hecl::blender::PathMesh; - - AT_DECL_DNA - Value version; - - struct Node : BigDNA { - AT_DECL_DNA - Value position; - Value normal; - }; - Value nodeCount; - Vector nodes; - - struct Link : BigDNA { - AT_DECL_DNA - Value nodeIdx; - Value regionIdx; - Value width2d; - Value oneOverWidth2d; - }; - Value linkCount; - Vector links; - - struct Region : BigDNA { - AT_DECL_DNA - Value nodeCount; - Value nodeStart; - Value linkCount; - Value linkStart; - Value meshIndexMask; - Value meshTypeMask; - Value height; - Value normal; - Value regionIdx; - Value centroid; - Value aabb[2]; - Value regionIdxPtr; - }; - Value regionCount; - Vector regions; - - Vector bitmap1; - Vector bitmap2; - Vector bitmap3; - - Value octreeRegionLookupCount; - Vector octreeRegionLookup; - - struct OctreeNode : BigDNA { - AT_DECL_DNA - Value isLeaf; - Value aabb[2]; - Value centroid; - Value children[8]; - Value regionCount; - Value regionStart; - }; - Value octreeNodeCount; - Vector octree; - - void sendToBlender(hecl::blender::Connection& conn, std::string_view entryName, const zeus::CMatrix4f* xf, - const std::string& areaPath); - +struct PATH : DNAPATH::PATH { static bool Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, PAKRouter& pakRouter, const PAK::Entry& entry, bool force, hecl::blender::Token& btok, std::function fileChanged); - - static bool Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, - const PathMesh& mesh, hecl::blender::Token& btok); }; -} // namespace DataSpec::DNAMP1 +} // namespace DataSpec::DNAMP1 \ No newline at end of file diff --git a/DataSpec/DNAMP2/CMakeLists.txt b/DataSpec/DNAMP2/CMakeLists.txt index 504d14541..84b43fe51 100644 --- a/DataSpec/DNAMP2/CMakeLists.txt +++ b/DataSpec/DNAMP2/CMakeLists.txt @@ -23,6 +23,7 @@ set(DNAMP2_SOURCES MREA.cpp MAPA.hpp MAPU.hpp + PATH.hpp PATH.cpp AFSM.hpp STRG.hpp STRG.cpp) diff --git a/DataSpec/DNAMP2/DNAMP2.cpp b/DataSpec/DNAMP2/DNAMP2.cpp index d95d84fe1..679a0e8cf 100644 --- a/DataSpec/DNAMP2/DNAMP2.cpp +++ b/DataSpec/DNAMP2/DNAMP2.cpp @@ -8,6 +8,7 @@ #include "MREA.hpp" #include "MAPA.hpp" #include "MAPU.hpp" +#include "PATH.hpp" #include "AFSM.hpp" #include "SAVW.hpp" #include "AGSC.hpp" @@ -171,6 +172,18 @@ void PAKBridge::addCMDLRigPairs(PAKRouter& pakRouter, CharacterAssoci } } +void PAKBridge::addPATHToMREA(PAKRouter& pakRouter, + std::unordered_map& pathToMrea) const { + for (const auto& [id, entry] : m_pak.m_entries) { + if (entry.type == FOURCC('MREA')) { + PAKEntryReadStream rs = entry.beginReadStream(m_node); + UniqueID32 pathID = MREA::GetPATHId(rs); + if (pathID.isValid()) + pathToMrea[pathID] = id; + } + } +} + static const atVec4f BottomRow = {{0.f, 0.f, 0.f, 1.f}}; void PAKBridge::addMAPATransforms(PAKRouter& pakRouter, @@ -190,6 +203,18 @@ void PAKBridge::addMAPATransforms(PAKRouter& pakRouter, fmt::format(fmt(_SYS_STR("!name_{}.yaml")), mlvl.worldNameId)); for (const MLVL::Area& area : mlvl.areas) { +#if 0 + { + /* Get PATH transform */ + const nod::Node* areaNode; + const PAK::Entry* areaEntry = pakRouter.lookupEntry(area.areaMREAId, &areaNode); + PAKEntryReadStream rs = areaEntry->beginReadStream(*areaNode); + UniqueID32 pathId = MREA::GetPATHId(rs); + if (pathId.isValid()) + addTo[pathId] = zeus::CMatrix4f(area.transformMtx[0], area.transformMtx[1], area.transformMtx[2], BottomRow) + .transposed(); + } +#endif hecl::ProjectPath areaDirPath = pakRouter.getWorking(area.areaMREAId).getParentPath(); if (area.areaNameId.isValid()) pathOverrides[area.areaNameId] = hecl::ProjectPath(areaDirPath, @@ -247,6 +272,8 @@ ResExtractor PAKBridge::LookupExtractor(const nod::Node& pakNode, con return {MAPA::Extract, {_SYS_STR(".blend")}, 4}; case SBIG('MAPU'): return {MAPU::Extract, {_SYS_STR(".blend")}, 5}; +// case SBIG('PATH'): +// return {PATH::Extract, {_SYS_STR(".blend")}, 5}; case SBIG('FSM2'): return {DNAFSM2::ExtractFSM2, {_SYS_STR(".yaml")}}; case SBIG('FONT'): diff --git a/DataSpec/DNAMP2/DNAMP2.hpp b/DataSpec/DNAMP2/DNAMP2.hpp index 279bba2c3..ee62edc12 100644 --- a/DataSpec/DNAMP2/DNAMP2.hpp +++ b/DataSpec/DNAMP2/DNAMP2.hpp @@ -31,6 +31,9 @@ public: void addCMDLRigPairs(PAKRouter& pakRouter, CharacterAssociations& charAssoc) const; + void addPATHToMREA(PAKRouter& pakRouter, + std::unordered_map& pathToMrea) const; + void addMAPATransforms(PAKRouter& pakRouter, std::unordered_map& addTo, std::unordered_map& pathOverrides) const; }; diff --git a/DataSpec/DNAMP2/MREA.cpp b/DataSpec/DNAMP2/MREA.cpp index ba2bd6adb..01c39e07a 100644 --- a/DataSpec/DNAMP2/MREA.cpp +++ b/DataSpec/DNAMP2/MREA.cpp @@ -296,5 +296,22 @@ bool MREA::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: return conn.saveBlend(); } +UniqueID32 MREA::GetPATHId(PAKEntryReadStream& rs) { + /* Do extract */ + Header head; + head.read(rs); + rs.seekAlign32(); + + /* Skip to PATH */ + atUint32 curSec = 0; + atUint64 secStart = rs.position(); + while (curSec != head.pathSecIdx) + secStart += head.secSizes[curSec++]; + if (!head.secSizes[curSec]) + return {}; + rs.seek(secStart, athena::SeekOrigin::Begin); + return {rs}; +} + } // namespace DNAMP2 } // namespace DataSpec diff --git a/DataSpec/DNAMP2/MREA.hpp b/DataSpec/DNAMP2/MREA.hpp index 5e678d5b7..6dd18b551 100644 --- a/DataSpec/DNAMP2/MREA.hpp +++ b/DataSpec/DNAMP2/MREA.hpp @@ -118,6 +118,8 @@ struct MREA { Value aabb[2]; }; + static UniqueID32 GetPATHId(PAKEntryReadStream& rs); + static bool Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, PAKRouter& pakRouter, const DNAMP2::PAK::Entry& entry, bool, hecl::blender::Token& btok, std::function); diff --git a/DataSpec/DNAMP2/PATH.cpp b/DataSpec/DNAMP2/PATH.cpp new file mode 100644 index 000000000..058fd5243 --- /dev/null +++ b/DataSpec/DNAMP2/PATH.cpp @@ -0,0 +1,26 @@ +#include "DataSpec/DNAMP2/PATH.hpp" +#include "hecl/Blender/Connection.hpp" + +namespace DataSpec::DNAMP2 { +bool PATH::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, + PAKRouter& pakRouter, const PAK::Entry& entry, bool force, hecl::blender::Token& btok, + std::function fileChanged) { + PATH path; + path.read(rs); + hecl::blender::Connection& conn = btok.getBlenderConnection(); + if (!conn.createBlend(outPath, hecl::blender::BlendType::PathMesh)) + return false; + + std::string areaPath; + for (const auto& ent : hecl::DirectoryEnumerator(outPath.getParentPath().getAbsolutePath())) { + if (hecl::StringUtils::BeginsWith(ent.m_name, _SYS_STR("!area_"))) { + areaPath = hecl::SystemUTF8Conv(ent.m_name).str(); + break; + } + } + + const zeus::CMatrix4f* xf = pakRouter.lookupMAPATransform(entry.id); + path.sendToBlender(conn, pakRouter.getBestEntryName(entry, false), xf, areaPath); + return conn.saveBlend(); +} +} \ No newline at end of file diff --git a/DataSpec/DNAMP2/PATH.hpp b/DataSpec/DNAMP2/PATH.hpp new file mode 100644 index 000000000..fd8e0ab3e --- /dev/null +++ b/DataSpec/DNAMP2/PATH.hpp @@ -0,0 +1,14 @@ +#pragma once +#include "DataSpec/DNACommon/PATH.hpp" +#include "DataSpec/DNAMP2/DNAMP2.hpp" + +namespace DataSpec::DNAMP2 { +struct PATH : DNAPATH::PATH { + static bool Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, + PAKRouter& pakRouter, const PAK::Entry& entry, bool force, hecl::blender::Token& btok, + std::function fileChanged); + + static bool Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, + const PathMesh& mesh, hecl::blender::Token& btok); +}; +} \ No newline at end of file diff --git a/DataSpec/SpecMP1.cpp b/DataSpec/SpecMP1.cpp index ddf973351..4e0915763 100644 --- a/DataSpec/SpecMP1.cpp +++ b/DataSpec/SpecMP1.cpp @@ -661,7 +661,7 @@ struct SpecMP1 : SpecBase { hecl::blender::Token& btok, FCookProgress progress) override { PathMesh mesh = ds.compilePathMesh(); ds.close(); - DNAMP1::PATH::Cook(out, in, mesh, btok); + DNAPATH::PATH::Cook(out, in, mesh, btok); } void cookActor(const hecl::ProjectPath& out, const hecl::ProjectPath& in, BlendStream& ds, bool fast, diff --git a/DataSpec/SpecMP2.cpp b/DataSpec/SpecMP2.cpp index 47a8e96cb..c6b76e313 100644 --- a/DataSpec/SpecMP2.cpp +++ b/DataSpec/SpecMP2.cpp @@ -9,6 +9,7 @@ #include "DNAMP2/MAPA.hpp" #include "DNAMP1/CSNG.hpp" #include "DNACommon/MAPU.hpp" +#include "DNACommon/PATH.hpp" #include "hecl/ClientProcess.hpp" #include "hecl/Blender/Connection.hpp" @@ -287,7 +288,11 @@ struct SpecMP2 : SpecBase { hecl::blender::Token& btok, FCookProgress progress) override {} void cookPathMesh(const hecl::ProjectPath& out, const hecl::ProjectPath& in, BlendStream& ds, bool fast, - hecl::blender::Token& btok, FCookProgress progress) override {} + hecl::blender::Token& btok, FCookProgress progress) override { + PathMesh mesh = ds.compilePathMesh(); + ds.close(); + DNAPATH::PATH::Cook(out, in, mesh, btok); + } void cookActor(const hecl::ProjectPath& out, const hecl::ProjectPath& in, BlendStream& ds, bool fast, hecl::blender::Token& btok, FCookProgress progress) override {} diff --git a/Runtime/MP1/MP1.hpp b/Runtime/MP1/MP1.hpp index 397031000..cf25985ec 100644 --- a/Runtime/MP1/MP1.hpp +++ b/Runtime/MP1/MP1.hpp @@ -4,7 +4,7 @@ #define MP1_USE_BOO 0 #endif #ifndef MP1_VARIABLE_DELTA_TIME -#define MP1_VARIABLE_DELTA_TIME 0 +#define MP1_VARIABLE_DELTA_TIME 1 #endif #include "IMain.hpp" From 0c3d6c7f27bbb17ca6bedc3600e17ff96598824b Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Tue, 24 Mar 2020 23:13:31 -0700 Subject: [PATCH 003/224] Initiaal material imps --- DataSpec/DNAMP1/CMDLMaterials.cpp | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/DataSpec/DNAMP1/CMDLMaterials.cpp b/DataSpec/DNAMP1/CMDLMaterials.cpp index 61aac9a43..c6132182f 100644 --- a/DataSpec/DNAMP1/CMDLMaterials.cpp +++ b/DataSpec/DNAMP1/CMDLMaterials.cpp @@ -568,6 +568,12 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI case 0x2523A379: /* RetroDynamicShader: Emissive*Dynamic, Specular, Reflection, Alpha=1.0 */ _GenerateRootShader(out, "RetroDynamicShader", "Emissive"_tex, "Specular"_tex, "Reflection"_tex); break; + case 0x07AA75D7: + _GenerateRootShader(out, "RetroDynamicShader", "Diffuse"_tex, "Emissive"_tex); + break; + case 0x03FEE002: + _GenerateRootShader(out, "RetroDynamicShader", "Diffuse"_tex, "Emissive"_tex, "Specular"_tex); + break; case 0x25E85017: /* RetroShader: Lightmap, KColorDiffuse, Alpha=KAlpha */ _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_kcol, "Alpha"_kcola); break; @@ -610,12 +616,6 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI case 0x54A92F25: /* RetroShader: ObjLightmap, KColorDiffuse, Alpha=KAlpha */ _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_kcol, "Alpha"_kcola); break; - case 0x07AA75D7: - /* TODO: Properly implement TEV configuration: - A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV - A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV - HasIndirect: false HasLightmap: false - */ case 0x72BEDDAC: /* TODO: Properly implement TEV configuration: A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_ZERO -> TEVREG0 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG0 @@ -625,13 +625,6 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI A:CC_ZERO B:CC_C2 C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV HasIndirect: false HasLightmap: true */ - case 0x03FEE002: - /* TODO: Properly implement TEV configuration: - A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV - A:CC_ZERO B:CC_TEXC C:CC_ONE D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV - A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV - HasIndirect: false HasLightmap: false - */ case 0xF4DA0A86: /* TODO: Properly implement TEV configuration: A:CC_ZERO B:CC_RASC C:CC_KONST D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV From 5b0a4b5f606158466743bc5ebd7bae8192fe0345 Mon Sep 17 00:00:00 2001 From: Jack Andersen Date: Wed, 8 Apr 2020 16:24:18 -1000 Subject: [PATCH 004/224] Implement MP2 shader extraction presets --- DataSpec/Blender/RetroMasterShader.py | 29 ++++- DataSpec/DNAMP1/CMDLMaterials.cpp | 169 +++++++++----------------- hecl | 2 +- 3 files changed, 83 insertions(+), 117 deletions(-) diff --git a/DataSpec/Blender/RetroMasterShader.py b/DataSpec/Blender/RetroMasterShader.py index 6e49ee676..3d13f9625 100644 --- a/DataSpec/Blender/RetroMasterShader.py +++ b/DataSpec/Blender/RetroMasterShader.py @@ -58,6 +58,8 @@ def make_retro_shader(): lightmap_input.default_value = (0.0, 0.0, 0.0, 0.0) diffuse_input = new_grp.inputs.new('NodeSocketColor', 'Diffuse') diffuse_input.default_value = (0.0, 0.0, 0.0, 0.0) + diffuse_mod_input = new_grp.inputs.new('NodeSocketColor', 'DiffuseMod') + diffuse_mod_input.default_value = (1.0, 1.0, 1.0, 1.0) emissive_input = new_grp.inputs.new('NodeSocketColor', 'Emissive') emissive_input.default_value = (0.0, 0.0, 0.0, 0.0) specular_input = new_grp.inputs.new('NodeSocketColor', 'Specular') @@ -72,6 +74,10 @@ def make_retro_shader(): alpha_input.default_value = 1.0 alpha_input.min_value = 0.0 alpha_input.max_value = 1.0 + alpha_mod_input = new_grp.inputs.new('NodeSocketFloatFactor', 'AlphaMod') + alpha_mod_input.default_value = 1.0 + alpha_mod_input.min_value = 0.0 + alpha_mod_input.max_value = 1.0 new_grp.use_fake_user = True # Group inputs @@ -108,6 +114,17 @@ def make_retro_shader(): new_shader_model_mix1 = new_grp.nodes.new('ShaderNodeMixShader') new_shader_model_mix1.location = (-760, 340) + # Multiply (Multiples diffuse with diffusemod) + diffuse_mult = new_grp.nodes.new('ShaderNodeMixRGB') + diffuse_mult.location = (-1094, 122) + diffuse_mult.blend_type = 'MULTIPLY' + diffuse_mult.inputs['Fac'].default_value = 1.0 + + # Multiply (Multiples alpha with alphamod) + alpha_mult = new_grp.nodes.new('ShaderNodeMath') + alpha_mult.location = (-1094, -178) + alpha_mult.operation = 'MULTIPLY' + # Multiply (Multiplies static lightmap with diffuse) lightmap_mult = new_grp.nodes.new('ShaderNodeMixRGB') lightmap_mult.location = (-944, 122) @@ -164,17 +181,21 @@ def make_retro_shader(): mat_out.location = (150, -88) # Links + new_grp.links.new(grp_in.outputs['Diffuse'], diffuse_mult.inputs['Color1']) + new_grp.links.new(grp_in.outputs['DiffuseMod'], diffuse_mult.inputs['Color2']) + new_grp.links.new(grp_in.outputs['Alpha'], alpha_mult.inputs[0]) + new_grp.links.new(grp_in.outputs['AlphaMod'], alpha_mult.inputs[1]) new_grp.links.new(grp_in.outputs['Lightmap'], lightmap_mult.inputs['Color1']) - new_grp.links.new(grp_in.outputs['Diffuse'], lightmap_mult.inputs['Color2']) - new_grp.links.new(grp_in.outputs['Diffuse'], diffuse_bdsf.inputs['Color']) - new_grp.links.new(grp_in.outputs['Diffuse'], principled_bsdf.inputs['Base Color']) + new_grp.links.new(diffuse_mult.outputs['Color'], lightmap_mult.inputs['Color2']) + new_grp.links.new(diffuse_mult.outputs['Color'], diffuse_bdsf.inputs['Color']) + new_grp.links.new(diffuse_mult.outputs['Color'], principled_bsdf.inputs['Base Color']) new_grp.links.new(grp_in.outputs['Emissive'], emissive_add_shader.inputs[0]) new_grp.links.new(grp_in.outputs['Specular'], specular_mult.inputs['Color1']) new_grp.links.new(grp_in.outputs['Specular'], principled_bsdf.inputs['Specular']) new_grp.links.new(grp_in.outputs['ExtendedSpecular'], extended_specular_mult.inputs['Color1']) new_grp.links.new(grp_in.outputs['Reflection'], specular_mult.inputs['Color2']) new_grp.links.new(grp_in.outputs['Reflection'], extended_specular_mult.inputs['Color2']) - new_grp.links.new(grp_in.outputs['Alpha'], alpha_mix.inputs['Fac']) + new_grp.links.new(alpha_mult.outputs[0], alpha_mix.inputs['Fac']) new_grp.links.new(new_shader_model.outputs['Value'], new_shader_model_mix1.inputs[0]) new_grp.links.new(diffuse_bdsf.outputs['BSDF'], new_shader_model_mix1.inputs[1]) new_grp.links.new(grp_in.outputs['Specular'], invert.inputs['Color']) diff --git a/DataSpec/DNAMP1/CMDLMaterials.cpp b/DataSpec/DNAMP1/CMDLMaterials.cpp index c6132182f..3e51255b6 100644 --- a/DataSpec/DNAMP1/CMDLMaterials.cpp +++ b/DataSpec/DNAMP1/CMDLMaterials.cpp @@ -524,6 +524,9 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI /* Select appropriate root shader and link textures */ uint32_t hash = _HashTextureConfig(material); switch (hash) { + case 0x03FEE002: /* RetroShader: Diffuse, Emissive, Reflection, Alpha=1.0 */ + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, "Reflection"_tex); + break; case 0x0473AE40: /* RetroShader: Lightmap, Diffuse, Emissive, Alpha=1.0 */ _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex); break; @@ -531,6 +534,9 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, WhiteColorLink("Specular"), "Reflection"_tex); break; + case 0x07AA75D7: /* RetroShader: Diffuse, Emissive, Alpha=DiffuseAlpha */ + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, TexLink("Alpha", 0, true)); + break; case 0x0879D346: /* RetroShader: KColorDiffuse, Alpha=Texture */ _GenerateRootShader(out, "RetroShader", "Diffuse"_kcol, "Alpha"_tex); break; @@ -549,6 +555,10 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI case 0x129B8578: /* RetroShader: KColorDiffuse, Emissive, Alpha=KAlpha */ _GenerateRootShader(out, "RetroShader", "Diffuse"_kcol, "Emissive"_tex, "Alpha"_kcola); break; + case 0x15A00948: /* RetroShader: Diffuse, Emissive, Specular, ExtendedSpecular, Reflection, Alpha=1.0 */ + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, "ExtendedSpecular"_tex, + "Reflection"_tex); + break; case 0x15A3E6E5: /* RetroShader: Diffuse, Alpha=KAlpha */ _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Alpha"_kcola); break; @@ -568,12 +578,6 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI case 0x2523A379: /* RetroDynamicShader: Emissive*Dynamic, Specular, Reflection, Alpha=1.0 */ _GenerateRootShader(out, "RetroDynamicShader", "Emissive"_tex, "Specular"_tex, "Reflection"_tex); break; - case 0x07AA75D7: - _GenerateRootShader(out, "RetroDynamicShader", "Diffuse"_tex, "Emissive"_tex); - break; - case 0x03FEE002: - _GenerateRootShader(out, "RetroDynamicShader", "Diffuse"_tex, "Emissive"_tex, "Specular"_tex); - break; case 0x25E85017: /* RetroShader: Lightmap, KColorDiffuse, Alpha=KAlpha */ _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_kcol, "Alpha"_kcola); break; @@ -603,6 +607,9 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, "IndirectTex"_tex, "Alpha"_kcola); break; + case 0x4184FBCA: /* RetroShader: Lightmap, Diffuse, Emissive, DiffuseAlpha */ + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex, TexLink("Alpha", 1, true)); + break; case 0x47ECF3ED: /* RetroShader: Diffuse, Specular, Reflection, Emissive, Alpha=1.0 */ _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, "Emissive"_tex); break; @@ -616,112 +623,10 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI case 0x54A92F25: /* RetroShader: ObjLightmap, KColorDiffuse, Alpha=KAlpha */ _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_kcol, "Alpha"_kcola); break; - case 0x72BEDDAC: - /* TODO: Properly implement TEV configuration: - A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_ZERO -> TEVREG0 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG0 - A:CC_ZERO B:CC_C0 C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV - A:CC_ZERO B:CC_TEXC C:CC_ONE D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV - A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_TEXC -> TEVREG2 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG2 - A:CC_ZERO B:CC_C2 C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV - HasIndirect: false HasLightmap: true - */ - case 0xF4DA0A86: - /* TODO: Properly implement TEV configuration: - A:CC_ZERO B:CC_RASC C:CC_KONST D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV - A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV - HasIndirect: false HasLightmap: false - */ - case 0xF345C16E: - /* TODO: Properly implement TEV configuration: - A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV - A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV - HasIndirect: false HasLightmap: false - */ - case 0x8C562AB1: - /* TODO: Properly implement TEV configuration: - A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV - A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV - HasIndirect: false HasLightmap: false - */ - case 0xE92F1340: - /* TODO: Properly implement TEV configuration: - A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV - A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_TEXA C:CA_APREV D:CA_ZERO -> TEVPREV - HasIndirect: false HasLightmap: false - */ - case 0xCE06F3F2: - /* TODO: Properly implement TEV configuration: - A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV - A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_TEXA C:CA_APREV D:CA_ZERO -> TEVPREV - HasIndirect: false HasLightmap: false - */ - case 0xC0E3FF1F: - /* TODO: Properly implement TEV configuration: - A:CC_ZERO B:CC_RASC C:CC_KONST D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV - A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_TEXC -> TEVREG2 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG2 - A:CC_ZERO B:CC_C2 C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV - HasIndirect: false HasLightmap: false - */ - case 0xFC2761B8: - /* TODO: Properly implement TEV configuration: - A:CC_ZERO B:CC_C1 C:CC_TEXC D:CC_RASC -> TEVREG0 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG0 - A:CC_ZERO B:CC_C0 C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV - A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_TEXA C:CA_APREV D:CA_ZERO -> TEVPREV - HasIndirect: false HasLightmap: true - */ - case 0xE64D1085: - /* TODO: Properly implement TEV configuration: - A:CC_ZERO B:CC_C1 C:CC_TEXC D:CC_RASC -> TEVREG0 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG0 - A:CC_ZERO B:CC_C0 C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV - A:CC_ZERO B:CC_TEXC C:CC_ONE D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV - A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV - HasIndirect: false HasLightmap: true - */ - case 0xB26E9E2E: - /* TODO: Properly implement TEV configuration: - A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV - A:CC_ZERO B:CC_TEXC C:CC_ONE D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV - A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_TEXC -> TEVREG2 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG2 - A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_C2 -> TEVREG2 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG2 - HasIndirect: false HasLightmap: false - */ - case 0x4184FBCA: - /* TODO: Properly implement TEV configuration: - A:CC_ZERO B:CC_C1 C:CC_TEXC D:CC_RASC -> TEVREG0 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG0 - A:CC_ZERO B:CC_C0 C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV - A:CC_ZERO B:CC_ONE C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV - HasIndirect: false HasLightmap: true - */ - case 0x81106196: - /* TODO: Properly implement TEV configuration: - A:CC_ZERO B:CC_C1 C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV - HasIndirect: false HasLightmap: false - */ - case 0x15A00948: - /* TODO: Properly implement TEV configuration: - A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV - A:CC_ZERO B:CC_TEXC C:CC_ONE D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV - A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_TEXC -> TEVREG2 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG2 - A:CC_ZERO B:CC_RASC C:CC_TEXC D:CC_C2 -> TEVREG2 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG2 - A:CC_ZERO B:CC_C2 C:CC_TEXC D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_APREV -> TEVPREV - HasIndirect: false HasLightmap: false - */ - case 0xFFF3CEBB: - /* TODO: Properly implement TEV configuration: - A:CC_ZERO B:CC_C1 C:CC_TEXC D:CC_RASC -> TEVREG0 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG0 - A:CC_ZERO B:CC_C0 C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV - A:CC_ZERO B:CC_TEXC C:CC_ONE D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV - A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_TEXA C:CA_APREV D:CA_ZERO -> TEVPREV - HasIndirect: false HasLightmap: true - */ - case 0x58BAA415: - /* TODO: Properly implement TEV configuration: - A:CC_ZERO B:CC_C1 C:CC_TEXC D:CC_RASC -> TEVREG0 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG0 - A:CC_ZERO B:CC_C0 C:CC_TEXC D:CC_ZERO -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_TEXA -> TEVPREV - A:CC_ZERO B:CC_TEXC C:CC_ONE D:CC_CPREV -> TEVPREV | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVPREV - A:CC_ZERO B:CC_ZERO C:CC_ZERO D:CC_TEXC -> TEVREG2 | A:CA_ZERO B:CA_ZERO C:CA_ZERO D:CA_KONST -> TEVREG2 - HasIndirect: false HasLightmap: true - */ + case 0x58BAA415: /* RetroShader: Lightmap, Diffuse, Emissive, Alpha=1.0 */ + // TODO: Last stage assigns into unused reg2, perhaps for runtime material mod? + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex); + break; case 0x54C6204C: _GenerateRootShader(out, "RetroShader"); break; @@ -756,6 +661,10 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI case 0x7252CB90: /* RetroShader: Lightmap, Diffuse, Alpha=KAlpha */ _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Alpha"_kcola); break; + case 0x72BEDDAC: /* RetroShader: DiffuseMod, Diffuse, Emissive, Specular, Reflection Alpha=1.0 */ + _GenerateRootShader(out, "RetroShader", "DiffuseMod"_tex, "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, + "Reflection"_tex); + break; case 0x76BEA57E: /* RetroShader: Lightmap, Diffuse, Emissive, Specular, Reflection, Alpha=1.0, IndirectTex */ _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, "Reflection"_tex, "IndirectTex"_tex); @@ -763,6 +672,9 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI case 0x7D6A4487: /* RetroShader: Diffuse, Specular, Reflection, Alpha=DiffuseAlpha */ _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, TexLink("Alpha", 0, true)); break; + case 0x81106196: /* RetroDynamicShader: Emissive, Alpha=1.0 */ + _GenerateRootShader(out, "RetroDynamicShader", "Emissive"_tex); + break; case 0x84319328: /* RetroShader: Reflection, UnusedSpecular?, Alpha=1.0 */ _GenerateRootShader(out, "RetroShader", WhiteColorLink("Specular"), "Reflection"_tex); break; @@ -770,6 +682,9 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, "IndirectTex"_tex, TexLink("Alpha", 0, true)); break; + case 0x8C562AB1: /* RetroShader: Diffuse, Emissive, Alpha=1.0 */ + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex); + break; case 0x8E916C01: /* RetroShader: NULL, all inputs 0 */ _GenerateRootShader(out, "RetroShader"); break; @@ -788,6 +703,13 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI case 0xA187C630: /* RetroShader: Diffuse, Emissive, UnusedReflection?, Alpha=1.0 */ _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex); break; + case 0xB26E9E2E: /* RetroShader: Diffuse, Emissive, Alpha=1.0 */ + // TODO: Last two stages assign into unused reg2, perhaps for runtime material mod? + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex); + break; + case 0xC0E3FF1F: /* RetroShader: KColorDiffuse, Specular, Reflection, Alpha=KAlpha */ + _GenerateRootShader(out, "RetroShader", "Diffuse"_kcol, "Specular"_tex, "Reflection"_tex, "Alpha"_kcola); + break; case 0xC138DCFA: /* RetroShader: Diffuse, Emissive, Alpha=1.0 */ _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex); break; @@ -804,12 +726,19 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI case 0xCD92D4C5: /* RetroShader: Diffuse, Reflection, Alpha=KAlpha */ _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, WhiteColorLink("Specular"), "Reflection"_tex, "Alpha"_kcola); break; + case 0xCE06F3F2: /* RetroShader: Diffuse, Alpha */ + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, TexLink("Alpha", 1, true)); + break; case 0xD73E7728: /* RetroShader: ObjLightmap, Diffuse, Alpha=DiffuseAlpha */ _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, TexLink("Alpha", 1, true)); break; case 0xDB8F01AD: /* RetroDynamicShader: Diffuse*Dynamic, Emissive*Dynamic, UnusedSpecular?, Alpha=1.0 */ _GenerateRootShader(out, "RetroDynamicShader", "Diffuse"_tex, "Emissive"_tex); break; + case 0xE64D1085: /* RetroShader: Lightmap, Diffuse, Emissive, Reflection, Alpha=DiffuseAlpha */ + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex, "Reflection"_tex, + TexLink("Alpha", 1, true)); + break; case 0xE6784B10: /* RetroShader: Lightmap, Diffuse, Specular, Reflection, Alpha=DiffuseAlpha, IndirectTex */ _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Specular"_tex, "Reflection"_tex, "IndirectTex"_tex, TexLink("Alpha", 1, true)); @@ -817,6 +746,9 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI case 0xE68FF182: /* RetroShader: Diffuse, Emissive, Specular, Reflection, Alpha=1.0 */ _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, "Reflection"_tex); break; + case 0xE92F1340: /* RetroShader: Diffuse, Alpha=DiffuseAlpha*AlphaMod */ + _GenerateRootShader(out, "RetroShader", "Diffuse"_tex, TexLink("Alpha", 0, true), TexLink("AlphaMod", 1, true)); + break; case 0xEB4645CF: /* RetroDynamicAlphaShader: Diffuse*Dynamic, Alpha=DiffuseAlpha*Dynamic */ _GenerateRootShader(out, "RetroDynamicAlphaShader", "Diffuse"_tex, TexLink("Alpha", 0, true)); break; @@ -827,6 +759,12 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Specular"_tex, "ExtendedSpecular"_tex, "Reflection"_tex, TexLink("Alpha", 1, true)); break; + case 0xF345C16E: /* RetroShader: Emissive, Reflection, Alpha=1.0 */ + _GenerateRootShader(out, "RetroShader", "Emissive"_tex, "Reflection"_tex); + break; + case 0xF4DA0A86: /* RetroShader: KColorDiffuse, Emissive, Alpha=KAlpha */ + _GenerateRootShader(out, "RetroShader", "Diffuse"_kcol, "Emissive"_tex, "Alpha"_kcola); break; + break; case 0xF559DB08: /* RetroShader: Lightmap, Diffuse, Emissive, Specular, Reflection, Alpha=1.0 */ _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex, "Specular"_tex, "Reflection"_tex); @@ -834,9 +772,16 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI case 0xF9324367: /* RetroShader: Lightmap, Diffuse, Emissive, Alpha=1.0 */ _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex); break; + case 0xFC2761B8: /* RetroShader: Lightmap, Diffuse, Alpha=DiffuseAlpha*AlphaMod */ + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, TexLink("Alpha", 1, true), + TexLink("AlphaMod", 2, true)); + break; case 0xFD95D7FD: /* RetroShader: ObjLightmap, Diffuse, Alpha=DiffuseAlpha */ _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, TexLink("Alpha", 1, true)); break; + case 0xFFF3CEBB: /* RetroShader: Lightmap, Diffuse, Emissive, Alpha */ + _GenerateRootShader(out, "RetroShader", "Lightmap"_tex, "Diffuse"_tex, "Emissive"_tex, TexLink("Alpha", 3, true)); + break; default: _DescribeTEV(material); Log.report(logvisor::Fatal, fmt("Unable to resolve shader hash {:08X}\n"), hash); diff --git a/hecl b/hecl index db10f0c2c..138328b8f 160000 --- a/hecl +++ b/hecl @@ -1 +1 @@ -Subproject commit db10f0c2ca2ea4ab4b779798b041b3bae0d79937 +Subproject commit 138328b8f617071cbe9457f04e9cbb31cef1975e From df229671c4b5d6b73e21696e20fcd2078a44fd35 Mon Sep 17 00:00:00 2001 From: Jack Andersen Date: Wed, 8 Apr 2020 19:19:50 -1000 Subject: [PATCH 005/224] MP2 PATH support --- DataSpec/DNACommon/AROTBuilder.cpp | 29 ++--- DataSpec/DNACommon/AROTBuilder.hpp | 7 +- DataSpec/DNACommon/PATH.cpp | 164 +++++++++++++++-------------- DataSpec/DNACommon/PATH.hpp | 29 ++++- DataSpec/DNAMP1/PATH.hpp | 2 +- DataSpec/DNAMP2/DNAMP2.cpp | 6 +- DataSpec/DNAMP2/MREA.cpp | 50 +++++++-- DataSpec/DNAMP2/MREA.hpp | 1 + DataSpec/DNAMP2/PATH.hpp | 2 +- DataSpec/SpecMP1.cpp | 2 +- DataSpec/SpecMP2.cpp | 2 +- hecl | 2 +- 12 files changed, 181 insertions(+), 115 deletions(-) diff --git a/DataSpec/DNACommon/AROTBuilder.cpp b/DataSpec/DNACommon/AROTBuilder.cpp index 6cdc4a351..6985a98f9 100644 --- a/DataSpec/DNACommon/AROTBuilder.cpp +++ b/DataSpec/DNACommon/AROTBuilder.cpp @@ -272,10 +272,10 @@ void AROTBuilder::Node::pathCountNodesAndLookups(size_t& nodeCount, size_t& look } } -void AROTBuilder::Node::pathWrite(DNAPATH::PATH& path, const zeus::CAABox& curAABB) { +template +void AROTBuilder::Node::pathWrite(DNAPATH::PATH& path, const zeus::CAABox& curAABB) { if (childNodes.empty()) { - path.octree.emplace_back(); - DNAPATH::PATH::OctreeNode& n = path.octree.back(); + auto& n = path.octree.emplace_back(); n.isLeaf = 1; n.aabb[0] = curAABB.min; n.aabb[1] = curAABB.max; @@ -294,8 +294,7 @@ void AROTBuilder::Node::pathWrite(DNAPATH::PATH& path, const zeus::CAABox& curAA children[i] = path.octree.size() - 1; } - path.octree.emplace_back(); - DNAMP1::PATH::OctreeNode& n = path.octree.back(); + auto& n = path.octree.emplace_back(); n.isLeaf = 0; n.aabb[0] = curAABB.min; n.aabb[1] = curAABB.max; @@ -307,6 +306,10 @@ void AROTBuilder::Node::pathWrite(DNAPATH::PATH& path, const zeus::CAABox& curAA } } +template void AROTBuilder::Node::pathWrite<4>(DNAPATH::PATH<4>& path, const zeus::CAABox& curAABB); +template void AROTBuilder::Node::pathWrite<6>(DNAPATH::PATH<6>& path, const zeus::CAABox& curAABB); +template void AROTBuilder::Node::pathWrite<7>(DNAPATH::PATH<7>& path, const zeus::CAABox& curAABB); + void AROTBuilder::build(std::vector>& secs, const zeus::CAABox& fullAabb, const std::vector& meshAabbs, const std::vector& meshes) { /* Recursively split */ @@ -377,8 +380,7 @@ std::pair, uint32_t> AROTBuilder::buildCol(const ColM std::vector triBoxes; triBoxes.reserve(mesh.trianges.size()); for (const ColMesh::Triangle& tri : mesh.trianges) { - triBoxes.emplace_back(); - zeus::CAABox& aabb = triBoxes.back(); + zeus::CAABox& aabb = triBoxes.emplace_back(); for (int e = 0; e < 3; ++e) { const ColMesh::Edge& edge = mesh.edges[tri.edges[e]]; for (int v = 0; v < 2; ++v) { @@ -401,15 +403,14 @@ std::pair, uint32_t> AROTBuilder::buildCol(const ColM return {std::move(ret), totalSize}; } -void AROTBuilder::buildPath(DNAPATH::PATH& path) { +template +void AROTBuilder::buildPath(DNAPATH::PATH& path) { /* Accumulate total AABB and gather region boxes */ std::vector regionBoxes; regionBoxes.reserve(path.regions.size()); zeus::CAABox fullAABB; - for (const DNAPATH::PATH::Region& r : path.regions) { - regionBoxes.emplace_back(r.aabb[0], r.aabb[1]); - fullAABB.accumulateBounds(regionBoxes.back()); - } + for (const auto& r : path.regions) + fullAABB.accumulateBounds(regionBoxes.emplace_back(r.aabb[0], r.aabb[1])); /* Recursively split */ BspNodeType dontCare; @@ -426,4 +427,8 @@ void AROTBuilder::buildPath(DNAPATH::PATH& path) { rootNode.pathWrite(path, fullAABB); } +template void AROTBuilder::buildPath<4>(DNAPATH::PATH<4>& path); +template void AROTBuilder::buildPath<6>(DNAPATH::PATH<6>& path); +template void AROTBuilder::buildPath<7>(DNAPATH::PATH<7>& path); + } // namespace DataSpec diff --git a/DataSpec/DNACommon/AROTBuilder.hpp b/DataSpec/DNACommon/AROTBuilder.hpp index 2ec6f4a57..6395bccaa 100644 --- a/DataSpec/DNACommon/AROTBuilder.hpp +++ b/DataSpec/DNACommon/AROTBuilder.hpp @@ -8,6 +8,7 @@ namespace DataSpec { namespace DNAPATH { +template struct PATH; } @@ -43,13 +44,15 @@ struct AROTBuilder { void writeColNodes(uint8_t*& ptr, const zeus::CAABox& curAABB); void pathCountNodesAndLookups(size_t& nodeCount, size_t& lookupCount); - void pathWrite(DNAPATH::PATH& path, const zeus::CAABox& curAABB); + template + void pathWrite(DNAPATH::PATH& path, const zeus::CAABox& curAABB); } rootNode; void build(std::vector>& secs, const zeus::CAABox& fullAabb, const std::vector& meshAabbs, const std::vector& meshes); std::pair, uint32_t> buildCol(const ColMesh& mesh, BspNodeType& rootOut); - void buildPath(DNAPATH::PATH& path); + template + void buildPath(DNAPATH::PATH& path); }; } // namespace DataSpec diff --git a/DataSpec/DNACommon/PATH.cpp b/DataSpec/DNACommon/PATH.cpp index 16a499d9e..83e42382d 100644 --- a/DataSpec/DNACommon/PATH.cpp +++ b/DataSpec/DNACommon/PATH.cpp @@ -13,71 +13,70 @@ static void OutputOctreeNode(hecl::blender::PyOutStream& os, int idx, const zeus const zeus::CVector3f pos = aabb.center(); const zeus::CVector3f extent = aabb.extents(); os.format( - "obj = bpy.data.objects.new('Leaf_%d', None)\n" - "bpy.context.scene.collection.objects.link(obj)\n" - "obj.location = (%f,%f,%f)\n" - "obj.scale = (%f,%f,%f)\n" - "obj.empty_display_type = 'CUBE'\n" - "obj.layers[1] = True\n" - "obj.layers[0] = False\n", idx, - pos.x(), pos.y(), pos.z(), extent.x(), extent.y(), extent.z()); + "obj = bpy.data.objects.new('Leaf_%d', None)\n" + "bpy.context.scene.collection.objects.link(obj)\n" + "obj.location = (%f,%f,%f)\n" + "obj.scale = (%f,%f,%f)\n" + "obj.empty_display_type = 'CUBE'\n" + "obj.layers[1] = True\n" + "obj.layers[0] = False\n", + idx, pos.x(), pos.y(), pos.z(), extent.x(), extent.y(), extent.z()); } #endif -void PATH::sendToBlender(hecl::blender::Connection& conn, std::string_view entryName, const zeus::CMatrix4f* xf, - const std::string& areaPath) { +template +void PATH::sendToBlender(hecl::blender::Connection& conn, std::string_view entryName, const zeus::CMatrix4f* xf, + const std::string& areaPath) { /* Open Py Stream and read sections */ hecl::blender::PyOutStream os = conn.beginPythonOut(true); - os << - "import bpy\n" - "import bmesh\n" - "from mathutils import Vector, Matrix\n" - "\n" - "bpy.types.Material.retro_path_idx_mask = bpy.props.IntProperty(name='Retro: Path Index Mask')\n" - "bpy.types.Material.retro_path_type_mask = bpy.props.IntProperty(name='Retro: Path Type Mask')\n" - "\n" - "material_dict = {}\n" - "material_index = []\n" - "def make_ground_material(idxMask):\n" - " mat = bpy.data.materials.new('Ground %X' % idxMask)\n" - " mat.diffuse_color = (0.8, 0.460, 0.194, 1.0)\n" - " return mat\n" - "def make_flyer_material(idxMask):\n" - " mat = bpy.data.materials.new('Flyer %X' % idxMask)\n" - " mat.diffuse_color = (0.016, 0.8, 0.8, 1.0)\n" - " return mat\n" - "def make_swimmer_material(idxMask):\n" - " mat = bpy.data.materials.new('Swimmer %X' % idxMask)\n" - " mat.diffuse_color = (0.074, 0.293, 0.8, 1.0)\n" - " return mat\n" - "def select_material(meshIdxMask, meshTypeMask):\n" - " key = (meshIdxMask, meshTypeMask)\n" - " if key in material_index:\n" - " return material_index.index(key)\n" - " elif key in material_dict:\n" - " material_index.append(key)\n" - " return len(material_index)-1\n" - " else:\n" - " if meshTypeMask == 0x2:\n" - " mat = make_flyer_material(meshIdxMask)\n" - " elif meshTypeMask == 0x4:\n" - " mat = make_swimmer_material(meshIdxMask)\n" - " else:\n" - " mat = make_ground_material(meshIdxMask)\n" - " mat.retro_path_idx_mask = meshIdxMask\n" - " mat.retro_path_type_mask = meshTypeMask\n" - " material_dict[key] = mat\n" - " material_index.append(key)\n" - " return len(material_index)-1\n" - "\n"; + os << "import bpy\n" + "import bmesh\n" + "from mathutils import Vector, Matrix\n" + "\n" + "bpy.types.Material.retro_path_idx_mask = bpy.props.IntProperty(name='Retro: Path Index Mask')\n" + "bpy.types.Material.retro_path_type_mask = bpy.props.IntProperty(name='Retro: Path Type Mask')\n" + "\n" + "material_dict = {}\n" + "material_index = []\n" + "def make_ground_material(idxMask):\n" + " mat = bpy.data.materials.new('Ground %X' % idxMask)\n" + " mat.diffuse_color = (0.8, 0.460, 0.194, 1.0)\n" + " return mat\n" + "def make_flyer_material(idxMask):\n" + " mat = bpy.data.materials.new('Flyer %X' % idxMask)\n" + " mat.diffuse_color = (0.016, 0.8, 0.8, 1.0)\n" + " return mat\n" + "def make_swimmer_material(idxMask):\n" + " mat = bpy.data.materials.new('Swimmer %X' % idxMask)\n" + " mat.diffuse_color = (0.074, 0.293, 0.8, 1.0)\n" + " return mat\n" + "def select_material(meshIdxMask, meshTypeMask):\n" + " key = (meshIdxMask, meshTypeMask)\n" + " if key in material_index:\n" + " return material_index.index(key)\n" + " elif key in material_dict:\n" + " material_index.append(key)\n" + " return len(material_index)-1\n" + " else:\n" + " if meshTypeMask == 0x2:\n" + " mat = make_flyer_material(meshIdxMask)\n" + " elif meshTypeMask == 0x4:\n" + " mat = make_swimmer_material(meshIdxMask)\n" + " else:\n" + " mat = make_ground_material(meshIdxMask)\n" + " mat.retro_path_idx_mask = meshIdxMask\n" + " mat.retro_path_type_mask = meshTypeMask\n" + " material_dict[key] = mat\n" + " material_index.append(key)\n" + " return len(material_index)-1\n" + "\n"; os.format(fmt("bpy.context.scene.name = '{}'\n"), entryName); - os << - "# Clear Scene\n" - "if len(bpy.data.collections):\n" - " bpy.data.collections.remove(bpy.data.collections[0])\n" - "\n" - "bm = bmesh.new()\n" - "height_lay = bm.faces.layers.float.new('Height')\n"; + os << "# Clear Scene\n" + "if len(bpy.data.collections):\n" + " bpy.data.collections.remove(bpy.data.collections[0])\n" + "\n" + "bm = bmesh.new()\n" + "height_lay = bm.faces.layers.float.new('Height')\n"; for (const Node& n : nodes) { zeus::simd_floats f(n.position.simd); @@ -91,16 +90,15 @@ void PATH::sendToBlender(hecl::blender::Connection& conn, std::string_view entry for (atUint32 i = 0; i < r.nodeCount; ++i) os.format(fmt("tri_verts.append(bm.verts[{}])\n"), r.nodeStart + i); - os.format(fmt( - "face = bm.faces.get(tri_verts)\n" - "if face is None:\n" - " face = bm.faces.new(tri_verts)\n" - " face.normal_flip()\n" - "face.material_index = select_material(0x{:04X}, 0x{:04X})\n" - "face.smooth = False\n" - "face[height_lay] = {}\n" - "\n"), - r.meshIndexMask, r.meshTypeMask, r.height); + os.format(fmt("face = bm.faces.get(tri_verts)\n" + "if face is None:\n" + " face = bm.faces.new(tri_verts)\n" + " face.normal_flip()\n" + "face.material_index = select_material(0x{:04X}, 0x{:04X})\n" + "face.smooth = False\n" + "face[height_lay] = {}\n" + "\n"), + r.meshIndexMask, r.meshTypeMask, r.height); #if 0 const zeus::CVector3f center = xf->multiplyOneOverW(r.centroid); @@ -152,15 +150,14 @@ void PATH::sendToBlender(hecl::blender::Connection& conn, std::string_view entry zeus::simd_floats xfMtxF[4]; for (int i = 0; i < 4; ++i) w.m[i].mSimd.copy_to(xfMtxF[i]); - os.format(fmt( - "mtx = Matrix((({},{},{},{}),({},{},{},{}),({},{},{},{}),(0.0,0.0,0.0,1.0)))\n" - "mtxd = mtx.decompose()\n" - "path_mesh_obj.rotation_mode = 'QUATERNION'\n" - "path_mesh_obj.location = mtxd[0]\n" - "path_mesh_obj.rotation_quaternion = mtxd[1]\n" - "path_mesh_obj.scale = mtxd[2]\n"), - xfMtxF[0][0], xfMtxF[1][0], xfMtxF[2][0], xfMtxF[3][0], xfMtxF[0][1], xfMtxF[1][1], xfMtxF[2][1], xfMtxF[3][1], - xfMtxF[0][2], xfMtxF[1][2], xfMtxF[2][2], xfMtxF[3][2]); + os.format(fmt("mtx = Matrix((({},{},{},{}),({},{},{},{}),({},{},{},{}),(0.0,0.0,0.0,1.0)))\n" + "mtxd = mtx.decompose()\n" + "path_mesh_obj.rotation_mode = 'QUATERNION'\n" + "path_mesh_obj.location = mtxd[0]\n" + "path_mesh_obj.rotation_quaternion = mtxd[1]\n" + "path_mesh_obj.scale = mtxd[2]\n"), + xfMtxF[0][0], xfMtxF[1][0], xfMtxF[2][0], xfMtxF[3][0], xfMtxF[0][1], xfMtxF[1][1], xfMtxF[2][1], + xfMtxF[3][1], xfMtxF[0][2], xfMtxF[1][2], xfMtxF[2][2], xfMtxF[3][2]); } #if DUMP_OCTREE @@ -179,8 +176,9 @@ void PATH::sendToBlender(hecl::blender::Connection& conn, std::string_view entry os.close(); } -bool PATH::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, - const PathMesh& mesh, hecl::blender::Token& btok) { +template +bool PATH::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, const PathMesh& mesh, + hecl::blender::Token& btok) { athena::io::MemoryReader r(mesh.data.data(), mesh.data.size()); PATH path; path.read(r); @@ -219,4 +217,8 @@ bool PATH::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat return true; } -} // namespace DataSpec::DNAMP1 \ No newline at end of file +template struct PATH<4>; +template struct PATH<6>; +template struct PATH<7>; + +} // namespace DataSpec::DNAPATH \ No newline at end of file diff --git a/DataSpec/DNACommon/PATH.hpp b/DataSpec/DNACommon/PATH.hpp index 67dc2e64d..10ebf1c47 100644 --- a/DataSpec/DNACommon/PATH.hpp +++ b/DataSpec/DNACommon/PATH.hpp @@ -4,7 +4,32 @@ #include "DataSpec/DNACommon/PAK.hpp" namespace DataSpec::DNAPATH { -struct PATH : BigDNA { +template +struct RegionPointers {}; +template <> +struct RegionPointers<4> : BigDNA { + AT_DECL_DNA + Value regionIdxPtr; +}; +template <> +struct RegionPointers<6> : BigDNA { + AT_DECL_DNA + Value unk0; + Value unk1; + Value unk2; + Value regionIdxPtr; +}; +template <> +struct RegionPointers<7> : BigDNA { + AT_DECL_DNA + Value unk0; + Value unk1; + Value unk2; + Value regionIdxPtr; +}; + +template +struct AT_SPECIALIZE_PARMS(4, 6, 7) PATH : BigDNA { using PathMesh = hecl::blender::PathMesh; AT_DECL_DNA @@ -41,7 +66,7 @@ struct PATH : BigDNA { Value regionIdx; Value centroid; Value aabb[2]; - Value regionIdxPtr; + Value> pointers; }; Value regionCount; Vector regions; diff --git a/DataSpec/DNAMP1/PATH.hpp b/DataSpec/DNAMP1/PATH.hpp index 5b954559b..c35bc2b43 100644 --- a/DataSpec/DNAMP1/PATH.hpp +++ b/DataSpec/DNAMP1/PATH.hpp @@ -3,7 +3,7 @@ #include "DataSpec/DNAMP1/DNAMP1.hpp" namespace DataSpec::DNAMP1 { -struct PATH : DNAPATH::PATH { +struct PATH : DNAPATH::PATH<4> { static bool Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, PAKRouter& pakRouter, const PAK::Entry& entry, bool force, hecl::blender::Token& btok, std::function fileChanged); diff --git a/DataSpec/DNAMP2/DNAMP2.cpp b/DataSpec/DNAMP2/DNAMP2.cpp index 679a0e8cf..779369826 100644 --- a/DataSpec/DNAMP2/DNAMP2.cpp +++ b/DataSpec/DNAMP2/DNAMP2.cpp @@ -203,7 +203,6 @@ void PAKBridge::addMAPATransforms(PAKRouter& pakRouter, fmt::format(fmt(_SYS_STR("!name_{}.yaml")), mlvl.worldNameId)); for (const MLVL::Area& area : mlvl.areas) { -#if 0 { /* Get PATH transform */ const nod::Node* areaNode; @@ -214,7 +213,6 @@ void PAKBridge::addMAPATransforms(PAKRouter& pakRouter, addTo[pathId] = zeus::CMatrix4f(area.transformMtx[0], area.transformMtx[1], area.transformMtx[2], BottomRow) .transposed(); } -#endif hecl::ProjectPath areaDirPath = pakRouter.getWorking(area.areaMREAId).getParentPath(); if (area.areaNameId.isValid()) pathOverrides[area.areaNameId] = hecl::ProjectPath(areaDirPath, @@ -272,8 +270,8 @@ ResExtractor PAKBridge::LookupExtractor(const nod::Node& pakNode, con return {MAPA::Extract, {_SYS_STR(".blend")}, 4}; case SBIG('MAPU'): return {MAPU::Extract, {_SYS_STR(".blend")}, 5}; -// case SBIG('PATH'): -// return {PATH::Extract, {_SYS_STR(".blend")}, 5}; + case SBIG('PATH'): + return {PATH::Extract, {_SYS_STR(".blend")}, 5}; case SBIG('FSM2'): return {DNAFSM2::ExtractFSM2, {_SYS_STR(".yaml")}}; case SBIG('FONT'): diff --git a/DataSpec/DNAMP2/MREA.cpp b/DataSpec/DNAMP2/MREA.cpp index 01c39e07a..ee165529f 100644 --- a/DataSpec/DNAMP2/MREA.cpp +++ b/DataSpec/DNAMP2/MREA.cpp @@ -98,11 +98,11 @@ void MREA::StreamReader::seek(atInt64 diff, athena::SeekOrigin whence) { if (newAccum > target) break; dAccum = newAccum; - ++bIdx; if (info.compSize) cAccum += ROUND_UP_32(info.compSize); else cAccum += info.decompSize; + ++bIdx; } /* Seek source if needed */ @@ -116,6 +116,41 @@ void MREA::StreamReader::seek(atInt64 diff, athena::SeekOrigin whence) { m_posInBlk = target - dAccum; } +void MREA::StreamReader::seekToSection(atUint32 sec, const std::vector& secSizes) { + /* Determine which block contains section */ + atUint32 sAccum = 0; + atUint32 dAccum = 0; + atUint32 cAccum = 0; + atUint32 bIdx = 0; + for (BlockInfo& info : m_blockInfos) { + atUint32 newSAccum = sAccum + info.secCount; + if (newSAccum > sec) + break; + sAccum = newSAccum; + dAccum += info.decompSize; + if (info.compSize) + cAccum += ROUND_UP_32(info.compSize); + else + cAccum += info.decompSize; + ++bIdx; + } + + /* Seek source if needed */ + if (bIdx != m_nextBlk - 1) { + m_source.seek(m_blkBase + cAccum, athena::SeekOrigin::Begin); + m_nextBlk = bIdx; + nextBlock(); + } + + /* Seek within block */ + atUint32 target = dAccum; + while (sAccum != sec) + target += secSizes[sAccum++]; + + m_pos = target; + m_posInBlk = target - dAccum; +} + atUint64 MREA::StreamReader::readUBytesToBuf(void* buf, atUint64 len) { atUint8* bufCur = reinterpret_cast(buf); atUint64 rem = len; @@ -302,15 +337,12 @@ UniqueID32 MREA::GetPATHId(PAKEntryReadStream& rs) { head.read(rs); rs.seekAlign32(); + /* MREA decompression stream */ + StreamReader drs(rs, head.compressedBlockCount); + /* Skip to PATH */ - atUint32 curSec = 0; - atUint64 secStart = rs.position(); - while (curSec != head.pathSecIdx) - secStart += head.secSizes[curSec++]; - if (!head.secSizes[curSec]) - return {}; - rs.seek(secStart, athena::SeekOrigin::Begin); - return {rs}; + drs.seekToSection(head.pathSecIdx, head.secSizes); + return {drs}; } } // namespace DNAMP2 diff --git a/DataSpec/DNAMP2/MREA.hpp b/DataSpec/DNAMP2/MREA.hpp index 6dd18b551..65950865b 100644 --- a/DataSpec/DNAMP2/MREA.hpp +++ b/DataSpec/DNAMP2/MREA.hpp @@ -43,6 +43,7 @@ struct MREA { public: StreamReader(athena::io::IStreamReader& source, atUint32 blkCount); void seek(atInt64 diff, athena::SeekOrigin whence) override; + void seekToSection(atUint32 sec, const std::vector& secSizes); atUint64 position() const override { return m_pos; } atUint64 length() const override { return m_totalDecompLen; } atUint64 readUBytesToBuf(void* buf, atUint64 len) override; diff --git a/DataSpec/DNAMP2/PATH.hpp b/DataSpec/DNAMP2/PATH.hpp index fd8e0ab3e..8fb08fba0 100644 --- a/DataSpec/DNAMP2/PATH.hpp +++ b/DataSpec/DNAMP2/PATH.hpp @@ -3,7 +3,7 @@ #include "DataSpec/DNAMP2/DNAMP2.hpp" namespace DataSpec::DNAMP2 { -struct PATH : DNAPATH::PATH { +struct PATH : DNAPATH::PATH<6> { static bool Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, PAKRouter& pakRouter, const PAK::Entry& entry, bool force, hecl::blender::Token& btok, std::function fileChanged); diff --git a/DataSpec/SpecMP1.cpp b/DataSpec/SpecMP1.cpp index 4e0915763..80f07c287 100644 --- a/DataSpec/SpecMP1.cpp +++ b/DataSpec/SpecMP1.cpp @@ -661,7 +661,7 @@ struct SpecMP1 : SpecBase { hecl::blender::Token& btok, FCookProgress progress) override { PathMesh mesh = ds.compilePathMesh(); ds.close(); - DNAPATH::PATH::Cook(out, in, mesh, btok); + DNAPATH::PATH<4>::Cook(out, in, mesh, btok); } void cookActor(const hecl::ProjectPath& out, const hecl::ProjectPath& in, BlendStream& ds, bool fast, diff --git a/DataSpec/SpecMP2.cpp b/DataSpec/SpecMP2.cpp index c6b76e313..40571f350 100644 --- a/DataSpec/SpecMP2.cpp +++ b/DataSpec/SpecMP2.cpp @@ -291,7 +291,7 @@ struct SpecMP2 : SpecBase { hecl::blender::Token& btok, FCookProgress progress) override { PathMesh mesh = ds.compilePathMesh(); ds.close(); - DNAPATH::PATH::Cook(out, in, mesh, btok); + DNAPATH::PATH<6>::Cook(out, in, mesh, btok); } void cookActor(const hecl::ProjectPath& out, const hecl::ProjectPath& in, BlendStream& ds, bool fast, diff --git a/hecl b/hecl index 138328b8f..191ffdc8e 160000 --- a/hecl +++ b/hecl @@ -1 +1 @@ -Subproject commit 138328b8f617071cbe9457f04e9cbb31cef1975e +Subproject commit 191ffdc8e06c20e8831e383be5431789d9d4b8fb From 73f245ee277dcaa33c162467e9892e62e3af13fd Mon Sep 17 00:00:00 2001 From: Jack Andersen Date: Wed, 8 Apr 2020 19:46:40 -1000 Subject: [PATCH 006/224] Specialize PATH by PAKBridge --- DataSpec/DNACommon/AROTBuilder.cpp | 25 ++++++++++-------- DataSpec/DNACommon/AROTBuilder.hpp | 10 +++---- DataSpec/DNACommon/PATH.cpp | 42 +++++++++++++++++++++++------- DataSpec/DNACommon/PATH.hpp | 28 +++++++++++++------- DataSpec/DNAMP1/CMakeLists.txt | 2 +- DataSpec/DNAMP1/PATH.cpp | 27 ------------------- DataSpec/DNAMP1/PATH.hpp | 9 ++----- DataSpec/DNAMP2/CMakeLists.txt | 2 +- DataSpec/DNAMP2/PATH.cpp | 26 ------------------ DataSpec/DNAMP2/PATH.hpp | 12 ++------- DataSpec/SpecMP1.cpp | 2 +- DataSpec/SpecMP2.cpp | 3 ++- 12 files changed, 79 insertions(+), 109 deletions(-) delete mode 100644 DataSpec/DNAMP1/PATH.cpp delete mode 100644 DataSpec/DNAMP2/PATH.cpp diff --git a/DataSpec/DNACommon/AROTBuilder.cpp b/DataSpec/DNACommon/AROTBuilder.cpp index 6985a98f9..f515871ac 100644 --- a/DataSpec/DNACommon/AROTBuilder.cpp +++ b/DataSpec/DNACommon/AROTBuilder.cpp @@ -1,6 +1,9 @@ #include "AROTBuilder.hpp" #include "hecl/Blender/Connection.hpp" -#include "../DNAMP1/PATH.hpp" +#include "PATH.hpp" +#include "DataSpec/DNAMP1/DNAMP1.hpp" +#include "DataSpec/DNAMP2/DNAMP2.hpp" +#include "DataSpec/DNAMP3/DNAMP3.hpp" namespace DataSpec { logvisor::Module Log("AROTBuilder"); @@ -272,8 +275,8 @@ void AROTBuilder::Node::pathCountNodesAndLookups(size_t& nodeCount, size_t& look } } -template -void AROTBuilder::Node::pathWrite(DNAPATH::PATH& path, const zeus::CAABox& curAABB) { +template +void AROTBuilder::Node::pathWrite(DNAPATH::PATH& path, const zeus::CAABox& curAABB) { if (childNodes.empty()) { auto& n = path.octree.emplace_back(); n.isLeaf = 1; @@ -306,9 +309,9 @@ void AROTBuilder::Node::pathWrite(DNAPATH::PATH& path, const zeus::CAAB } } -template void AROTBuilder::Node::pathWrite<4>(DNAPATH::PATH<4>& path, const zeus::CAABox& curAABB); -template void AROTBuilder::Node::pathWrite<6>(DNAPATH::PATH<6>& path, const zeus::CAABox& curAABB); -template void AROTBuilder::Node::pathWrite<7>(DNAPATH::PATH<7>& path, const zeus::CAABox& curAABB); +template void AROTBuilder::Node::pathWrite(DNAPATH::PATH& path, const zeus::CAABox& curAABB); +template void AROTBuilder::Node::pathWrite(DNAPATH::PATH& path, const zeus::CAABox& curAABB); +template void AROTBuilder::Node::pathWrite(DNAPATH::PATH& path, const zeus::CAABox& curAABB); void AROTBuilder::build(std::vector>& secs, const zeus::CAABox& fullAabb, const std::vector& meshAabbs, const std::vector& meshes) { @@ -403,8 +406,8 @@ std::pair, uint32_t> AROTBuilder::buildCol(const ColM return {std::move(ret), totalSize}; } -template -void AROTBuilder::buildPath(DNAPATH::PATH& path) { +template +void AROTBuilder::buildPath(DNAPATH::PATH& path) { /* Accumulate total AABB and gather region boxes */ std::vector regionBoxes; regionBoxes.reserve(path.regions.size()); @@ -427,8 +430,8 @@ void AROTBuilder::buildPath(DNAPATH::PATH& path) { rootNode.pathWrite(path, fullAABB); } -template void AROTBuilder::buildPath<4>(DNAPATH::PATH<4>& path); -template void AROTBuilder::buildPath<6>(DNAPATH::PATH<6>& path); -template void AROTBuilder::buildPath<7>(DNAPATH::PATH<7>& path); +template void AROTBuilder::buildPath(DNAPATH::PATH& path); +template void AROTBuilder::buildPath(DNAPATH::PATH& path); +template void AROTBuilder::buildPath(DNAPATH::PATH& path); } // namespace DataSpec diff --git a/DataSpec/DNACommon/AROTBuilder.hpp b/DataSpec/DNACommon/AROTBuilder.hpp index 6395bccaa..a10a00128 100644 --- a/DataSpec/DNACommon/AROTBuilder.hpp +++ b/DataSpec/DNACommon/AROTBuilder.hpp @@ -8,7 +8,7 @@ namespace DataSpec { namespace DNAPATH { -template +template struct PATH; } @@ -44,15 +44,15 @@ struct AROTBuilder { void writeColNodes(uint8_t*& ptr, const zeus::CAABox& curAABB); void pathCountNodesAndLookups(size_t& nodeCount, size_t& lookupCount); - template - void pathWrite(DNAPATH::PATH& path, const zeus::CAABox& curAABB); + template + void pathWrite(DNAPATH::PATH& path, const zeus::CAABox& curAABB); } rootNode; void build(std::vector>& secs, const zeus::CAABox& fullAabb, const std::vector& meshAabbs, const std::vector& meshes); std::pair, uint32_t> buildCol(const ColMesh& mesh, BspNodeType& rootOut); - template - void buildPath(DNAPATH::PATH& path); + template + void buildPath(DNAPATH::PATH& path); }; } // namespace DataSpec diff --git a/DataSpec/DNACommon/PATH.cpp b/DataSpec/DNACommon/PATH.cpp index 83e42382d..b756b5e73 100644 --- a/DataSpec/DNACommon/PATH.cpp +++ b/DataSpec/DNACommon/PATH.cpp @@ -24,9 +24,9 @@ static void OutputOctreeNode(hecl::blender::PyOutStream& os, int idx, const zeus } #endif -template -void PATH::sendToBlender(hecl::blender::Connection& conn, std::string_view entryName, const zeus::CMatrix4f* xf, - const std::string& areaPath) { +template +void PATH::sendToBlender(hecl::blender::Connection& conn, std::string_view entryName, + const zeus::CMatrix4f* xf, const std::string& areaPath) { /* Open Py Stream and read sections */ hecl::blender::PyOutStream os = conn.beginPythonOut(true); os << "import bpy\n" @@ -176,9 +176,33 @@ void PATH::sendToBlender(hecl::blender::Connection& conn, std::string_view os.close(); } -template -bool PATH::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, const PathMesh& mesh, - hecl::blender::Token& btok) { +template +bool PATH::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, + PAKRouter& pakRouter, const typename PAKBridge::PAKType::Entry& entry, + bool force, hecl::blender::Token& btok, + std::function fileChanged) { + PATH path; + path.read(rs); + hecl::blender::Connection& conn = btok.getBlenderConnection(); + if (!conn.createBlend(outPath, hecl::blender::BlendType::PathMesh)) + return false; + + std::string areaPath; + for (const auto& ent : hecl::DirectoryEnumerator(outPath.getParentPath().getAbsolutePath())) { + if (hecl::StringUtils::BeginsWith(ent.m_name, _SYS_STR("!area_"))) { + areaPath = hecl::SystemUTF8Conv(ent.m_name).str(); + break; + } + } + + const zeus::CMatrix4f* xf = pakRouter.lookupMAPATransform(entry.id); + path.sendToBlender(conn, pakRouter.getBestEntryName(entry, false), xf, areaPath); + return conn.saveBlend(); +} + +template +bool PATH::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, const PathMesh& mesh, + hecl::blender::Token& btok) { athena::io::MemoryReader r(mesh.data.data(), mesh.data.size()); PATH path; path.read(r); @@ -217,8 +241,8 @@ bool PATH::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& return true; } -template struct PATH<4>; -template struct PATH<6>; -template struct PATH<7>; +template struct PATH; +template struct PATH; +template struct PATH; } // namespace DataSpec::DNAPATH \ No newline at end of file diff --git a/DataSpec/DNACommon/PATH.hpp b/DataSpec/DNACommon/PATH.hpp index 10ebf1c47..8552d95a9 100644 --- a/DataSpec/DNACommon/PATH.hpp +++ b/DataSpec/DNACommon/PATH.hpp @@ -2,17 +2,20 @@ #include "DataSpec/DNACommon/DNACommon.hpp" #include "DataSpec/DNACommon/PAK.hpp" +#include "DataSpec/DNAMP1/DNAMP1.hpp" +#include "DataSpec/DNAMP2/DNAMP2.hpp" +#include "DataSpec/DNAMP3/DNAMP3.hpp" namespace DataSpec::DNAPATH { -template +template struct RegionPointers {}; template <> -struct RegionPointers<4> : BigDNA { +struct RegionPointers : BigDNA { AT_DECL_DNA Value regionIdxPtr; }; template <> -struct RegionPointers<6> : BigDNA { +struct RegionPointers : BigDNA { AT_DECL_DNA Value unk0; Value unk1; @@ -20,7 +23,7 @@ struct RegionPointers<6> : BigDNA { Value regionIdxPtr; }; template <> -struct RegionPointers<7> : BigDNA { +struct RegionPointers : BigDNA { AT_DECL_DNA Value unk0; Value unk1; @@ -28,8 +31,9 @@ struct RegionPointers<7> : BigDNA { Value regionIdxPtr; }; -template -struct AT_SPECIALIZE_PARMS(4, 6, 7) PATH : BigDNA { +template +struct AT_SPECIALIZE_PARMS(DataSpec::DNAMP1::PAKBridge, DataSpec::DNAMP2::PAKBridge, DataSpec::DNAMP3::PAKBridge) PATH +: BigDNA { using PathMesh = hecl::blender::PathMesh; AT_DECL_DNA @@ -66,7 +70,7 @@ struct AT_SPECIALIZE_PARMS(4, 6, 7) PATH : BigDNA { Value regionIdx; Value centroid; Value aabb[2]; - Value> pointers; + Value> pointers; }; Value regionCount; Vector regions; @@ -93,7 +97,11 @@ struct AT_SPECIALIZE_PARMS(4, 6, 7) PATH : BigDNA { void sendToBlender(hecl::blender::Connection& conn, std::string_view entryName, const zeus::CMatrix4f* xf, const std::string& areaPath); - static bool Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, - const PathMesh& mesh, hecl::blender::Token& btok); + static bool Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, + PAKRouter& pakRouter, const typename PAKBridge::PAKType::Entry& entry, bool force, + hecl::blender::Token& btok, std::function fileChanged); + + static bool Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, const PathMesh& mesh, + hecl::blender::Token& btok); }; -} // namespace DataSpec::DNAMP1 +} // namespace DataSpec::DNAPATH diff --git a/DataSpec/DNAMP1/CMakeLists.txt b/DataSpec/DNAMP1/CMakeLists.txt index 12f703bbb..51ebe4bfe 100644 --- a/DataSpec/DNAMP1/CMakeLists.txt +++ b/DataSpec/DNAMP1/CMakeLists.txt @@ -49,7 +49,7 @@ set(DNAMP1_SOURCES ANIM.cpp CINF.cpp EVNT.cpp - PATH.cpp + PATH.hpp CMDL.hpp CMDL.cpp CMDLMaterials.cpp DCLN.cpp diff --git a/DataSpec/DNAMP1/PATH.cpp b/DataSpec/DNAMP1/PATH.cpp deleted file mode 100644 index 68dd16fdf..000000000 --- a/DataSpec/DNAMP1/PATH.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "DataSpec/DNAMP1/PATH.hpp" -#include "DataSpec/DNACommon/AROTBuilder.hpp" -#include "hecl/Blender/Connection.hpp" - -namespace DataSpec::DNAMP1 { -bool PATH::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, - PAKRouter& pakRouter, const PAK::Entry& entry, bool force, hecl::blender::Token& btok, - std::function fileChanged) { - PATH path; - path.read(rs); - hecl::blender::Connection& conn = btok.getBlenderConnection(); - if (!conn.createBlend(outPath, hecl::blender::BlendType::PathMesh)) - return false; - - std::string areaPath; - for (const auto& ent : hecl::DirectoryEnumerator(outPath.getParentPath().getAbsolutePath())) { - if (hecl::StringUtils::BeginsWith(ent.m_name, _SYS_STR("!area_"))) { - areaPath = hecl::SystemUTF8Conv(ent.m_name).str(); - break; - } - } - - const zeus::CMatrix4f* xf = pakRouter.lookupMAPATransform(entry.id); - path.sendToBlender(conn, pakRouter.getBestEntryName(entry, false), xf, areaPath); - return conn.saveBlend(); -} -} \ No newline at end of file diff --git a/DataSpec/DNAMP1/PATH.hpp b/DataSpec/DNAMP1/PATH.hpp index c35bc2b43..07f0179f8 100644 --- a/DataSpec/DNAMP1/PATH.hpp +++ b/DataSpec/DNAMP1/PATH.hpp @@ -1,11 +1,6 @@ #pragma once #include "DataSpec/DNACommon/PATH.hpp" -#include "DataSpec/DNAMP1/DNAMP1.hpp" namespace DataSpec::DNAMP1 { -struct PATH : DNAPATH::PATH<4> { - static bool Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, - PAKRouter& pakRouter, const PAK::Entry& entry, bool force, hecl::blender::Token& btok, - std::function fileChanged); -}; -} // namespace DataSpec::DNAMP1 \ No newline at end of file +using PATH = DNAPATH::PATH; +} // namespace DataSpec::DNAMP1 diff --git a/DataSpec/DNAMP2/CMakeLists.txt b/DataSpec/DNAMP2/CMakeLists.txt index 84b43fe51..e04014768 100644 --- a/DataSpec/DNAMP2/CMakeLists.txt +++ b/DataSpec/DNAMP2/CMakeLists.txt @@ -23,7 +23,7 @@ set(DNAMP2_SOURCES MREA.cpp MAPA.hpp MAPU.hpp - PATH.hpp PATH.cpp + PATH.hpp AFSM.hpp STRG.hpp STRG.cpp) diff --git a/DataSpec/DNAMP2/PATH.cpp b/DataSpec/DNAMP2/PATH.cpp deleted file mode 100644 index 058fd5243..000000000 --- a/DataSpec/DNAMP2/PATH.cpp +++ /dev/null @@ -1,26 +0,0 @@ -#include "DataSpec/DNAMP2/PATH.hpp" -#include "hecl/Blender/Connection.hpp" - -namespace DataSpec::DNAMP2 { -bool PATH::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, - PAKRouter& pakRouter, const PAK::Entry& entry, bool force, hecl::blender::Token& btok, - std::function fileChanged) { - PATH path; - path.read(rs); - hecl::blender::Connection& conn = btok.getBlenderConnection(); - if (!conn.createBlend(outPath, hecl::blender::BlendType::PathMesh)) - return false; - - std::string areaPath; - for (const auto& ent : hecl::DirectoryEnumerator(outPath.getParentPath().getAbsolutePath())) { - if (hecl::StringUtils::BeginsWith(ent.m_name, _SYS_STR("!area_"))) { - areaPath = hecl::SystemUTF8Conv(ent.m_name).str(); - break; - } - } - - const zeus::CMatrix4f* xf = pakRouter.lookupMAPATransform(entry.id); - path.sendToBlender(conn, pakRouter.getBestEntryName(entry, false), xf, areaPath); - return conn.saveBlend(); -} -} \ No newline at end of file diff --git a/DataSpec/DNAMP2/PATH.hpp b/DataSpec/DNAMP2/PATH.hpp index 8fb08fba0..676f4479d 100644 --- a/DataSpec/DNAMP2/PATH.hpp +++ b/DataSpec/DNAMP2/PATH.hpp @@ -1,14 +1,6 @@ #pragma once #include "DataSpec/DNACommon/PATH.hpp" -#include "DataSpec/DNAMP2/DNAMP2.hpp" namespace DataSpec::DNAMP2 { -struct PATH : DNAPATH::PATH<6> { - static bool Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, - PAKRouter& pakRouter, const PAK::Entry& entry, bool force, hecl::blender::Token& btok, - std::function fileChanged); - - static bool Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, - const PathMesh& mesh, hecl::blender::Token& btok); -}; -} \ No newline at end of file +using PATH = DNAPATH::PATH; +} // namespace DataSpec::DNAMP2 diff --git a/DataSpec/SpecMP1.cpp b/DataSpec/SpecMP1.cpp index 80f07c287..ddf973351 100644 --- a/DataSpec/SpecMP1.cpp +++ b/DataSpec/SpecMP1.cpp @@ -661,7 +661,7 @@ struct SpecMP1 : SpecBase { hecl::blender::Token& btok, FCookProgress progress) override { PathMesh mesh = ds.compilePathMesh(); ds.close(); - DNAPATH::PATH<4>::Cook(out, in, mesh, btok); + DNAMP1::PATH::Cook(out, in, mesh, btok); } void cookActor(const hecl::ProjectPath& out, const hecl::ProjectPath& in, BlendStream& ds, bool fast, diff --git a/DataSpec/SpecMP2.cpp b/DataSpec/SpecMP2.cpp index 40571f350..c15acc6e0 100644 --- a/DataSpec/SpecMP2.cpp +++ b/DataSpec/SpecMP2.cpp @@ -6,6 +6,7 @@ #include "DNAMP2/MLVL.hpp" #include "DNAMP2/STRG.hpp" #include "DNAMP2/AGSC.hpp" +#include "DNAMP2/PATH.hpp" #include "DNAMP2/MAPA.hpp" #include "DNAMP1/CSNG.hpp" #include "DNACommon/MAPU.hpp" @@ -291,7 +292,7 @@ struct SpecMP2 : SpecBase { hecl::blender::Token& btok, FCookProgress progress) override { PathMesh mesh = ds.compilePathMesh(); ds.close(); - DNAPATH::PATH<6>::Cook(out, in, mesh, btok); + DNAMP2::PATH::Cook(out, in, mesh, btok); } void cookActor(const hecl::ProjectPath& out, const hecl::ProjectPath& in, BlendStream& ds, bool fast, From e4ade45fd1c7cc8d208dec21b2db32c4dfa5acc4 Mon Sep 17 00:00:00 2001 From: Jack Andersen Date: Wed, 8 Apr 2020 19:50:29 -1000 Subject: [PATCH 007/224] Remove unnecessary includes --- DataSpec/DNACommon/AROTBuilder.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/DataSpec/DNACommon/AROTBuilder.cpp b/DataSpec/DNACommon/AROTBuilder.cpp index f515871ac..586f19d36 100644 --- a/DataSpec/DNACommon/AROTBuilder.cpp +++ b/DataSpec/DNACommon/AROTBuilder.cpp @@ -1,9 +1,6 @@ #include "AROTBuilder.hpp" #include "hecl/Blender/Connection.hpp" #include "PATH.hpp" -#include "DataSpec/DNAMP1/DNAMP1.hpp" -#include "DataSpec/DNAMP2/DNAMP2.hpp" -#include "DataSpec/DNAMP3/DNAMP3.hpp" namespace DataSpec { logvisor::Module Log("AROTBuilder"); From a668a623cbbb2f8478b9e8f74ed54d5d50084992 Mon Sep 17 00:00:00 2001 From: Jack Andersen Date: Wed, 8 Apr 2020 20:03:52 -1000 Subject: [PATCH 008/224] Exclude bitmap3 from MP3's PATH --- DataSpec/DNACommon/PATH.hpp | 7 ++++++- hecl | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/DataSpec/DNACommon/PATH.hpp b/DataSpec/DNACommon/PATH.hpp index 8552d95a9..2a3f8d793 100644 --- a/DataSpec/DNACommon/PATH.hpp +++ b/DataSpec/DNACommon/PATH.hpp @@ -77,7 +77,12 @@ struct AT_SPECIALIZE_PARMS(DataSpec::DNAMP1::PAKBridge, DataSpec::DNAMP2::PAKBri Vector bitmap1; Vector bitmap2; - Vector bitmap3; + + /* Unused in all games, removed in MP3 */ + Vector + ? 0 + : (((((regionCount * regionCount) + 31) / 32) - bitmap1.size()) * 2))> + bitmap3; Value octreeRegionLookupCount; Vector octreeRegionLookup; diff --git a/hecl b/hecl index 191ffdc8e..b3d91f520 160000 --- a/hecl +++ b/hecl @@ -1 +1 @@ -Subproject commit 191ffdc8e06c20e8831e383be5431789d9d4b8fb +Subproject commit b3d91f520ad3a9429b0116f9b531ec12b2e71809 From a2f75273889ade57a381b8d5b6d4e1f3a4f9b6c3 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 9 Apr 2020 20:05:31 -0400 Subject: [PATCH 009/224] CScriptPlayerActor: Remove two usages of const_cast While we're at it, we can also simplify the implementation of GetPostConstructed(). --- Runtime/World/CGameArea.hpp | 7 ++----- Runtime/World/CScriptPlayerActor.cpp | 8 ++++---- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/Runtime/World/CGameArea.hpp b/Runtime/World/CGameArea.hpp index 31623d90b..ea0ae48c0 100644 --- a/Runtime/World/CGameArea.hpp +++ b/Runtime/World/CGameArea.hpp @@ -347,11 +347,8 @@ public: s32 GetDockCount() const { return xcc_docks.size(); } bool IsPostConstructed() const { return xf0_24_postConstructed; } - const CPostConstructed* GetPostConstructed() const { - if (!x12c_postConstructed) - return nullptr; - return x12c_postConstructed.get(); - } + CPostConstructed* GetPostConstructed() { return x12c_postConstructed.get(); } + const CPostConstructed* GetPostConstructed() const { return x12c_postConstructed.get(); } bool IsValidated() const { return xf0_28_validated; } diff --git a/Runtime/World/CScriptPlayerActor.cpp b/Runtime/World/CScriptPlayerActor.cpp index 206d1f3d4..781d72767 100644 --- a/Runtime/World/CScriptPlayerActor.cpp +++ b/Runtime/World/CScriptPlayerActor.cpp @@ -211,8 +211,8 @@ void CScriptPlayerActor::Think(float dt, CStateManager& mgr) { if (x354_29_loading && !x354_28_suitModelLoading && !x354_27_beamModelLoading && x64_modelData && !x64_modelData->IsNull() && x64_modelData->IsLoaded(0)) { if (x355_24_areaTrackingLoad) { - const CGameArea* area = mgr.GetWorld()->GetAreaAlways(x4_areaId); - --const_cast(area->GetPostConstructed())->x113c_playerActorsLoading; + CGameArea* area = mgr.GetWorld()->GetArea(x4_areaId); + --area->GetPostConstructed()->x113c_playerActorsLoading; x355_24_areaTrackingLoad = false; } x354_29_loading = false; @@ -285,8 +285,8 @@ void CScriptPlayerActor::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid case EScriptObjectMessage::InitializedInArea: x354_31_deferOnlineLoad = true; if (x350_flags & 0x8) { - const CGameArea* area = mgr.GetWorld()->GetAreaAlways(x4_areaId); - ++const_cast(area->GetPostConstructed())->x113c_playerActorsLoading; + CGameArea* area = mgr.GetWorld()->GetArea(x4_areaId); + ++area->GetPostConstructed()->x113c_playerActorsLoading; x355_24_areaTrackingLoad = true; } if (GetActive()) { From 0c1b47faf87e5e6eb83127b638b73318e9ec22bd Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 9 Apr 2020 20:09:12 -0400 Subject: [PATCH 010/224] CProjectileWeapon: Remove usages of const_cast Now that the base Render() function was made non-const, it's trivial to apply this to the other classes like CProjectileWeapon. --- Runtime/Weapon/CProjectileWeapon.cpp | 6 +++--- Runtime/Weapon/CProjectileWeapon.hpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Runtime/Weapon/CProjectileWeapon.cpp b/Runtime/Weapon/CProjectileWeapon.cpp index 31316e3b9..f3b816c04 100644 --- a/Runtime/Weapon/CProjectileWeapon.cpp +++ b/Runtime/Weapon/CProjectileWeapon.cpp @@ -201,7 +201,7 @@ void CProjectileWeapon::RenderParticles() const { x104_->Render(); } -void CProjectileWeapon::AddToRenderer() const { +void CProjectileWeapon::AddToRenderer() { if (xfc_APSMGen) g_Renderer->AddParticleGen(*xfc_APSMGen); if (x100_APS2Gen) @@ -216,7 +216,7 @@ void CProjectileWeapon::AddToRenderer() const { g_Renderer->AddParticleGen(*x104_); } -void CProjectileWeapon::Render() const { +void CProjectileWeapon::Render() { if (xf4_curFrame > xe8_lifetime || !x124_24_active || !x108_model) return; @@ -227,7 +227,7 @@ void CProjectileWeapon::Render() const { std::vector useLights; useLights.push_back(CLight::BuildLocalAmbient({}, xc8_ambientLightColor)); - const_cast(**x108_model).GetInstance().ActivateLights(useLights); + (**x108_model).GetInstance().ActivateLights(useLights); CModelFlags flags(0, 0, 3, zeus::skWhite); (*x108_model)->Draw(flags); } diff --git a/Runtime/Weapon/CProjectileWeapon.hpp b/Runtime/Weapon/CProjectileWeapon.hpp index b24b68433..1b83e1816 100644 --- a/Runtime/Weapon/CProjectileWeapon.hpp +++ b/Runtime/Weapon/CProjectileWeapon.hpp @@ -88,8 +88,8 @@ public: const zeus::CVector3f& target); TLockedToken GetWeaponDescription() const { return x4_weaponDesc; } void RenderParticles() const; - virtual void AddToRenderer() const; - virtual void Render() const; + virtual void AddToRenderer(); + virtual void Render(); bool IsSystemDeletable() const; void UpdateChildParticleSystems(float); void UpdatePSTranslationAndOrientation(); From 4834720bb0360f95557fbcda4259af8d3b2947be Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 9 Apr 2020 20:18:43 -0400 Subject: [PATCH 011/224] CGrappleArm: Remove usage of const_cast in RenderXRayModel() This is no longer necessary. --- Runtime/Weapon/CGrappleArm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Weapon/CGrappleArm.cpp b/Runtime/Weapon/CGrappleArm.cpp index fc80cd45a..9f6985968 100644 --- a/Runtime/Weapon/CGrappleArm.cpp +++ b/Runtime/Weapon/CGrappleArm.cpp @@ -478,7 +478,7 @@ void CGrappleArm::RenderXRayModel(const CStateManager& mgr, const zeus::CTransfo CGraphics::SetModelMatrix(modelXf * zeus::CTransform::Scale(x0_grappleArmModel->GetScale())); // CGraphics::DisableAllLights(); // g_Renderer->SetAmbientColor(zeus::skWhite); - CSkinnedModel& model = const_cast(*x50_grappleArmSkeletonModel->GetAnimationData()->GetModelData()); + CSkinnedModel& model = *x50_grappleArmSkeletonModel->GetAnimationData()->GetModelData(); model.GetModelInst()->ActivateLights({CLight::BuildLocalAmbient({}, zeus::skWhite)}); x0_grappleArmModel->GetAnimationData()->Render(model, flags, std::nullopt, nullptr); // g_Renderer->SetAmbientColor(zeus::skWhite); From 57d9e0f29439fdac168f77221ed87e9628eaf88f Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 9 Apr 2020 20:21:01 -0400 Subject: [PATCH 012/224] CFlaahgra: Remove two usages of const_cast These are no longer necessary. --- Runtime/MP1/World/CFlaahgra.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Runtime/MP1/World/CFlaahgra.cpp b/Runtime/MP1/World/CFlaahgra.cpp index bc707b59c..a32767471 100644 --- a/Runtime/MP1/World/CFlaahgra.cpp +++ b/Runtime/MP1/World/CFlaahgra.cpp @@ -121,8 +121,7 @@ void CFlaahgra::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateM switch (msg) { case EScriptObjectMessage::InitializedInArea: { if (!x8e4_25_loading && !x8e4_24_loaded) { - const_cast(mgr.GetWorld()->GetAreaAlways(GetAreaIdAlways())->GetPostConstructed()) - ->x113c_playerActorsLoading++; + mgr.GetWorld()->GetArea(GetAreaIdAlways())->GetPostConstructed()->x113c_playerActorsLoading++; x8e4_25_loading = true; } @@ -401,8 +400,7 @@ void CFlaahgra::LoadTokens(CStateManager& mgr) { void CFlaahgra::FinalizeLoad(CStateManager& mgr) { x8e4_24_loaded = true; if (x8e4_25_loading) { - const_cast(mgr.GetWorld()->GetAreaAlways(GetAreaIdAlways())->GetPostConstructed()) - ->x113c_playerActorsLoading--; + mgr.GetWorld()->GetArea(GetAreaIdAlways())->GetPostConstructed()->x113c_playerActorsLoading--; x8e4_25_loading = false; } From b89069e1b80963bfaa81f377e46277425a4451c0 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 9 Apr 2020 20:22:47 -0400 Subject: [PATCH 013/224] CBooRenderer: Remove usages of const_cast We can just remove the const qualifier on model here. --- Runtime/Graphics/CBooRenderer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Runtime/Graphics/CBooRenderer.cpp b/Runtime/Graphics/CBooRenderer.cpp index 1007d117c..a0f9b4f14 100644 --- a/Runtime/Graphics/CBooRenderer.cpp +++ b/Runtime/Graphics/CBooRenderer.cpp @@ -1397,9 +1397,9 @@ void CBooRenderer::DrawOverlappingWorldModelShadows(int alphaVal, const std::vec return; flags.x4_color.r() = alphaVal / 255.f; - const CBooModel& model = *item.x10_models[wordModel + j]; - const_cast(model).UpdateUniformData(flags, nullptr, nullptr, 2); - const_cast(model).VerifyCurrentShader(0); + CBooModel& model = *item.x10_models[wordModel + j]; + model.UpdateUniformData(flags, nullptr, nullptr, 2); + model.VerifyCurrentShader(0); for (const CBooSurface* surf = model.x38_firstUnsortedSurface; surf; surf = surf->m_next) if (surf->GetBounds().intersects(aabb)) model.DrawSurface(*surf, flags); From cf054f35a369809806af853c7586fe9d2924e5aa Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 9 Apr 2020 20:26:27 -0400 Subject: [PATCH 014/224] SpecBase: Remove usages of const_cast It's generally the case that mutexes are marked as mutable whenever they need to be used within a const class context, given they don't directly participate as a bitwise member of the class, but only transiently exist so that synchronization operations can occur. Given that, marking the member as mutable in this case makes sense. --- DataSpec/SpecBase.cpp | 16 ++++++++-------- DataSpec/SpecBase.hpp | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/DataSpec/SpecBase.cpp b/DataSpec/SpecBase.cpp index a9e762be6..5d9e23fcc 100644 --- a/DataSpec/SpecBase.cpp +++ b/DataSpec/SpecBase.cpp @@ -746,7 +746,7 @@ void SpecBase::clearTagCache() { } hecl::ProjectPath SpecBase::pathFromTag(const urde::SObjectTag& tag) const { - std::unique_lock lk(const_cast(*this).m_backgroundIndexMutex); + std::unique_lock lk(m_backgroundIndexMutex); auto search = m_tagToPath.find(tag); if (search != m_tagToPath.cend()) return search->second; @@ -761,7 +761,7 @@ urde::SObjectTag SpecBase::tagFromPath(const hecl::ProjectPath& path) const { } bool SpecBase::waitForTagReady(const urde::SObjectTag& tag, const hecl::ProjectPath*& pathOut) { - std::unique_lock lk(m_backgroundIndexMutex); + std::unique_lock lk(m_backgroundIndexMutex); auto search = m_tagToPath.find(tag); if (search == m_tagToPath.end()) { if (m_backgroundRunning) { @@ -787,7 +787,7 @@ const urde::SObjectTag* SpecBase::getResourceIdByName(std::string_view name) con std::string lower(name); std::transform(lower.cbegin(), lower.cend(), lower.begin(), tolower); - std::unique_lock lk(const_cast(*this).m_backgroundIndexMutex); + std::unique_lock lk(m_backgroundIndexMutex); auto search = m_catalogNameToTag.find(lower); if (search == m_catalogNameToTag.end()) { if (m_backgroundRunning) { @@ -811,7 +811,7 @@ FourCC SpecBase::getResourceTypeById(urde::CAssetId id) const { if (!id.IsValid()) return {}; - std::unique_lock lk(const_cast(*this).m_backgroundIndexMutex); + std::unique_lock lk(m_backgroundIndexMutex); urde::SObjectTag searchTag = {FourCC(), id}; auto search = m_tagToPath.find(searchTag); if (search == m_tagToPath.end()) { @@ -901,7 +901,7 @@ void SpecBase::readCatalog(const hecl::ProjectPath& catalogPath, athena::io::YAM continue; urde::SObjectTag pathTag = tagFromPath(path); if (pathTag) { - std::unique_lock lk(m_backgroundIndexMutex); + std::unique_lock lk(m_backgroundIndexMutex); m_catalogNameToTag[pLower] = pathTag; m_catalogTagToNames[pathTag].insert(p.first); @@ -1111,7 +1111,7 @@ void SpecBase::backgroundIndexProc() { Log.report(logvisor::Info, fmt(_SYS_STR("Cache index of '{}' loading")), getOriginalSpec().m_name); athena::io::YAMLDocReader cacheReader; if (cacheReader.parse(&reader)) { - std::unique_lock lk(m_backgroundIndexMutex); + std::unique_lock lk(m_backgroundIndexMutex); size_t tagCount = cacheReader.getRootNode()->m_mapChildren.size(); m_tagToPath.reserve(tagCount); m_pathToTag.reserve(tagCount); @@ -1147,7 +1147,7 @@ void SpecBase::backgroundIndexProc() { athena::io::FileReader nreader(nameCachePath.getAbsolutePath()); athena::io::YAMLDocReader nameReader; if (nameReader.parse(&nreader)) { - std::unique_lock lk(m_backgroundIndexMutex); + std::unique_lock lk(m_backgroundIndexMutex); m_catalogNameToTag.reserve(nameReader.getRootNode()->m_mapChildren.size()); m_catalogTagToNames.reserve(nameReader.getRootNode()->m_mapChildren.size()); for (const auto& child : nameReader.getRootNode()->m_mapChildren) { @@ -1198,7 +1198,7 @@ void SpecBase::beginBackgroundIndex() { } void SpecBase::waitForIndexComplete() const { - std::unique_lock lk(const_cast(*this).m_backgroundIndexMutex); + std::unique_lock lk(m_backgroundIndexMutex); while (m_backgroundRunning) { lk.unlock(); std::this_thread::sleep_for(std::chrono::milliseconds(2)); diff --git a/DataSpec/SpecBase.hpp b/DataSpec/SpecBase.hpp index 1e62eab09..211c5702d 100644 --- a/DataSpec/SpecBase.hpp +++ b/DataSpec/SpecBase.hpp @@ -175,7 +175,7 @@ protected: hecl::blender::Token m_backgroundBlender; std::thread m_backgroundIndexTh; - std::mutex m_backgroundIndexMutex; + mutable std::mutex m_backgroundIndexMutex; bool m_backgroundRunning = false; void readCatalog(const hecl::ProjectPath& catalogPath, athena::io::YAMLDocWriter& nameWriter); From e22ecf644d739ddaa4159986a1ba99fac167f493 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 9 Apr 2020 20:28:46 -0400 Subject: [PATCH 015/224] SpecMP1: Remove usage of const_cast The preceding commit marked this mutex as mutable, so we can remove the const_cast usage here. --- DataSpec/SpecMP1.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DataSpec/SpecMP1.cpp b/DataSpec/SpecMP1.cpp index c98a0a940..77416895e 100644 --- a/DataSpec/SpecMP1.cpp +++ b/DataSpec/SpecMP1.cpp @@ -626,7 +626,7 @@ struct SpecMP1 : SpecBase { pathPrefix += pakName; pathPrefix += '/'; - std::unique_lock lk(const_cast(*this).m_backgroundIndexMutex); + std::unique_lock lk(m_backgroundIndexMutex); for (const auto& tag : m_tagToPath) if (!tag.second.getRelativePathUTF8().compare(0, pathPrefix.size(), pathPrefix)) out.push_back(tag.first); From 061b7f9a986b2f86e366caaa0cadf01e02eeb191 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 9 Apr 2020 20:32:35 -0400 Subject: [PATCH 016/224] CCollisionActorManager: Remove usage of const_cast We can just make Destroy() a non-const member function to eliminate the need for this cast. --- Runtime/Collision/CCollisionActorManager.cpp | 4 ++-- Runtime/Collision/CCollisionActorManager.hpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Runtime/Collision/CCollisionActorManager.cpp b/Runtime/Collision/CCollisionActorManager.cpp index 963546c4e..81b8b6d35 100644 --- a/Runtime/Collision/CCollisionActorManager.cpp +++ b/Runtime/Collision/CCollisionActorManager.cpp @@ -122,12 +122,12 @@ CCollisionActorManager::CCollisionActorManager(CStateManager& mgr, TUniqueId own } } -void CCollisionActorManager::Destroy(CStateManager& mgr) const { +void CCollisionActorManager::Destroy(CStateManager& mgr) { for (const CJointCollisionDescription& desc : x0_jointDescriptions) { mgr.FreeScriptObject(desc.GetCollisionActorId()); } - const_cast(*this).x13_destroyed = true; + x13_destroyed = true; } void CCollisionActorManager::SetActive(CStateManager& mgr, bool active) { diff --git a/Runtime/Collision/CCollisionActorManager.hpp b/Runtime/Collision/CCollisionActorManager.hpp index 5e78946ae..158632851 100644 --- a/Runtime/Collision/CCollisionActorManager.hpp +++ b/Runtime/Collision/CCollisionActorManager.hpp @@ -30,8 +30,8 @@ public: CCollisionActorManager(CStateManager& mgr, TUniqueId owner, TAreaId area, const std::vector& descs, bool active); - void Update(float dt, CStateManager& mgr, CCollisionActorManager::EUpdateOptions opts); - void Destroy(CStateManager& mgr) const; + void Update(float dt, CStateManager& mgr, EUpdateOptions opts); + void Destroy(CStateManager& mgr); void SetActive(CStateManager& mgr, bool active); bool GetActive() const { return x12_active; } void AddMaterial(CStateManager& mgr, const CMaterialList& list); From 1bacb69fc26cb7be7cd6fa61b2615f04f15372e0 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 9 Apr 2020 21:17:17 -0400 Subject: [PATCH 017/224] CPlasmaProjectile: Remove mutable specifier from m_renderObjs Now that Render() is non-const, this is no longer necessary. --- Runtime/Weapon/CPlasmaProjectile.cpp | 2 +- Runtime/Weapon/CPlasmaProjectile.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Runtime/Weapon/CPlasmaProjectile.cpp b/Runtime/Weapon/CPlasmaProjectile.cpp index 7d25610d7..fd999d5bd 100644 --- a/Runtime/Weapon/CPlasmaProjectile.cpp +++ b/Runtime/Weapon/CPlasmaProjectile.cpp @@ -134,7 +134,7 @@ void CPlasmaProjectile::UpdateEnergyPulse(float dt) { x51c_pulseGen->Update(dt); } -void CPlasmaProjectile::RenderMotionBlur() const { +void CPlasmaProjectile::RenderMotionBlur() { CGraphics::SetModelMatrix({}); zeus::CColor color1 = x494_outerColor; zeus::CColor color2 = x494_outerColor; diff --git a/Runtime/Weapon/CPlasmaProjectile.hpp b/Runtime/Weapon/CPlasmaProjectile.hpp index d9c249c5b..6634ca849 100644 --- a/Runtime/Weapon/CPlasmaProjectile.hpp +++ b/Runtime/Weapon/CPlasmaProjectile.hpp @@ -93,14 +93,14 @@ private: boo::ObjToken tex, boo::ObjToken glowTex); }; - mutable std::optional m_renderObjs; + std::optional m_renderObjs; void SetLightsActive(bool active, CStateManager& mgr); void CreatePlasmaLights(u32 sourceId, const CLight& l, CStateManager& mgr); void DeletePlasmaLights(CStateManager& mgr); void UpdateLights(float expansion, float dt, CStateManager& mgr); void UpdateEnergyPulse(float dt); - void RenderMotionBlur() const; + void RenderMotionBlur(); void RenderBeam(s32 subdivs, float width, const zeus::CColor& color, s32 flags, CColoredStripShader& shader) const; float UpdateBeamState(float dt, CStateManager& mgr); From 27813e5fc3391df3fdbd497db7557a3cede483f1 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 9 Apr 2020 21:19:54 -0400 Subject: [PATCH 018/224] CThardus: Remove mutable specifier from m_flareFilter Now that Render() is non-const, this specifier is no longer necessary. --- Runtime/MP1/World/CThardus.cpp | 2 +- Runtime/MP1/World/CThardus.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Runtime/MP1/World/CThardus.cpp b/Runtime/MP1/World/CThardus.cpp index d0f8f6763..ae6c743a9 100644 --- a/Runtime/MP1/World/CThardus.cpp +++ b/Runtime/MP1/World/CThardus.cpp @@ -977,7 +977,7 @@ void CThardus::UpdateExcludeList(const std::unique_ptr& } } -void CThardus::RenderFlare(const CStateManager& mgr, float t) const { +void CThardus::RenderFlare(const CStateManager& mgr, float t) { if (!x91c_flareTexture) return; if (!m_flareFilter) diff --git a/Runtime/MP1/World/CThardus.hpp b/Runtime/MP1/World/CThardus.hpp index 1fdb108b3..85a16cb14 100644 --- a/Runtime/MP1/World/CThardus.hpp +++ b/Runtime/MP1/World/CThardus.hpp @@ -159,11 +159,11 @@ class CThardus : public CPatterned { void _SetupCollisionManagers(CStateManager& mgr); void _BuildSphereJointList(const SSphereJointInfo* arr, size_t count, std::vector& list); void _BuildAABoxJointList(const SAABoxJointInfo* arr, size_t count, std::vector& list); - void RenderFlare(const CStateManager& mgr, float t) const; + void RenderFlare(const CStateManager& mgr, float t); zeus::CVector3f sub801de550(const CStateManager& mgr) const; zeus::CVector3f sub801de434(const CStateManager& mgr) const { return {}; } - mutable std::optional m_flareFilter; + std::optional m_flareFilter; public: DEFINE_PATTERNED(Thardus) From 35ca90178440a3b040ed0e3b810ee17bd6e75405 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 9 Apr 2020 21:23:47 -0400 Subject: [PATCH 019/224] CHudRadarInterface: Remove mutable specifiers from class members We can just drop the const qualifiers on the relevant member functions to make these unnecessary. --- Runtime/GuiSys/CHudRadarInterface.cpp | 7 +++---- Runtime/GuiSys/CHudRadarInterface.hpp | 11 +++++------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/Runtime/GuiSys/CHudRadarInterface.cpp b/Runtime/GuiSys/CHudRadarInterface.cpp index aea967b02..f5ffa5292 100644 --- a/Runtime/GuiSys/CHudRadarInterface.cpp +++ b/Runtime/GuiSys/CHudRadarInterface.cpp @@ -28,8 +28,7 @@ CHudRadarInterface::CHudRadarInterface(CGuiFrame& baseHud, CStateManager& stateM x40_BaseWidget_RadarStuff->SetColor(g_tweakGuiColors->GetRadarStuffColor()); } -void CHudRadarInterface::DoDrawRadarPaint(const zeus::CVector3f& translate, float radius, - const zeus::CColor& color) const { +void CHudRadarInterface::DoDrawRadarPaint(const zeus::CVector3f& translate, float radius, const zeus::CColor& color) { radius *= 4.f; CRadarPaintShader::Instance& inst = m_paintInsts.emplace_back(); @@ -45,7 +44,7 @@ void CHudRadarInterface::DoDrawRadarPaint(const zeus::CVector3f& translate, floa } void CHudRadarInterface::DrawRadarPaint(const zeus::CVector3f& enemyPos, float radius, float alpha, - const SRadarPaintDrawParms& parms) const { + const SRadarPaintDrawParms& parms) { zeus::CVector2f playerToEnemy = enemyPos.toVec2f() - parms.x0_playerPos.toVec2f(); float zDelta = std::fabs(enemyPos.z() - parms.x0_playerPos.z()); @@ -81,7 +80,7 @@ void CHudRadarInterface::Update(float dt, const CStateManager& mgr) { } } -void CHudRadarInterface::Draw(const CStateManager& mgr, float alpha) const { +void CHudRadarInterface::Draw(const CStateManager& mgr, float alpha) { alpha *= g_GameState->GameOptions().GetHUDAlpha() / 255.f; if (g_tweakGui->GetHudVisMode() == ITweakGui::EHudVisMode::Zero || !x3c_24_visibleGame || !x0_txtrRadarPaint || !x0_txtrRadarPaint.IsLoaded()) diff --git a/Runtime/GuiSys/CHudRadarInterface.hpp b/Runtime/GuiSys/CHudRadarInterface.hpp index 8a601701b..080b496fe 100644 --- a/Runtime/GuiSys/CHudRadarInterface.hpp +++ b/Runtime/GuiSys/CHudRadarInterface.hpp @@ -33,17 +33,16 @@ class CHudRadarInterface { bool x3c_25_visibleDebug : 1; CGuiWidget* x40_BaseWidget_RadarStuff; CGuiCamera* x44_camera; - mutable CRadarPaintShader m_paintShader; - mutable std::vector m_paintInsts; - void DoDrawRadarPaint(const zeus::CVector3f& translate, float radius, const zeus::CColor& color) const; - void DrawRadarPaint(const zeus::CVector3f& enemyPos, float radius, float alpha, - const SRadarPaintDrawParms& parms) const; + CRadarPaintShader m_paintShader; + std::vector m_paintInsts; + void DoDrawRadarPaint(const zeus::CVector3f& translate, float radius, const zeus::CColor& color); + void DrawRadarPaint(const zeus::CVector3f& enemyPos, float radius, float alpha, const SRadarPaintDrawParms& parms); public: CHudRadarInterface(CGuiFrame& baseHud, CStateManager& stateMgr); void SetIsVisibleGame(bool v); void Update(float dt, const CStateManager& mgr); - void Draw(const CStateManager& mgr, float alpha) const; + void Draw(const CStateManager& mgr, float alpha); }; } // namespace urde From b72d217a685fe0fa44dd53332612057cbee65b1e Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 9 Apr 2020 21:28:50 -0400 Subject: [PATCH 020/224] CCompoundTargetingReticle: Remove mutable specifier on m_scanRetRenderer This can be trivially resolved by dropping const qualifiers on the necessary member functions. --- Runtime/GuiSys/CCompoundTargetReticle.cpp | 7 ++++--- Runtime/GuiSys/CCompoundTargetReticle.hpp | 6 +++--- Runtime/GuiSys/CTargetingManager.cpp | 2 +- Runtime/GuiSys/CTargetingManager.hpp | 2 +- Runtime/MP1/CPlayerVisor.cpp | 4 ++-- Runtime/MP1/CPlayerVisor.hpp | 4 ++-- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Runtime/GuiSys/CCompoundTargetReticle.cpp b/Runtime/GuiSys/CCompoundTargetReticle.cpp index 956a653fd..3f08768fa 100644 --- a/Runtime/GuiSys/CCompoundTargetReticle.cpp +++ b/Runtime/GuiSys/CCompoundTargetReticle.cpp @@ -431,7 +431,7 @@ void CCompoundTargetReticle::UpdateOrbitZoneGroup(float dt, const CStateManager& x1e8_crosshairsScale = std::max(0.f, x1e8_crosshairsScale - dt / g_tweakTargeting->GetCrosshairsScaleDuration()); } -void CCompoundTargetReticle::Draw(const CStateManager& mgr, bool hideLockon) const { +void CCompoundTargetReticle::Draw(const CStateManager& mgr, bool hideLockon) { if (mgr.GetPlayer().GetMorphballTransitionState() == CPlayer::EPlayerMorphBallState::Unmorphed && !mgr.GetCameraManager()->IsInCinematicCamera()) { SCOPED_GRAPHICS_DEBUG_GROUP("CCompoundTargetReticle::Draw", zeus::skCyan); @@ -740,9 +740,10 @@ void CCompoundTargetReticle::DrawCurrLockOnGroup(const zeus::CMatrix3f& rot, con } } -void CCompoundTargetReticle::DrawNextLockOnGroup(const zeus::CMatrix3f& rot, const CStateManager& mgr) const { - if (x28_noDrawTicks > 0) +void CCompoundTargetReticle::DrawNextLockOnGroup(const zeus::CMatrix3f& rot, const CStateManager& mgr) { + if (x28_noDrawTicks > 0) { return; + } zeus::CVector3f position = x174_nextGroupInterp.GetTargetPositionWorld(); float visorFactor = mgr.GetPlayerState()->GetVisorTransitionFactor(); diff --git a/Runtime/GuiSys/CCompoundTargetReticle.hpp b/Runtime/GuiSys/CCompoundTargetReticle.hpp index e1df8b7e0..4c3470d4a 100644 --- a/Runtime/GuiSys/CCompoundTargetReticle.hpp +++ b/Runtime/GuiSys/CCompoundTargetReticle.hpp @@ -129,7 +129,7 @@ private: std::optional m_stripRenderers[2][4]; SScanReticuleRenderer(); }; - mutable SScanReticuleRenderer m_scanRetRenderer; + SScanReticuleRenderer m_scanRetRenderer; void DrawGrapplePoint(const CScriptGrapplePoint& point, float t, const CStateManager& mgr, const zeus::CMatrix3f& rot, bool zEqual) const; @@ -144,10 +144,10 @@ public: void UpdateCurrLockOnGroup(float, const CStateManager&); void UpdateNextLockOnGroup(float, const CStateManager&); void UpdateOrbitZoneGroup(float, const CStateManager&); - void Draw(const CStateManager&, bool hideLockon) const; + void Draw(const CStateManager&, bool hideLockon); void DrawGrappleGroup(const zeus::CMatrix3f& rot, const CStateManager&, bool) const; void DrawCurrLockOnGroup(const zeus::CMatrix3f& rot, const CStateManager&) const; - void DrawNextLockOnGroup(const zeus::CMatrix3f& rot, const CStateManager&) const; + void DrawNextLockOnGroup(const zeus::CMatrix3f& rot, const CStateManager&); void DrawOrbitZoneGroup(const zeus::CMatrix3f& rot, const CStateManager&) const; void UpdateTargetParameters(CTargetReticleRenderState&, const CStateManager&); float CalculateRadiusWorld(const CActor&, const CStateManager&) const; diff --git a/Runtime/GuiSys/CTargetingManager.cpp b/Runtime/GuiSys/CTargetingManager.cpp index 8221fdc15..ee5bf3f5a 100644 --- a/Runtime/GuiSys/CTargetingManager.cpp +++ b/Runtime/GuiSys/CTargetingManager.cpp @@ -18,7 +18,7 @@ void CTargetingManager::Update(float dt, const CStateManager& stateMgr) { x21c_orbitPointMarker.Update(dt, stateMgr); } -void CTargetingManager::Draw(const CStateManager& mgr, bool hideLockon) const { +void CTargetingManager::Draw(const CStateManager& mgr, bool hideLockon) { CGraphics::SetAmbientColor(zeus::skWhite); CGraphics::DisableAllLights(); x21c_orbitPointMarker.Draw(mgr); diff --git a/Runtime/GuiSys/CTargetingManager.hpp b/Runtime/GuiSys/CTargetingManager.hpp index 58d383930..7e6228c15 100644 --- a/Runtime/GuiSys/CTargetingManager.hpp +++ b/Runtime/GuiSys/CTargetingManager.hpp @@ -13,7 +13,7 @@ public: explicit CTargetingManager(const CStateManager& stateMgr); bool CheckLoadComplete(); void Update(float, const CStateManager& stateMgr); - void Draw(const CStateManager& stateMgr, bool hideLockon) const; + void Draw(const CStateManager& stateMgr, bool hideLockon); void Touch(); CCompoundTargetReticle& CompoundTargetReticle() { return x0_targetReticule; } }; diff --git a/Runtime/MP1/CPlayerVisor.cpp b/Runtime/MP1/CPlayerVisor.cpp index bf499de71..2c6ba0d2e 100644 --- a/Runtime/MP1/CPlayerVisor.cpp +++ b/Runtime/MP1/CPlayerVisor.cpp @@ -321,7 +321,7 @@ void CPlayerVisor::LockUnlockAssets() { #endif } -void CPlayerVisor::DrawScanEffect(const CStateManager& mgr, const CTargetingManager* tgtMgr) { +void CPlayerVisor::DrawScanEffect(const CStateManager& mgr, CTargetingManager* tgtMgr) { SCOPED_GRAPHICS_DEBUG_GROUP("CPlayerVisor::DrawScanEffect", zeus::skMagenta); const bool indicatorsDrawn = DrawScanObjectIndicators(mgr); @@ -645,7 +645,7 @@ void CPlayerVisor::Update(float dt, const CStateManager& mgr) { x58_scanMagInterp = std::max(x58_scanMagInterp - 2.f * dt, scanMag); } -void CPlayerVisor::Draw(const CStateManager& mgr, const CTargetingManager* tgtManager) { +void CPlayerVisor::Draw(const CStateManager& mgr, CTargetingManager* tgtManager) { CGraphics::SetAmbientColor(zeus::skWhite); CGraphics::DisableAllLights(); switch (mgr.GetPlayerState()->GetActiveVisor(mgr)) { diff --git a/Runtime/MP1/CPlayerVisor.hpp b/Runtime/MP1/CPlayerVisor.hpp index d502ba090..a38135aca 100644 --- a/Runtime/MP1/CPlayerVisor.hpp +++ b/Runtime/MP1/CPlayerVisor.hpp @@ -72,7 +72,7 @@ class CPlayerVisor { void UpdateScanWindow(float dt, const CStateManager& mgr); EScanWindowState GetDesiredScanWindowState(const CStateManager& mgr) const; void LockUnlockAssets(); - void DrawScanEffect(const CStateManager& mgr, const CTargetingManager* tgtMgr); + void DrawScanEffect(const CStateManager& mgr, CTargetingManager* tgtMgr); void DrawXRayEffect(const CStateManager& mgr); void DrawThermalEffect(const CStateManager& mgr); void UpdateCurrentVisor(float transFactor); @@ -85,7 +85,7 @@ public: explicit CPlayerVisor(CStateManager& stateMgr); ~CPlayerVisor(); void Update(float dt, const CStateManager& stateMgr); - void Draw(const CStateManager& stateMgr, const CTargetingManager* tgtManager); + void Draw(const CStateManager& stateMgr, CTargetingManager* tgtManager); void Touch(); float GetDesiredViewportScaleX(const CStateManager& stateMgr) const; float GetDesiredViewportScaleY(const CStateManager& stateMgr) const; From 2fadaf544d79b131c15fc24e83dd381a1016b906 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 9 Apr 2020 21:35:14 -0400 Subject: [PATCH 021/224] CCompoundTargetReticle: Remove mutable specifier on x28_noDrawTicks This is no longer needed at all. --- Runtime/GuiSys/CCompoundTargetReticle.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/GuiSys/CCompoundTargetReticle.hpp b/Runtime/GuiSys/CCompoundTargetReticle.hpp index 4c3470d4a..7d8f20a53 100644 --- a/Runtime/GuiSys/CCompoundTargetReticle.hpp +++ b/Runtime/GuiSys/CCompoundTargetReticle.hpp @@ -69,7 +69,7 @@ private: zeus::CQuaternion x10_laggingOrientation; EReticleState x20_prevState = EReticleState::Unspecified; EReticleState x24_nextState = EReticleState::Unspecified; - mutable u32 x28_noDrawTicks = 0; + u32 x28_noDrawTicks = 0; float x2c_overshootOffsetHalf; float x30_premultOvershootOffset; TCachedToken x34_crosshairs; From cd0a3780c0012d44026e9bd5154fb9a6cfd001dd Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 9 Apr 2020 21:40:46 -0400 Subject: [PATCH 022/224] CRainSplashGenerator: Remove mutable specifier from m_renderer We can just drop the const specifiers on relevant member functions to get rid of the need for this. --- Runtime/Graphics/CRainSplashGenerator.cpp | 24 +++++++++++++---------- Runtime/Graphics/CRainSplashGenerator.hpp | 10 +++++----- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/Runtime/Graphics/CRainSplashGenerator.cpp b/Runtime/Graphics/CRainSplashGenerator.cpp index dd91613c3..05f5d750f 100644 --- a/Runtime/Graphics/CRainSplashGenerator.cpp +++ b/Runtime/Graphics/CRainSplashGenerator.cpp @@ -22,7 +22,7 @@ CRainSplashGenerator::CRainSplashGenerator(const zeus::CVector3f& scale, u32 max } BooTrace); } -void CRainSplashGenerator::SSplashLine::Draw(float alpha, float dt, const zeus::CVector3f& pos) const { +void CRainSplashGenerator::SSplashLine::Draw(float alpha, float dt, const zeus::CVector3f& pos) { if (x0_t > 0.f) { float delta = dt * xc_speed; float vt = std::max(0.f, x0_t - delta * x15_length); @@ -39,36 +39,40 @@ void CRainSplashGenerator::SSplashLine::Draw(float alpha, float dt, const zeus:: } } -void CRainSplashGenerator::SRainSplash::Draw(float alpha, float dt, const zeus::CVector3f& pos) const { - for (const SSplashLine& line : x0_lines) +void CRainSplashGenerator::SRainSplash::Draw(float alpha, float dt, const zeus::CVector3f& pos) { + for (SSplashLine& line : x0_lines) { line.Draw(alpha, dt, pos); + } } -void CRainSplashGenerator::DoDraw(const zeus::CTransform& xf) const { +void CRainSplashGenerator::DoDraw(const zeus::CTransform& xf) { SCOPED_GRAPHICS_DEBUG_GROUP("CRainSplashGenerator::DoDraw", zeus::skYellow); CGraphics::SetModelMatrix(xf); if (x40_queueSize > 0) { if (x38_queueTail <= x3c_queueHead) { for (size_t i = x3c_queueHead; i < x0_rainSplashes.size(); ++i) { - const SRainSplash& splash = x0_rainSplashes[i]; + SRainSplash& splash = x0_rainSplashes[i]; splash.Draw(x30_alpha, x28_dt, splash.x64_pos); } for (size_t i = 0; i < x38_queueTail; ++i) { - const SRainSplash& splash = x0_rainSplashes[i]; + SRainSplash& splash = x0_rainSplashes[i]; splash.Draw(x30_alpha, x28_dt, splash.x64_pos); } } else { for (size_t i = x3c_queueHead; i < x38_queueTail; ++i) { - const SRainSplash& splash = x0_rainSplashes[i]; + SRainSplash& splash = x0_rainSplashes[i]; splash.Draw(x30_alpha, x28_dt, splash.x64_pos); } } } } -void CRainSplashGenerator::Draw(const zeus::CTransform& xf) const { - if (x48_25_raining) - DoDraw(xf); +void CRainSplashGenerator::Draw(const zeus::CTransform& xf) { + if (!x48_25_raining) { + return; + } + + DoDraw(xf); } CRainSplashGenerator::SSplashLine::SSplashLine(boo::IGraphicsDataFactory::Context& ctx) diff --git a/Runtime/Graphics/CRainSplashGenerator.hpp b/Runtime/Graphics/CRainSplashGenerator.hpp index 3f2ade690..7a63534ab 100644 --- a/Runtime/Graphics/CRainSplashGenerator.hpp +++ b/Runtime/Graphics/CRainSplashGenerator.hpp @@ -23,10 +23,10 @@ class CRainSplashGenerator { u8 x14_ = 3; u8 x15_length = 1; bool x16_active = true; // used to be one-bit bitfield - mutable CLineRenderer m_renderer; + CLineRenderer m_renderer; explicit SSplashLine(boo::IGraphicsDataFactory::Context& ctx); void Update(float dt, CStateManager& mgr); - void Draw(float alpha, float dt, const zeus::CVector3f& pos) const; + void Draw(float alpha, float dt, const zeus::CVector3f& pos); void SetActive() { x16_active = true; } }; struct SRainSplash { @@ -40,7 +40,7 @@ class CRainSplashGenerator { SRainSplash& operator=(SRainSplash&&) = default; void Update(float dt, CStateManager& mgr); bool IsActive() const; - void Draw(float alpha, float dt, const zeus::CVector3f& pos) const; + void Draw(float alpha, float dt, const zeus::CVector3f& pos); void SetPoint(const zeus::CVector3f& pos); }; std::vector x0_rainSplashes; @@ -60,7 +60,7 @@ class CRainSplashGenerator { bool x48_25_raining : 1; void UpdateRainSplashRange(CStateManager& mgr, int start, int end, float dt); void UpdateRainSplashes(CStateManager& mgr, float magnitude, float dt); - void DoDraw(const zeus::CTransform& xf) const; + void DoDraw(const zeus::CTransform& xf); static u32 GetNextBestPt(u32 pt, const std::vector>& vn, CRandom16& rand, float minZ); void AddPoint(const zeus::CVector3f& pos); @@ -69,7 +69,7 @@ public: CRainSplashGenerator(const zeus::CVector3f& scale, u32 maxSplashes, u32 genRate, float minZ, float alpha); void Update(float dt, CStateManager& mgr); void GeneratePoints(const std::vector>& vn); - void Draw(const zeus::CTransform& xf) const; + void Draw(const zeus::CTransform& xf); bool IsRaining() const { return x48_25_raining; } }; From 124356b4e79514d3b47e8b8b3112b35a6c00ad54 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 9 Apr 2020 21:44:46 -0400 Subject: [PATCH 023/224] CSimpleShadow: Remove mutable specifier on m_filter This is no longer necessary now that we can remove the const qualifier on Render(). --- Runtime/Graphics/CSimpleShadow.cpp | 2 +- Runtime/Graphics/CSimpleShadow.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Runtime/Graphics/CSimpleShadow.cpp b/Runtime/Graphics/CSimpleShadow.cpp index 7beb2d5b9..8e9f6164c 100644 --- a/Runtime/Graphics/CSimpleShadow.cpp +++ b/Runtime/Graphics/CSimpleShadow.cpp @@ -27,7 +27,7 @@ zeus::CAABox CSimpleShadow::GetBounds() const { {x0_xf.origin.x() + extent, x0_xf.origin.y() + extent, x0_xf.origin.z() + extent}}; } -void CSimpleShadow::Render(const TLockedToken& tex) const { +void CSimpleShadow::Render(const TLockedToken& tex) { if (!x48_24_collision) return; SCOPED_GRAPHICS_DEBUG_GROUP("CSimpleShadow::Render", zeus::skGrey); diff --git a/Runtime/Graphics/CSimpleShadow.hpp b/Runtime/Graphics/CSimpleShadow.hpp index 43f368a70..ca6736f7e 100644 --- a/Runtime/Graphics/CSimpleShadow.hpp +++ b/Runtime/Graphics/CSimpleShadow.hpp @@ -22,7 +22,7 @@ class CSimpleShadow { bool x48_24_collision : 1; bool x48_25_alwaysCalculateRadius : 1; bool x48_26_radiusCalculated : 1; - mutable std::optional m_filter; + std::optional m_filter; public: CSimpleShadow(float scale, float userAlpha, float maxObjHeight, float displacement); @@ -33,7 +33,7 @@ public: float GetMaxObjectHeight() const { return x40_maxObjHeight; } void SetUserAlpha(float a) { x38_userAlpha = a; } const zeus::CTransform& GetTransform() const { return x0_xf; } - void Render(const TLockedToken& tex) const; + void Render(const TLockedToken& tex); void Calculate(const zeus::CAABox& aabb, const zeus::CTransform& xf, const CStateManager& mgr); }; } // namespace urde From 549f58d835ba67422cfc78f92801fbbe8da1de70 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 9 Apr 2020 21:46:54 -0400 Subject: [PATCH 024/224] CScriptDamageableTrigger: Remove mutable specifier on x254_fluidPlane This is no longer necessary now that Render() is non-const. --- Runtime/World/CScriptDamageableTrigger.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/World/CScriptDamageableTrigger.hpp b/Runtime/World/CScriptDamageableTrigger.hpp index 590cff53b..991bbdb0b 100644 --- a/Runtime/World/CScriptDamageableTrigger.hpp +++ b/Runtime/World/CScriptDamageableTrigger.hpp @@ -29,7 +29,7 @@ private: zeus::CTransform x214_faceDirInv; zeus::CVector3f x244_faceTranslate; float x250_alphaTimer = 0.f; - mutable CFluidPlaneDoor x254_fluidPlane; + CFluidPlaneDoor x254_fluidPlane; union { struct { bool x300_24_notOccluded : 1; From e0a4dc37a4fb3cf2bae9e26ff6f412bbe6f80111 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 9 Apr 2020 21:49:59 -0400 Subject: [PATCH 025/224] CPathFindSearch: Remove use of mutable on m_viz We can just drop the const qualifier on DebugDraw() to get rid of the need to specify this. --- Runtime/World/CPathFindSearch.cpp | 5 +++-- Runtime/World/CPathFindSearch.hpp | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Runtime/World/CPathFindSearch.cpp b/Runtime/World/CPathFindSearch.cpp index a8de88774..3cdb5dab2 100644 --- a/Runtime/World/CPathFindSearch.cpp +++ b/Runtime/World/CPathFindSearch.cpp @@ -357,9 +357,10 @@ void CPathFindVisualizer::Draw(const CPathFindSearch& path) { m_spline.Render(); } -void CPathFindSearch::DebugDraw() const { - if (!m_viz) +void CPathFindSearch::DebugDraw() { + if (!m_viz) { m_viz.emplace(); + } m_viz->Draw(*this); } diff --git a/Runtime/World/CPathFindSearch.hpp b/Runtime/World/CPathFindSearch.hpp index ce5a37d6e..1843b6042 100644 --- a/Runtime/World/CPathFindSearch.hpp +++ b/Runtime/World/CPathFindSearch.hpp @@ -33,7 +33,7 @@ private: float xd8_padding = 10.f; u32 xdc_flags; // 0x2: flyer, 0x4: path-always-exists (swimmers) u32 xe0_indexMask; - mutable std::optional m_viz; + std::optional m_viz; bool Search(rstl::reserved_vector& regs1, const zeus::CVector3f& p1, rstl::reserved_vector& regs2, const zeus::CVector3f& p2); void GetSplinePoint(zeus::CVector3f& pOut, const zeus::CVector3f& p1, u32 wpIdx) const; @@ -61,7 +61,7 @@ public: void SetCharacterRadius(float r) { xd4_chRadius = r; } void SetPadding(float padding) { xd8_padding = padding; } float RemainingPathDistance(const zeus::CVector3f& pos) const; - void DebugDraw() const; + void DebugDraw(); }; } // namespace urde From 859d5e90686068ef517e6924367057415abd4bcd Mon Sep 17 00:00:00 2001 From: Luke Street Date: Thu, 9 Apr 2020 22:46:09 -0400 Subject: [PATCH 026/224] DNAMP2: Mark FrontEnd as non-shared --- DataSpec/DNAMP2/DNAMP2.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/DataSpec/DNAMP2/DNAMP2.cpp b/DataSpec/DNAMP2/DNAMP2.cpp index 779369826..4632705b2 100644 --- a/DataSpec/DNAMP2/DNAMP2.cpp +++ b/DataSpec/DNAMP2/DNAMP2.cpp @@ -27,7 +27,9 @@ logvisor::Module Log("urde::DNAMP2"); static bool GetNoShare(std::string_view name) { std::string lowerName(name); std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower); - if (!lowerName.compare(0, 7, "metroid")) + if (lowerName.compare(0, 7, "metroid") == 0) + return false; + if (lowerName.compare(0, 8, "frontend") == 0) return false; return true; } From 380cc13abbd149869ce239d4edfb5ea262bc7efa Mon Sep 17 00:00:00 2001 From: Jack Andersen Date: Thu, 9 Apr 2020 17:20:20 -1000 Subject: [PATCH 027/224] Fixes for MP3 --- DataSpec/Blender/RetroMasterShader.py | 1062 +++++++++++++++---------- DataSpec/DNACommon/MayaSpline.hpp | 2 + DataSpec/DNACommon/RigInverter.cpp | 1 - DataSpec/DNAMP2/CINF.cpp | 43 +- DataSpec/DNAMP2/CINF.hpp | 11 +- DataSpec/DNAMP2/DNAMP2.cpp | 4 +- DataSpec/DNAMP2/MREA.cpp | 3 +- DataSpec/DNAMP3/CINF.cpp | 48 -- DataSpec/DNAMP3/CINF.hpp | 10 +- DataSpec/DNAMP3/CMDLMaterials.cpp | 550 ++++++------- DataSpec/DNAMP3/CMDLMaterials.hpp | 126 +-- DataSpec/DNAMP3/CMakeLists.txt | 3 +- DataSpec/DNAMP3/DNAMP3.cpp | 37 +- DataSpec/DNAMP3/MREA.cpp | 30 +- DataSpec/DNAMP3/MREA.hpp | 3 + DataSpec/DNAMP3/PATH.hpp | 6 + hecl | 2 +- 17 files changed, 1095 insertions(+), 846 deletions(-) delete mode 100644 DataSpec/DNAMP3/CINF.cpp create mode 100644 DataSpec/DNAMP3/PATH.hpp diff --git a/DataSpec/Blender/RetroMasterShader.py b/DataSpec/Blender/RetroMasterShader.py index 3d13f9625..4749aa409 100644 --- a/DataSpec/Blender/RetroMasterShader.py +++ b/DataSpec/Blender/RetroMasterShader.py @@ -721,11 +721,661 @@ def make_retro_dynamic_character_shader(): new_grp.links.new(final_add_shader.outputs['Shader'], alpha_mix.inputs[2]) new_grp.links.new(alpha_mix.outputs['Shader'], mat_out.inputs['Surface']) +# MP3 / DKCR Material Passes: +# https://wiki.axiodl.com/w/Materials_(Metroid_Prime_3) + +def make_retro_shader_mp3_color(): + new_grp = bpy.data.node_groups.new("__RetroShaderMP3Color", "ShaderNodeTree") + new_grp.use_fake_user = True + input = new_grp.inputs.new("NodeSocketColor", "DIFFC") + input.default_value = (0.0, 0.0, 0.0, 1.0) + input = new_grp.inputs.new("NodeSocketColor", "DIFBC") + input.default_value = (1.0, 1.0, 1.0, 1.0) + input = new_grp.inputs.new("NodeSocketColor", "CLRC") + input.default_value = (0.5, 0.5, 0.5, 1.0) + input = new_grp.inputs.new("NodeSocketFloatFactor", "CLRA") + input.default_value = 1.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "TRAN") + input.default_value = 1.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketColor", "RFLDC") + input.default_value = (0.0, 0.0, 0.0, 1.0) + input = new_grp.inputs.new("NodeSocketFloatFactor", "RFLDA") + input.default_value = 1.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketColor", "RFLV") + input.default_value = (0.0, 0.0, 0.0, 1.0) + input = new_grp.inputs.new("NodeSocketColor", "LRLD") + input.default_value = (0.0, 0.0, 0.0, 1.0) + input = new_grp.inputs.new("NodeSocketColor", "LURDC") + input.default_value = (0.0, 0.0, 0.0, 1.0) + input = new_grp.inputs.new("NodeSocketFloatFactor", "LURDA") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketColor", "INCAC") + input.default_value = (0.0, 0.0, 0.0, 1.0) + input = new_grp.inputs.new("NodeSocketInt", "Add INCA") + input.default_value = 0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "OPAC") + input.default_value = 1.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + new_grp.outputs.new("NodeSocketShader", "Shader") + nodes = {} + node = new_grp.nodes.new("ShaderNodeBsdfDiffuse") + node.name = "Diffuse BSDF.004" + nodes["Diffuse BSDF.004"] = node + node.label = "" + node.location = (-196.910400390625, -503.60546875) + node.inputs[0].default_value = (0.800000011920929, 0.800000011920929, 0.800000011920929, 1.0) + node.inputs[1].default_value = 0.0 + node.inputs[2].default_value = (0.0, 0.0, 0.0) + node = new_grp.nodes.new("ShaderNodeAddShader") + node.name = "Add Shader.009" + nodes["Add Shader.009"] = node + node.label = "" + node.location = (14.618888854980469, -571.516357421875) + node = new_grp.nodes.new("ShaderNodeAddShader") + node.name = "Add Shader.008" + nodes["Add Shader.008"] = node + node.label = "" + node.location = (6.4276123046875, -926.3602905273438) + node = new_grp.nodes.new("ShaderNodeBsdfDiffuse") + node.name = "Diffuse BSDF.005" + nodes["Diffuse BSDF.005"] = node + node.label = "" + node.location = (-189.85516357421875, -865.79345703125) + node.inputs[0].default_value = (0.800000011920929, 0.800000011920929, 0.800000011920929, 1.0) + node.inputs[1].default_value = 0.0 + node.inputs[2].default_value = (0.0, 0.0, 0.0) + node = new_grp.nodes.new("ShaderNodeMixRGB") + node.name = "Mix.005" + nodes["Mix.005"] = node + node.label = "" + node.location = (-190.5804901123047, -1017.0886840820312) + node.blend_type = "MULTIPLY" + node.inputs[0].default_value = 1.0 + node.inputs[1].default_value = (0.5, 0.5, 0.5, 1.0) + node.inputs[2].default_value = (0.5, 0.5, 0.5, 1.0) + node = new_grp.nodes.new("ShaderNodeMixRGB") + node.name = "Mix.004" + nodes["Mix.004"] = node + node.label = "" + node.location = (-381.6676940917969, -870.815673828125) + node.blend_type = "MULTIPLY" + node.inputs[0].default_value = 1.0 + node.inputs[1].default_value = (0.5, 0.5, 0.5, 1.0) + node.inputs[2].default_value = (0.5, 0.5, 0.5, 1.0) + node = new_grp.nodes.new("ShaderNodeAddShader") + node.name = "Add Shader.006" + nodes["Add Shader.006"] = node + node.label = "" + node.location = (220.7507781982422, -724.6066284179688) + node = new_grp.nodes.new("ShaderNodeAddShader") + node.name = "Add Shader.005" + nodes["Add Shader.005"] = node + node.label = "" + node.location = (218.0698699951172, -528.0934448242188) + node = new_grp.nodes.new("ShaderNodeAddShader") + node.name = "Add Shader.007" + nodes["Add Shader.007"] = node + node.label = "" + node.location = (388.0714416503906, -600.8295288085938) + node = new_grp.nodes.new("ShaderNodeMixRGB") + node.name = "Mix.002" + nodes["Mix.002"] = node + node.label = "" + node.location = (-192.1793212890625, -281.65264892578125) + node.blend_type = "MULTIPLY" + node.inputs[0].default_value = 1.0 + node.inputs[1].default_value = (0.5, 0.5, 0.5, 1.0) + node.inputs[2].default_value = (0.5, 0.5, 0.5, 1.0) + node = new_grp.nodes.new("ShaderNodeAddShader") + node.name = "Add Shader.010" + nodes["Add Shader.010"] = node + node.label = "" + node.location = (522.2215576171875, -284.7532653808594) + node = new_grp.nodes.new("ShaderNodeMixRGB") + node.name = "Mix.001" + nodes["Mix.001"] = node + node.label = "" + node.location = (-198.2812957763672, -13.079503059387207) + node.blend_type = "MULTIPLY" + node.inputs[0].default_value = 1.0 + node.inputs[1].default_value = (0.5, 0.5, 0.5, 1.0) + node.inputs[2].default_value = (0.5, 0.5, 0.5, 1.0) + node = new_grp.nodes.new("ShaderNodeBsdfDiffuse") + node.name = "Diffuse BSDF.001" + nodes["Diffuse BSDF.001"] = node + node.label = "" + node.location = (-200.4605255126953, 138.9542694091797) + node.inputs[0].default_value = (0.800000011920929, 0.800000011920929, 0.800000011920929, 1.0) + node.inputs[1].default_value = 0.0 + node.inputs[2].default_value = (0.0, 0.0, 0.0) + node = new_grp.nodes.new("ShaderNodeAddShader") + node.name = "Add Shader.001" + nodes["Add Shader.001"] = node + node.label = "" + node.location = (-14.161624908447266, 32.61324691772461) + node = new_grp.nodes.new("NodeGroupOutput") + node.name = "Group Output" + nodes["Group Output"] = node + node.label = "" + node.location = (948.8831176757812, -299.1160583496094) + node = new_grp.nodes.new("ShaderNodeBsdfTransparent") + node.name = "Transparent BSDF.001" + nodes["Transparent BSDF.001"] = node + node.label = "" + node.location = (604.5911254882812, -88.7776870727539) + node.inputs[0].default_value = (1.0, 1.0, 1.0, 1.0) + node = new_grp.nodes.new("ShaderNodeMixShader") + node.name = "Mix Shader" + nodes["Mix Shader"] = node + node.label = "" + node.location = (772.179443359375, -91.1546401977539) + node.inputs[0].default_value = 0.5 + node = new_grp.nodes.new("ShaderNodeAddShader") + node.name = "Add Shader.012" + nodes["Add Shader.012"] = node + node.label = "" + node.location = (776.751953125, -432.8694152832031) + node = new_grp.nodes.new("ShaderNodeAddShader") + node.name = "Add Shader.011" + nodes["Add Shader.011"] = node + node.label = "" + node.location = (779.857177734375, -294.9550476074219) + node = new_grp.nodes.new("ShaderNodeMixRGB") + node.name = "Mix.006" + nodes["Mix.006"] = node + node.label = "" + node.location = (-192.534912109375, -643.984619140625) + node.blend_type = "MULTIPLY" + node.inputs[0].default_value = 1.0 + node.inputs[1].default_value = (0.5, 0.5, 0.5, 1.0) + node.inputs[2].default_value = (0.5, 0.5, 0.5, 1.0) + node = new_grp.nodes.new("ShaderNodeMixRGB") + node.name = "Mix.003" + nodes["Mix.003"] = node + node.label = "" + node.location = (-374.2341003417969, -515.1140747070312) + node.blend_type = "MULTIPLY" + node.inputs[0].default_value = 1.0 + node.inputs[1].default_value = (0.5, 0.5, 0.5, 1.0) + node.inputs[2].default_value = (0.5, 0.5, 0.5, 1.0) + node = new_grp.nodes.new("ShaderNodeMixRGB") + node.name = "Mix" + nodes["Mix"] = node + node.label = "" + node.location = (-500.3056640625, -114.82369995117188) + node.blend_type = "MULTIPLY" + node.inputs[0].default_value = 1.0 + node.inputs[1].default_value = (0.5, 0.5, 0.5, 1.0) + node.inputs[2].default_value = (0.5, 0.5, 0.5, 1.0) + node = new_grp.nodes.new("ShaderNodeMath") + node.name = "Math" + nodes["Math"] = node + node.label = "" + node.location = (454.39404296875, 96.02081298828125) + node.operation = "MULTIPLY" + node.inputs[0].default_value = 0.5 + node.inputs[1].default_value = 0.5 + node = new_grp.nodes.new("ShaderNodeMath") + node.name = "Math.001" + nodes["Math.001"] = node + node.label = "" + node.location = (619.3079223632812, 90.52423095703125) + node.operation = "MULTIPLY" + node.inputs[0].default_value = 0.5 + node.inputs[1].default_value = 0.5 + node = new_grp.nodes.new("ShaderNodeMath") + node.name = "Math.002" + nodes["Math.002"] = node + node.label = "" + node.location = (785.3211059570312, 81.7295913696289) + node.operation = "MULTIPLY" + node.inputs[0].default_value = 0.5 + node.inputs[1].default_value = 0.5 + node = new_grp.nodes.new("ShaderNodeBsdfTransparent") + node.name = "Transparent BSDF" + nodes["Transparent BSDF"] = node + node.label = "" + node.location = (597.9944458007812, -480.7802734375) + node.inputs[0].default_value = (1.0, 1.0, 1.0, 1.0) + node = new_grp.nodes.new("NodeGroupInput") + node.name = "Group Input" + nodes["Group Input"] = node + node.label = "" + node.location = (-669.6587524414062, -193.9534149169922) + new_grp.links.new(nodes["Group Input"].outputs[0], nodes["Mix"].inputs[1]) + new_grp.links.new(nodes["Group Input"].outputs[1], nodes["Mix"].inputs[2]) + new_grp.links.new(nodes["Mix"].outputs[0], nodes["Mix.001"].inputs[1]) + new_grp.links.new(nodes["Group Input"].outputs[2], nodes["Mix.001"].inputs[2]) + new_grp.links.new(nodes["Mix.001"].outputs[0], nodes["Add Shader.001"].inputs[1]) + new_grp.links.new(nodes["Diffuse BSDF.001"].outputs[0], nodes["Add Shader.001"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[2], nodes["Diffuse BSDF.001"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[5], nodes["Mix.002"].inputs[1]) + new_grp.links.new(nodes["Group Input"].outputs[7], nodes["Mix.002"].inputs[2]) + new_grp.links.new(nodes["Mix.002"].outputs[0], nodes["Add Shader.005"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[5], nodes["Mix.003"].inputs[1]) + new_grp.links.new(nodes["Group Input"].outputs[8], nodes["Mix.003"].inputs[2]) + new_grp.links.new(nodes["Mix.003"].outputs[0], nodes["Diffuse BSDF.004"].inputs[0]) + new_grp.links.new(nodes["Diffuse BSDF.004"].outputs[0], nodes["Add Shader.009"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[5], nodes["Mix.004"].inputs[1]) + new_grp.links.new(nodes["Group Input"].outputs[10], nodes["Mix.004"].inputs[2]) + new_grp.links.new(nodes["Mix.004"].outputs[0], nodes["Diffuse BSDF.005"].inputs[0]) + new_grp.links.new(nodes["Diffuse BSDF.005"].outputs[0], nodes["Add Shader.008"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[9], nodes["Add Shader.006"].inputs[0]) + new_grp.links.new(nodes["Add Shader.005"].outputs[0], nodes["Add Shader.007"].inputs[0]) + new_grp.links.new(nodes["Add Shader.006"].outputs[0], nodes["Add Shader.007"].inputs[1]) + new_grp.links.new(nodes["Group Input"].outputs[10], nodes["Mix.005"].inputs[2]) + new_grp.links.new(nodes["Mix"].outputs[0], nodes["Mix.005"].inputs[1]) + new_grp.links.new(nodes["Add Shader.008"].outputs[0], nodes["Add Shader.006"].inputs[1]) + new_grp.links.new(nodes["Mix.005"].outputs[0], nodes["Add Shader.008"].inputs[1]) + new_grp.links.new(nodes["Group Input"].outputs[8], nodes["Mix.006"].inputs[2]) + new_grp.links.new(nodes["Mix"].outputs[0], nodes["Mix.006"].inputs[1]) + new_grp.links.new(nodes["Add Shader.009"].outputs[0], nodes["Add Shader.005"].inputs[1]) + new_grp.links.new(nodes["Mix.006"].outputs[0], nodes["Add Shader.009"].inputs[1]) + new_grp.links.new(nodes["Add Shader.007"].outputs[0], nodes["Add Shader.010"].inputs[1]) + new_grp.links.new(nodes["Add Shader.001"].outputs[0], nodes["Add Shader.010"].inputs[0]) + new_grp.links.new(nodes["Transparent BSDF"].outputs[0], nodes["Add Shader.012"].inputs[1]) + new_grp.links.new(nodes["Group Input"].outputs[11], nodes["Add Shader.012"].inputs[0]) + new_grp.links.new(nodes["Add Shader.012"].outputs[0], nodes["Add Shader.011"].inputs[1]) + new_grp.links.new(nodes["Add Shader.011"].outputs[0], nodes["Group Output"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[3], nodes["Math"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[13], nodes["Math"].inputs[1]) + new_grp.links.new(nodes["Math"].outputs[0], nodes["Math.001"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[4], nodes["Math.001"].inputs[1]) + new_grp.links.new(nodes["Math.001"].outputs[0], nodes["Math.002"].inputs[1]) + new_grp.links.new(nodes["Group Input"].outputs[6], nodes["Math.002"].inputs[0]) + new_grp.links.new(nodes["Math.002"].outputs[0], nodes["Mix Shader"].inputs[0]) + new_grp.links.new(nodes["Transparent BSDF.001"].outputs[0], nodes["Mix Shader"].inputs[1]) + new_grp.links.new(nodes["Add Shader.010"].outputs[0], nodes["Mix Shader"].inputs[2]) + new_grp.links.new(nodes["Mix Shader"].outputs[0], nodes["Add Shader.011"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[12], nodes["Transparent BSDF"].inputs[0]) + +def make_retro_shader_mp3_bloom(): + new_grp = bpy.data.node_groups.new("__RetroShaderMP3Bloom", "ShaderNodeTree") + new_grp.use_fake_user = True + input = new_grp.inputs.new("NodeSocketFloatFactor", "DIFFA") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "DIFBA") + input.default_value = 1.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "BLOL") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "BLOD") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "BLODB") + input.default_value = 0.5 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "TRAN") + input.default_value = 1.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "INCAA") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "BNIF") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "BLOI") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "BLOIB") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "OPAC") + input.default_value = 1.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketInt", "Add INCA") + input.default_value = 0 + input.min_value = 0.000000 + input.max_value = 1.000000 + new_grp.outputs.new("NodeSocketShader", "Shader") + nodes = {} + node = new_grp.nodes.new("ShaderNodeMath") + node.name = "Math.003" + nodes["Math.003"] = node + node.label = "" + node.location = (-131.26889038085938, -228.6888885498047) + node.operation = "MULTIPLY" + node.inputs[0].default_value = 0.5 + node.inputs[1].default_value = 0.5 + node = new_grp.nodes.new("ShaderNodeMath") + node.name = "Math" + nodes["Math"] = node + node.label = "" + node.location = (-501.6487731933594, -144.7719268798828) + node.operation = "MULTIPLY" + node.inputs[0].default_value = 0.5 + node.inputs[1].default_value = 0.5 + node = new_grp.nodes.new("ShaderNodeMath") + node.name = "Math.002" + nodes["Math.002"] = node + node.label = "" + node.location = (-328.3370666503906, -209.53160095214844) + node.operation = "MULTIPLY" + node.inputs[0].default_value = 0.5 + node.inputs[1].default_value = 0.5 + node = new_grp.nodes.new("NodeGroupOutput") + node.name = "Group Output" + nodes["Group Output"] = node + node.label = "" + node.location = (1109.7938232421875, -257.2006530761719) + node = new_grp.nodes.new("ShaderNodeMath") + node.name = "Math.001" + nodes["Math.001"] = node + node.label = "" + node.location = (129.59579467773438, -299.0679626464844) + node.operation = "MULTIPLY" + node.inputs[0].default_value = 0.5 + node.inputs[1].default_value = 0.5 + node = new_grp.nodes.new("ShaderNodeBsdfDiffuse") + node.name = "Diffuse BSDF.002" + nodes["Diffuse BSDF.002"] = node + node.label = "" + node.location = (122.80331420898438, -150.7427520751953) + node.inputs[0].default_value = (0.800000011920929, 0.800000011920929, 0.800000011920929, 1.0) + node.inputs[1].default_value = 0.0 + node.inputs[2].default_value = (0.0, 0.0, 0.0) + node = new_grp.nodes.new("ShaderNodeAddShader") + node.name = "Add Shader.002" + nodes["Add Shader.002"] = node + node.label = "" + node.location = (312.7171325683594, -220.0266571044922) + node = new_grp.nodes.new("ShaderNodeAddShader") + node.name = "Add Shader.005" + nodes["Add Shader.005"] = node + node.label = "" + node.location = (-165.06072998046875, -549.3956298828125) + node = new_grp.nodes.new("ShaderNodeAddShader") + node.name = "Add Shader.006" + nodes["Add Shader.006"] = node + node.label = "" + node.location = (20.3157958984375, -545.8302612304688) + node = new_grp.nodes.new("ShaderNodeBsdfTransparent") + node.name = "Transparent BSDF.001" + nodes["Transparent BSDF.001"] = node + node.label = "" + node.location = (205.5854034423828, -558.1273803710938) + node.inputs[0].default_value = (1.0, 1.0, 1.0, 1.0) + node = new_grp.nodes.new("ShaderNodeAddShader") + node.name = "Add Shader.001" + nodes["Add Shader.001"] = node + node.label = "" + node.location = (399.876708984375, -533.2184448242188) + node = new_grp.nodes.new("ShaderNodeMath") + node.name = "Math.004" + nodes["Math.004"] = node + node.label = "" + node.location = (-354.23876953125, -508.8504943847656) + node.operation = "MULTIPLY" + node.inputs[0].default_value = 0.5 + node.inputs[1].default_value = 0.5 + node = new_grp.nodes.new("ShaderNodeAddShader") + node.name = "Add Shader" + nodes["Add Shader"] = node + node.label = "" + node.location = (875.3080444335938, -248.47450256347656) + node = new_grp.nodes.new("ShaderNodeBsdfTransparent") + node.name = "Transparent BSDF" + nodes["Transparent BSDF"] = node + node.label = "" + node.location = (502.63671875, -341.6871032714844) + node.inputs[0].default_value = (1.0, 1.0, 1.0, 1.0) + node = new_grp.nodes.new("ShaderNodeMath") + node.name = "Math.006" + nodes["Math.006"] = node + node.label = "" + node.location = (505.8763122558594, -171.7743377685547) + node.operation = "MULTIPLY" + node.inputs[0].default_value = 0.5 + node.inputs[1].default_value = 0.5 + node = new_grp.nodes.new("ShaderNodeMixShader") + node.name = "Mix Shader" + nodes["Mix Shader"] = node + node.label = "" + node.location = (682.0885620117188, -169.31057739257812) + node.inputs[0].default_value = 0.5 + node = new_grp.nodes.new("NodeGroupInput") + node.name = "Group Input" + nodes["Group Input"] = node + node.label = "" + node.location = (-669.6587524414062, -193.9534149169922) + new_grp.links.new(nodes["Group Input"].outputs[0], nodes["Math"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[1], nodes["Math"].inputs[1]) + new_grp.links.new(nodes["Group Input"].outputs[3], nodes["Math.002"].inputs[1]) + new_grp.links.new(nodes["Group Input"].outputs[4], nodes["Math.003"].inputs[1]) + new_grp.links.new(nodes["Math.002"].outputs[0], nodes["Math.003"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[2], nodes["Math.002"].inputs[0]) + new_grp.links.new(nodes["Math"].outputs[0], nodes["Math.001"].inputs[0]) + new_grp.links.new(nodes["Diffuse BSDF.002"].outputs[0], nodes["Add Shader.002"].inputs[0]) + new_grp.links.new(nodes["Math.001"].outputs[0], nodes["Add Shader.002"].inputs[1]) + new_grp.links.new(nodes["Group Input"].outputs[10], nodes["Math.006"].inputs[1]) + new_grp.links.new(nodes["Group Input"].outputs[5], nodes["Math.006"].inputs[0]) + new_grp.links.new(nodes["Math.006"].outputs[0], nodes["Mix Shader"].inputs[0]) + new_grp.links.new(nodes["Transparent BSDF"].outputs[0], nodes["Mix Shader"].inputs[1]) + new_grp.links.new(nodes["Transparent BSDF.001"].outputs[0], nodes["Add Shader.001"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[6], nodes["Math.004"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[7], nodes["Math.004"].inputs[1]) + new_grp.links.new(nodes["Math.003"].outputs[0], nodes["Math.001"].inputs[1]) + new_grp.links.new(nodes["Math.003"].outputs[0], nodes["Diffuse BSDF.002"].inputs[0]) + new_grp.links.new(nodes["Math.004"].outputs[0], nodes["Add Shader.005"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[8], nodes["Add Shader.005"].inputs[1]) + new_grp.links.new(nodes["Add Shader.005"].outputs[0], nodes["Add Shader.006"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[9], nodes["Add Shader.006"].inputs[1]) + new_grp.links.new(nodes["Add Shader.006"].outputs[0], nodes["Add Shader.001"].inputs[1]) + new_grp.links.new(nodes["Add Shader"].outputs[0], nodes["Group Output"].inputs[0]) + new_grp.links.new(nodes["Mix Shader"].outputs[0], nodes["Add Shader"].inputs[0]) + new_grp.links.new(nodes["Add Shader.002"].outputs[0], nodes["Mix Shader"].inputs[2]) + new_grp.links.new(nodes["Add Shader.001"].outputs[0], nodes["Add Shader"].inputs[1]) + new_grp.links.new(nodes["Group Input"].outputs[11], nodes["Transparent BSDF.001"].inputs[0]) + +def make_retro_shader_mp3(): + new_grp = bpy.data.node_groups.new("RetroShaderMP3", "ShaderNodeTree") + new_grp.use_fake_user = True + input = new_grp.inputs.new("NodeSocketColor", "DIFFC") + input.default_value = (0.0, 0.0, 0.0, 1.0) + input = new_grp.inputs.new("NodeSocketFloatFactor", "DIFFA") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketColor", "DIFBC") + input.default_value = (1.0, 1.0, 1.0, 1.0) + input = new_grp.inputs.new("NodeSocketFloatFactor", "DIFBA") + input.default_value = 1.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "BLOL") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "BLOD") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "BLODB") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketColor", "CLR") + input.default_value = (0.0, 0.0, 0.0, 1.0) + input = new_grp.inputs.new("NodeSocketFloatFactor", "CLRA") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "TRAN") + input.default_value = 1.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketColor", "RFLD") + input.default_value = (0.0, 0.0, 0.0, 1.0) + input = new_grp.inputs.new("NodeSocketFloatFactor", "RFLDA") + input.default_value = 1.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketColor", "RFLV") + input.default_value = (0.0, 0.0, 0.0, 1.0) + input = new_grp.inputs.new("NodeSocketColor", "LRLD") + input.default_value = (0.0, 0.0, 0.0, 1.0) + input = new_grp.inputs.new("NodeSocketColor", "LURDC") + input.default_value = (0.0, 0.0, 0.0, 1.0) + input = new_grp.inputs.new("NodeSocketFloatFactor", "LURDA") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketColor", "INCAC") + input.default_value = (0.0, 0.0, 0.0, 1.0) + input = new_grp.inputs.new("NodeSocketFloatFactor", "INCAA") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketInt", "Add INCA") + input.default_value = 0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "BNIF") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "BLOI") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "BLOIB") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "OPAC") + input.default_value = 1.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "XRAYC") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "XRAYA") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + input = new_grp.inputs.new("NodeSocketFloatFactor", "XRBR") + input.default_value = 0.0 + input.min_value = 0.000000 + input.max_value = 1.000000 + nodes = {} + node = new_grp.nodes.new("ShaderNodeMixShader") + node.name = "Mix Shader" + nodes["Mix Shader"] = node + node.label = "" + node.location = (-118.33348846435547, -291.9857482910156) + node.inputs[0].default_value = 0.0 + node = new_grp.nodes.new("ShaderNodeOutputMaterial") + node.name = "Material Output" + nodes["Material Output"] = node + node.label = "" + node.location = (81.25957489013672, -265.6065368652344) + node.inputs[2].default_value = (0.0, 0.0, 0.0) + node = new_grp.nodes.new("ShaderNodeGroup") + node.name = "Group.001" + nodes["Group.001"] = node + node.label = "" + node.location = (-358.6896057128906, -60.17391586303711) + node.node_tree = bpy.data.node_groups["__RetroShaderMP3Color"] + node.inputs[0].default_value = (1.0, 1.0, 1.0, 1.0) + node.inputs[1].default_value = (1.0, 1.0, 1.0, 1.0) + node.inputs[2].default_value = (0.5, 0.5, 0.5, 1.0) + node.inputs[3].default_value = 0.5 + node.inputs[4].default_value = 0.5 + node.inputs[5].default_value = (0.0, 0.0, 0.0, 1.0) + node.inputs[6].default_value = 0.5 + node.inputs[7].default_value = (0.0, 0.0, 0.0, 1.0) + node.inputs[8].default_value = (0.0, 0.0, 0.0, 1.0) + node.inputs[9].default_value = (0.0, 0.0, 0.0, 1.0) + node.inputs[10].default_value = 0.0 + node.inputs[11].default_value = (0.0, 0.0, 0.0, 1.0) + node.inputs[12].default_value = 0 + node.inputs[13].default_value = 0.5 + node = new_grp.nodes.new("ShaderNodeGroup") + node.name = "Group" + nodes["Group"] = node + node.label = "" + node.location = (-356.9021301269531, -446.9474182128906) + node.node_tree = bpy.data.node_groups["__RetroShaderMP3Bloom"] + node.inputs[0].default_value = 1.0 + node.inputs[1].default_value = 1.0 + node.inputs[2].default_value = 0.0 + node.inputs[3].default_value = 0.0 + node.inputs[4].default_value = 0.5 + node.inputs[5].default_value = 0.5 + node.inputs[6].default_value = 0.0 + node.inputs[7].default_value = 0.0 + node.inputs[8].default_value = 0.0 + node.inputs[9].default_value = 0.0 + node.inputs[10].default_value = 0.5 + node.inputs[11].default_value = 0 + node = new_grp.nodes.new("NodeGroupInput") + node.name = "Group Input" + nodes["Group Input"] = node + node.label = "" + node.location = (-669.6587524414062, -193.9534149169922) + new_grp.links.new(nodes["Group Input"].outputs[0], nodes["Group.001"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[1], nodes["Group"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[3], nodes["Group"].inputs[1]) + new_grp.links.new(nodes["Group Input"].outputs[4], nodes["Group"].inputs[2]) + new_grp.links.new(nodes["Group Input"].outputs[5], nodes["Group"].inputs[3]) + new_grp.links.new(nodes["Group Input"].outputs[6], nodes["Group"].inputs[4]) + new_grp.links.new(nodes["Group Input"].outputs[17], nodes["Group"].inputs[6]) + new_grp.links.new(nodes["Group Input"].outputs[19], nodes["Group"].inputs[7]) + new_grp.links.new(nodes["Group Input"].outputs[20], nodes["Group"].inputs[8]) + new_grp.links.new(nodes["Group Input"].outputs[2], nodes["Group.001"].inputs[1]) + new_grp.links.new(nodes["Group Input"].outputs[7], nodes["Group.001"].inputs[2]) + new_grp.links.new(nodes["Group Input"].outputs[10], nodes["Group.001"].inputs[5]) + new_grp.links.new(nodes["Group Input"].outputs[12], nodes["Group.001"].inputs[7]) + new_grp.links.new(nodes["Group Input"].outputs[13], nodes["Group.001"].inputs[8]) + new_grp.links.new(nodes["Group Input"].outputs[14], nodes["Group.001"].inputs[9]) + new_grp.links.new(nodes["Group Input"].outputs[15], nodes["Group.001"].inputs[10]) + new_grp.links.new(nodes["Group Input"].outputs[16], nodes["Group.001"].inputs[11]) + new_grp.links.new(nodes["Group.001"].outputs[0], nodes["Mix Shader"].inputs[1]) + new_grp.links.new(nodes["Group"].outputs[0], nodes["Mix Shader"].inputs[2]) + new_grp.links.new(nodes["Mix Shader"].outputs[0], nodes["Material Output"].inputs[0]) + new_grp.links.new(nodes["Group Input"].outputs[21], nodes["Group"].inputs[9]) + new_grp.links.new(nodes["Group Input"].outputs[8], nodes["Group.001"].inputs[3]) + new_grp.links.new(nodes["Group Input"].outputs[9], nodes["Group.001"].inputs[4]) + new_grp.links.new(nodes["Group Input"].outputs[11], nodes["Group.001"].inputs[6]) + new_grp.links.new(nodes["Group Input"].outputs[22], nodes["Group.001"].inputs[13]) + new_grp.links.new(nodes["Group Input"].outputs[9], nodes["Group"].inputs[5]) + new_grp.links.new(nodes["Group Input"].outputs[22], nodes["Group"].inputs[10]) + new_grp.links.new(nodes["Group Input"].outputs[18], nodes["Group.001"].inputs[12]) + new_grp.links.new(nodes["Group Input"].outputs[18], nodes["Group"].inputs[11]) + ROOT_SHADER_GROUPS = ( make_retro_shader, make_retro_dynamic_shader, make_retro_dynamic_alpha_shader, - make_retro_dynamic_character_shader + make_retro_dynamic_character_shader, + make_retro_shader_mp3_color, + make_retro_shader_mp3_bloom, + make_retro_shader_mp3 ) # UV animation nodes: @@ -1196,414 +1846,6 @@ UV_ANIMATION_GROUPS = ( make_uva8 ) -# MP3 / DKCR Material Passes: -# https://wiki.axiodl.com/w/Materials_(Metroid_Prime_3) - -# Lightmap -def make_pass_diff(): - new_grp = bpy.data.node_groups.new('RetroPassDIFF', 'ShaderNodeTree') - new_grp.inputs.new('NodeSocketColor', 'Prev Color') - new_grp.inputs.new('NodeSocketFloat', 'Prev Alpha') - new_grp.inputs.new('NodeSocketColor', 'Tex Color') - new_grp.inputs.new('NodeSocketFloat', 'Tex Alpha') - new_grp.outputs.new('NodeSocketColor', 'Next Color') - new_grp.outputs.new('NodeSocketFloat', 'Next Alpha') - new_grp.use_fake_user = True - - # Group inputs - grp_in = new_grp.nodes.new('NodeGroupInput') - grp_in.location = (-800, 0) - - # Group outputs - grp_out = new_grp.nodes.new('NodeGroupOutput') - grp_out.location = (0, 0) - - # Multiply1 - mult1 = new_grp.nodes.new('ShaderNodeMixRGB') - mult1.blend_type = 'ADD' - mult1.inputs[0].default_value = 1.0 - mult1.location = (-600, 0) - - # Links - new_grp.links.new(grp_in.outputs[0], mult1.inputs[1]) - new_grp.links.new(grp_in.outputs[2], mult1.inputs[2]) - new_grp.links.new(mult1.outputs[0], grp_out.inputs[0]) - new_grp.links.new(grp_in.outputs[1], grp_out.inputs[1]) - - -# Rim Lighting Map -def make_pass_riml(): - new_grp = bpy.data.node_groups.new('RetroPassRIML', 'ShaderNodeTree') - new_grp.inputs.new('NodeSocketColor', 'Prev Color') - new_grp.inputs.new('NodeSocketFloat', 'Prev Alpha') - new_grp.inputs.new('NodeSocketColor', 'Tex Color') - new_grp.inputs.new('NodeSocketFloat', 'Tex Alpha') - new_grp.outputs.new('NodeSocketColor', 'Next Color') - new_grp.outputs.new('NodeSocketFloat', 'Next Alpha') - new_grp.use_fake_user = True - - # Group inputs - grp_in = new_grp.nodes.new('NodeGroupInput') - grp_in.location = (-800, 0) - - # Group outputs - grp_out = new_grp.nodes.new('NodeGroupOutput') - grp_out.location = (0, 0) - - # Links - new_grp.links.new(grp_in.outputs[0], grp_out.inputs[0]) - new_grp.links.new(grp_in.outputs[1], grp_out.inputs[1]) - -# Bloom Lightmap -def make_pass_blol(): - new_grp = bpy.data.node_groups.new('RetroPassBLOL', 'ShaderNodeTree') - new_grp.inputs.new('NodeSocketColor', 'Prev Color') - new_grp.inputs.new('NodeSocketFloat', 'Prev Alpha') - new_grp.inputs.new('NodeSocketColor', 'Tex Color') - new_grp.inputs.new('NodeSocketFloat', 'Tex Alpha') - new_grp.outputs.new('NodeSocketColor', 'Next Color') - new_grp.outputs.new('NodeSocketFloat', 'Next Alpha') - new_grp.use_fake_user = True - - # Group inputs - grp_in = new_grp.nodes.new('NodeGroupInput') - grp_in.location = (-800, 0) - - # Group outputs - grp_out = new_grp.nodes.new('NodeGroupOutput') - grp_out.location = (0, 0) - - # Links - new_grp.links.new(grp_in.outputs[0], grp_out.inputs[0]) - new_grp.links.new(grp_in.outputs[1], grp_out.inputs[1]) - -# Bloom Diffuse Map -def make_pass_blod(): - new_grp = bpy.data.node_groups.new('RetroPassBLOD', 'ShaderNodeTree') - new_grp.inputs.new('NodeSocketColor', 'Prev Color') - new_grp.inputs.new('NodeSocketFloat', 'Prev Alpha') - new_grp.inputs.new('NodeSocketColor', 'Tex Color') - new_grp.inputs.new('NodeSocketFloat', 'Tex Alpha') - new_grp.outputs.new('NodeSocketColor', 'Next Color') - new_grp.outputs.new('NodeSocketFloat', 'Next Alpha') - new_grp.use_fake_user = True - - # Group inputs - grp_in = new_grp.nodes.new('NodeGroupInput') - grp_in.location = (-800, 0) - - # Group outputs - grp_out = new_grp.nodes.new('NodeGroupOutput') - grp_out.location = (0, 0) - - # Links - new_grp.links.new(grp_in.outputs[0], grp_out.inputs[0]) - new_grp.links.new(grp_in.outputs[1], grp_out.inputs[1]) - -# Diffuse Map -def make_pass_clr(): - new_grp = bpy.data.node_groups.new('RetroPassCLR', 'ShaderNodeTree') - new_grp.inputs.new('NodeSocketColor', 'Prev Color') - new_grp.inputs.new('NodeSocketFloat', 'Prev Alpha') - new_grp.inputs.new('NodeSocketColor', 'Tex Color') - new_grp.inputs.new('NodeSocketFloat', 'Tex Alpha') - new_grp.outputs.new('NodeSocketColor', 'Next Color') - new_grp.outputs.new('NodeSocketFloat', 'Next Alpha') - new_grp.use_fake_user = True - - # Group inputs - grp_in = new_grp.nodes.new('NodeGroupInput') - grp_in.location = (-800, 0) - - # Group outputs - grp_out = new_grp.nodes.new('NodeGroupOutput') - grp_out.location = (0, 0) - - # Multiply - mult1 = new_grp.nodes.new('ShaderNodeMixRGB') - mult1.blend_type = 'MULTIPLY' - mult1.inputs[0].default_value = 1.0 - grp_in.location = (-400, 0) - - # Links - new_grp.links.new(grp_in.outputs[0], mult1.inputs[1]) - new_grp.links.new(grp_in.outputs[2], mult1.inputs[2]) - new_grp.links.new(mult1.outputs[0], grp_out.inputs[0]) - grp_out.inputs[1].default_value = 1.0 - -# Opacity Map -def make_pass_tran(): - new_grp = bpy.data.node_groups.new('RetroPassTRAN', 'ShaderNodeTree') - new_grp.inputs.new('NodeSocketColor', 'Prev Color') - new_grp.inputs.new('NodeSocketFloat', 'Prev Alpha') - new_grp.inputs.new('NodeSocketColor', 'Tex Color') - new_grp.inputs.new('NodeSocketFloat', 'Tex Alpha') - new_grp.outputs.new('NodeSocketColor', 'Next Color') - new_grp.outputs.new('NodeSocketFloat', 'Next Alpha') - new_grp.use_fake_user = True - - # Group inputs - grp_in = new_grp.nodes.new('NodeGroupInput') - grp_in.location = (-800, 0) - - # Group outputs - grp_out = new_grp.nodes.new('NodeGroupOutput') - grp_out.location = (0, 0) - - # Multiply - mul1 = new_grp.nodes.new('ShaderNodeMath') - mul1.operation = 'MULTIPLY' - mul1.inputs[0].default_value = 1.0 - mul1.location = (-400, 0) - - # Links - new_grp.links.new(grp_in.outputs[0], grp_out.inputs[0]) - new_grp.links.new(grp_in.outputs[1], mul1.inputs[0]) - new_grp.links.new(grp_in.outputs[2], mul1.inputs[1]) - new_grp.links.new(mul1.outputs[0], grp_out.inputs[1]) - -# Opacity Map Inverted -def make_pass_tran_inv(): - new_grp = bpy.data.node_groups.new('RetroPassTRANInv', 'ShaderNodeTree') - new_grp.inputs.new('NodeSocketColor', 'Prev Color') - new_grp.inputs.new('NodeSocketFloat', 'Prev Alpha') - new_grp.inputs.new('NodeSocketColor', 'Tex Color') - new_grp.inputs.new('NodeSocketFloat', 'Tex Alpha') - new_grp.outputs.new('NodeSocketColor', 'Next Color') - new_grp.outputs.new('NodeSocketFloat', 'Next Alpha') - new_grp.use_fake_user = True - - # Group inputs - grp_in = new_grp.nodes.new('NodeGroupInput') - grp_in.location = (-800, 0) - - # Group outputs - grp_out = new_grp.nodes.new('NodeGroupOutput') - grp_out.location = (0, 0) - - # Multiply - mul1 = new_grp.nodes.new('ShaderNodeMath') - mul1.operation = 'MULTIPLY' - mul1.inputs[0].default_value = 1.0 - mul1.location = (-400, 0) - - # Invert - inv1 = new_grp.nodes.new('ShaderNodeInvert') - inv1.inputs[0].default_value = 1.0 - inv1.location = (-600, 0) - - # Links - new_grp.links.new(grp_in.outputs[0], grp_out.inputs[0]) - new_grp.links.new(grp_in.outputs[1], mul1.inputs[1]) - new_grp.links.new(grp_in.outputs[2], inv1.inputs[1]) - new_grp.links.new(inv1.outputs[0], mul1.inputs[0]) - new_grp.links.new(mul1.outputs[0], grp_out.inputs[1]) - -# Incandescence Map -def make_pass_inca(): - new_grp = bpy.data.node_groups.new('RetroPassINCA', 'ShaderNodeTree') - new_grp.inputs.new('NodeSocketColor', 'Prev Color') - new_grp.inputs.new('NodeSocketFloat', 'Prev Alpha') - new_grp.inputs.new('NodeSocketColor', 'Tex Color') - new_grp.inputs.new('NodeSocketFloat', 'Tex Alpha') - new_grp.outputs.new('NodeSocketColor', 'Next Color') - new_grp.outputs.new('NodeSocketFloat', 'Next Alpha') - new_grp.use_fake_user = True - - # Group inputs - grp_in = new_grp.nodes.new('NodeGroupInput') - grp_in.location = (-800, 0) - - # Group outputs - grp_out = new_grp.nodes.new('NodeGroupOutput') - grp_out.location = (0, 0) - - # Multiply - add1 = new_grp.nodes.new('ShaderNodeMixRGB') - add1.blend_type = 'ADD' - add1.inputs[0].default_value = 1.0 - grp_in.location = (-400, 0) - - # Links - new_grp.links.new(grp_in.outputs[0], add1.inputs[1]) - new_grp.links.new(grp_in.outputs[2], add1.inputs[2]) - new_grp.links.new(add1.outputs[0], grp_out.inputs[0]) - new_grp.links.new(grp_in.outputs[1], grp_out.inputs[1]) - grp_out.inputs[1].default_value = 1.0 - -# Reflection Map -def make_pass_rfld(): - new_grp = bpy.data.node_groups.new('RetroPassRFLD', 'ShaderNodeTree') - new_grp.inputs.new('NodeSocketColor', 'Prev Color') - new_grp.inputs.new('NodeSocketFloat', 'Prev Alpha') - new_grp.inputs.new('NodeSocketColor', 'Mask Color') - new_grp.inputs.new('NodeSocketFloat', 'Mask Alpha') - new_grp.inputs.new('NodeSocketColor', 'Tex Color') - new_grp.inputs.new('NodeSocketFloat', 'Tex Alpha') - new_grp.outputs.new('NodeSocketColor', 'Next Color') - new_grp.outputs.new('NodeSocketFloat', 'Next Alpha') - new_grp.use_fake_user = True - - # Group inputs - grp_in = new_grp.nodes.new('NodeGroupInput') - grp_in.location = (-800, 0) - - # Group outputs - grp_out = new_grp.nodes.new('NodeGroupOutput') - grp_out.location = (0, 0) - - # Multiply - mult1 = new_grp.nodes.new('ShaderNodeMixRGB') - mult1.location = (-600, 0) - mult1.blend_type = 'MULTIPLY' - mult1.inputs[0].default_value = 1.0 - - # Add - add1 = new_grp.nodes.new('ShaderNodeMixRGB') - add1.location = (-400, 0) - add1.blend_type = 'ADD' - add1.inputs[0].default_value = 1.0 - - # Links - new_grp.links.new(grp_in.outputs[0], add1.inputs[1]) - new_grp.links.new(grp_in.outputs[2], mult1.inputs[1]) - new_grp.links.new(grp_in.outputs[4], mult1.inputs[2]) - new_grp.links.new(mult1.outputs[0], add1.inputs[2]) - new_grp.links.new(add1.outputs[0], grp_out.inputs[0]) - new_grp.links.new(grp_in.outputs[1], grp_out.inputs[1]) - -# Unk1 -def make_pass_lrld(): - new_grp = bpy.data.node_groups.new('RetroPassLRLD', 'ShaderNodeTree') - new_grp.inputs.new('NodeSocketColor', 'Prev Color') - new_grp.inputs.new('NodeSocketFloat', 'Prev Alpha') - new_grp.inputs.new('NodeSocketColor', 'Tex Color') - new_grp.inputs.new('NodeSocketFloat', 'Tex Alpha') - new_grp.outputs.new('NodeSocketColor', 'Next Color') - new_grp.outputs.new('NodeSocketFloat', 'Next Alpha') - new_grp.use_fake_user = True - - # Group inputs - grp_in = new_grp.nodes.new('NodeGroupInput') - grp_in.location = (-800, 0) - - # Group outputs - grp_out = new_grp.nodes.new('NodeGroupOutput') - grp_out.location = (0, 0) - - # Links - new_grp.links.new(grp_in.outputs[0], grp_out.inputs[0]) - new_grp.links.new(grp_in.outputs[1], grp_out.inputs[1]) - -# Unk2 -def make_pass_lurd(): - new_grp = bpy.data.node_groups.new('RetroPassLURD', 'ShaderNodeTree') - new_grp.inputs.new('NodeSocketColor', 'Prev Color') - new_grp.inputs.new('NodeSocketFloat', 'Prev Alpha') - new_grp.inputs.new('NodeSocketColor', 'Tex Color') - new_grp.inputs.new('NodeSocketFloat', 'Tex Alpha') - new_grp.outputs.new('NodeSocketColor', 'Next Color') - new_grp.outputs.new('NodeSocketFloat', 'Next Alpha') - new_grp.use_fake_user = True - - # Group inputs - grp_in = new_grp.nodes.new('NodeGroupInput') - grp_in.location = (-800, 0) - - # Group outputs - grp_out = new_grp.nodes.new('NodeGroupOutput') - grp_out.location = (0, 0) - - # Links - new_grp.links.new(grp_in.outputs[0], grp_out.inputs[0]) - new_grp.links.new(grp_in.outputs[1], grp_out.inputs[1]) - -# Bloom Incandescence Map -def make_pass_bloi(): - new_grp = bpy.data.node_groups.new('RetroPassBLOI', 'ShaderNodeTree') - new_grp.inputs.new('NodeSocketColor', 'Prev Color') - new_grp.inputs.new('NodeSocketFloat', 'Prev Alpha') - new_grp.inputs.new('NodeSocketColor', 'Tex Color') - new_grp.inputs.new('NodeSocketFloat', 'Tex Alpha') - new_grp.outputs.new('NodeSocketColor', 'Next Color') - new_grp.outputs.new('NodeSocketFloat', 'Next Alpha') - new_grp.use_fake_user = True - - # Group inputs - grp_in = new_grp.nodes.new('NodeGroupInput') - grp_in.location = (-800, 0) - - # Group outputs - grp_out = new_grp.nodes.new('NodeGroupOutput') - grp_out.location = (0, 0) - - # Links - new_grp.links.new(grp_in.outputs[0], grp_out.inputs[0]) - new_grp.links.new(grp_in.outputs[1], grp_out.inputs[1]) - -# X-ray Reflection Map -def make_pass_xray(): - new_grp = bpy.data.node_groups.new('RetroPassXRAY', 'ShaderNodeTree') - new_grp.inputs.new('NodeSocketColor', 'Prev Color') - new_grp.inputs.new('NodeSocketFloat', 'Prev Alpha') - new_grp.inputs.new('NodeSocketColor', 'Tex Color') - new_grp.inputs.new('NodeSocketFloat', 'Tex Alpha') - new_grp.outputs.new('NodeSocketColor', 'Next Color') - new_grp.outputs.new('NodeSocketFloat', 'Next Alpha') - new_grp.use_fake_user = True - - # Group inputs - grp_in = new_grp.nodes.new('NodeGroupInput') - grp_in.location = (-800, 0) - - # Group outputs - grp_out = new_grp.nodes.new('NodeGroupOutput') - grp_out.location = (0, 0) - - # Links - new_grp.links.new(grp_in.outputs[0], grp_out.inputs[0]) - new_grp.links.new(grp_in.outputs[1], grp_out.inputs[1]) - -# Unused -def make_pass_toon(): - new_grp = bpy.data.node_groups.new('RetroPassTOON', 'ShaderNodeTree') - new_grp.inputs.new('NodeSocketColor', 'Prev Color') - new_grp.inputs.new('NodeSocketFloat', 'Prev Alpha') - new_grp.inputs.new('NodeSocketColor', 'Tex Color') - new_grp.inputs.new('NodeSocketFloat', 'Tex Alpha') - new_grp.outputs.new('NodeSocketColor', 'Next Color') - new_grp.outputs.new('NodeSocketFloat', 'Next Alpha') - new_grp.use_fake_user = True - - # Group inputs - grp_in = new_grp.nodes.new('NodeGroupInput') - grp_in.location = (-800, 0) - - # Group outputs - grp_out = new_grp.nodes.new('NodeGroupOutput') - grp_out.location = (0, 0) - - # Links - new_grp.links.new(grp_in.outputs[0], grp_out.inputs[0]) - new_grp.links.new(grp_in.outputs[1], grp_out.inputs[1]) - -MP3_PASS_GROUPS = ( - make_pass_diff, - make_pass_riml, - make_pass_blol, - make_pass_blod, - make_pass_clr, - make_pass_tran, - make_pass_tran_inv, - make_pass_inca, - make_pass_rfld, - make_pass_lrld, - make_pass_lurd, - make_pass_bloi, - make_pass_xray, - make_pass_toon -) - def make_master_shader_library(): make_additive_output() make_blend_opaque_output() @@ -1611,6 +1853,4 @@ def make_master_shader_library(): shad() for uva in UV_ANIMATION_GROUPS: uva() - for aPass in MP3_PASS_GROUPS: - aPass() diff --git a/DataSpec/DNACommon/MayaSpline.hpp b/DataSpec/DNACommon/MayaSpline.hpp index 00b48fae3..700f78833 100644 --- a/DataSpec/DNACommon/MayaSpline.hpp +++ b/DataSpec/DNACommon/MayaSpline.hpp @@ -14,6 +14,8 @@ struct MayaSpline : public BigDNA { Value amplitude; Value unk1; Value unk2; + Vector unk1Floats; + Vector unk2Floats; }; Vector knots; diff --git a/DataSpec/DNACommon/RigInverter.cpp b/DataSpec/DNACommon/RigInverter.cpp index a22f997c4..e1c6078ef 100644 --- a/DataSpec/DNACommon/RigInverter.cpp +++ b/DataSpec/DNACommon/RigInverter.cpp @@ -141,6 +141,5 @@ zeus::CVector3f RigInverter::restorePosition(atUint32 boneId, const ze template class RigInverter; template class RigInverter; -template class RigInverter; } // namespace DataSpec::DNAANIM diff --git a/DataSpec/DNAMP2/CINF.cpp b/DataSpec/DNAMP2/CINF.cpp index f0b5f39b7..6762c4238 100644 --- a/DataSpec/DNAMP2/CINF.cpp +++ b/DataSpec/DNAMP2/CINF.cpp @@ -1,5 +1,6 @@ #include "CINF.hpp" #include "hecl/Blender/Connection.hpp" +#include "DataSpec/DNAMP3/DNAMP3.hpp" namespace DataSpec::DNAMP2 { @@ -41,7 +42,8 @@ void CINF::sendVertexGroupsToBlender(hecl::blender::PyOutStream& os) const { } } -void CINF::sendCINFToBlender(hecl::blender::PyOutStream& os, const UniqueID32& cinfId) const { +template +void CINF::sendCINFToBlender(hecl::blender::PyOutStream& os, const typename PAKBridge::PAKType::IDType& cinfId) const { DNAANIM::RigInverter inverter(*this); os.format(fmt( @@ -66,9 +68,18 @@ void CINF::sendCINFToBlender(hecl::blender::PyOutStream& os, const UniqueID32& c tailF[2], bone.m_origBone.id); } - for (const Bone& bone : bones) - if (bone.parentId != 97) - os.format(fmt("arm_bone_table[{}].parent = arm_bone_table[{}]\n"), bone.id, bone.parentId); + if constexpr (std::is_same_v) { + if (bones.size()) { + atUint32 nullId = bones[0].parentId; + for (const Bone& bone : bones) + if (bone.parentId != nullId) + os.format(fmt("arm_bone_table[{}].parent = arm_bone_table[{}]\n"), bone.id, bone.parentId); + } + } else { + for (const Bone& bone : bones) + if (bone.parentId != 97) + os.format(fmt("arm_bone_table[{}].parent = arm_bone_table[{}]\n"), bone.id, bone.parentId); + } os << "bpy.ops.object.mode_set(mode='OBJECT')\n"; @@ -76,8 +87,14 @@ void CINF::sendCINFToBlender(hecl::blender::PyOutStream& os, const UniqueID32& c os.format(fmt("arm_obj.pose.bones['{}'].rotation_mode = 'QUATERNION'\n"), *getBoneNameFromId(bone.m_origBone.id)); } +template void CINF::sendCINFToBlender(hecl::blender::PyOutStream& os, const UniqueID32& cinfId) const; +template void CINF::sendCINFToBlender(hecl::blender::PyOutStream& os, + const UniqueID64& cinfId) const; -std::string CINF::GetCINFArmatureName(const UniqueID32& cinfId) { return fmt::format(fmt("CINF_{}"), cinfId); } +template +std::string CINF::GetCINFArmatureName(const UniqueID& cinfId) { return fmt::format(fmt("CINF_{}"), cinfId); } +template std::string CINF::GetCINFArmatureName(const UniqueID32& cinfId); +template std::string CINF::GetCINFArmatureName(const UniqueID64& cinfId); int CINF::RecursiveAddArmatureBone(const Armature& armature, const BlenderBone* bone, int parent, int& curId, std::unordered_map& idMap, @@ -156,9 +173,10 @@ CINF::CINF(const Armature& armature, std::unordered_map& i boneIds.push_back(it->id); } +template bool CINF::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, - PAKRouter& pakRouter, const PAK::Entry& entry, bool force, hecl::blender::Token& btok, - std::function fileChanged) { + PAKRouter& pakRouter, const typename PAKBridge::PAKType::Entry& entry, bool force, + hecl::blender::Token& btok, std::function fileChanged) { if (!force && outPath.isFile()) return true; @@ -179,12 +197,21 @@ bool CINF::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: CINF cinf; cinf.read(rs); - cinf.sendCINFToBlender(os, entry.id); + cinf.sendCINFToBlender(os, entry.id); os.centerView(); os.close(); return conn.saveBlend(); } +template bool CINF::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, + PAKRouter& pakRouter, const typename PAKBridge::PAKType::Entry& entry, + bool force, hecl::blender::Token& btok, + std::function fileChanged); +template bool CINF::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, + PAKRouter& pakRouter, + const typename DNAMP3::PAKBridge::PAKType::Entry& entry, bool force, + hecl::blender::Token& btok, std::function fileChanged); + bool CINF::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, const hecl::blender::Armature& armature) { std::unordered_map boneIdMap; diff --git a/DataSpec/DNAMP2/CINF.hpp b/DataSpec/DNAMP2/CINF.hpp index 5f3637477..85831eb66 100644 --- a/DataSpec/DNAMP2/CINF.hpp +++ b/DataSpec/DNAMP2/CINF.hpp @@ -36,8 +36,10 @@ struct CINF : BigDNA { atUint32 getBoneIdxFromId(atUint32 id) const; const std::string* getBoneNameFromId(atUint32 id) const; void sendVertexGroupsToBlender(hecl::blender::PyOutStream& os) const; - void sendCINFToBlender(hecl::blender::PyOutStream& os, const UniqueID32& cinfId) const; - static std::string GetCINFArmatureName(const UniqueID32& cinfId); + template + void sendCINFToBlender(hecl::blender::PyOutStream& os, const typename PAKBridge::PAKType::IDType& cinfId) const; + template + static std::string GetCINFArmatureName(const UniqueID& cinfId); CINF() = default; using Armature = hecl::blender::Armature; @@ -48,9 +50,10 @@ struct CINF : BigDNA { CINF(const Armature& armature, std::unordered_map& idMap); + template static bool Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, - PAKRouter& pakRouter, const PAK::Entry& entry, bool force, hecl::blender::Token& btok, - std::function fileChanged); + PAKRouter& pakRouter, const typename PAKBridge::PAKType::Entry& entry, bool force, + hecl::blender::Token& btok, std::function fileChanged); static bool Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, const hecl::blender::Armature& armature); diff --git a/DataSpec/DNAMP2/DNAMP2.cpp b/DataSpec/DNAMP2/DNAMP2.cpp index 63cc69754..7b1bcacf4 100644 --- a/DataSpec/DNAMP2/DNAMP2.cpp +++ b/DataSpec/DNAMP2/DNAMP2.cpp @@ -25,6 +25,8 @@ namespace DataSpec::DNAMP2 { logvisor::Module Log("urde::DNAMP2"); static bool GetNoShare(std::string_view name) { + if (name == "FrontEnd.pak"sv) + return false; std::string lowerName(name); std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower); if (!lowerName.compare(0, 7, "metroid")) @@ -259,7 +261,7 @@ ResExtractor PAKBridge::LookupExtractor(const nod::Node& pakNode, con case SBIG('CMDL'): return {CMDL::Extract, {_SYS_STR(".blend")}, 1}; case SBIG('CINF'): - return {CINF::Extract, {_SYS_STR(".blend")}, 1}; + return {CINF::Extract, {_SYS_STR(".blend")}, 1}; case SBIG('ANCS'): return {ANCS::Extract, {_SYS_STR(".yaml"), _SYS_STR(".blend")}, 2}; case SBIG('MLVL'): diff --git a/DataSpec/DNAMP2/MREA.cpp b/DataSpec/DNAMP2/MREA.cpp index ee165529f..a8add1605 100644 --- a/DataSpec/DNAMP2/MREA.cpp +++ b/DataSpec/DNAMP2/MREA.cpp @@ -68,8 +68,7 @@ MREA::StreamReader::StreamReader(athena::io::IStreamReader& source, atUint32 blk , m_blkCount(blkCount) { m_blockInfos.reserve(blkCount); for (atUint32 i = 0; i < blkCount; ++i) { - m_blockInfos.emplace_back(); - BlockInfo& info = m_blockInfos.back(); + BlockInfo& info = m_blockInfos.emplace_back(); info.read(source); m_totalDecompLen += info.decompSize; } diff --git a/DataSpec/DNAMP3/CINF.cpp b/DataSpec/DNAMP3/CINF.cpp deleted file mode 100644 index d8cf6ec82..000000000 --- a/DataSpec/DNAMP3/CINF.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include "CINF.hpp" -#include "hecl/Blender/Connection.hpp" - -namespace DataSpec::DNAMP3 { - -void CINF::sendCINFToBlender(hecl::blender::PyOutStream& os, const UniqueID64& cinfId) const { - DNAANIM::RigInverter inverter(*this); - - os.format(fmt("arm = bpy.data.armatures.new('CINF_{}')\n" - "arm_obj = bpy.data.objects.new(arm.name, arm)\n" - "bpy.context.scene.collection.objects.link(arm_obj)\n" - "bpy.context.view_layer.objects.active = arm_obj\n" - "bpy.ops.object.mode_set(mode='EDIT')\n" - "arm_bone_table = {{}}\n"), - cinfId); - - for (const DNAANIM::RigInverter::Bone& bone : inverter.getBones()) { - zeus::simd_floats originF(bone.m_origBone.origin.simd); - zeus::simd_floats tailF(bone.m_tail.mSimd); - os.format(fmt( - "bone = arm.edit_bones.new('{}')\n" - "bone.head = ({},{},{})\n" - "bone.tail = ({},{},{})\n" - "bone.use_inherit_scale = False\n" - "arm_bone_table[{}] = bone\n"), - *getBoneNameFromId(bone.m_origBone.id), originF[0], originF[1], originF[2], tailF[0], tailF[1], - tailF[2], bone.m_origBone.id); - } - - if (bones.size()) { - atUint32 nullId = bones[0].parentId; - for (const Bone& bone : bones) - if (bone.parentId != nullId) - os.format(fmt("arm_bone_table[{}].parent = arm_bone_table[{}]\n"), bone.id, bone.parentId); - } - - os << "bpy.ops.object.mode_set(mode='OBJECT')\n"; - - for (const DNAANIM::RigInverter::Bone& bone : inverter.getBones()) - os.format(fmt("arm_obj.pose.bones['{}'].rotation_mode = 'QUATERNION'\n"), - *getBoneNameFromId(bone.m_origBone.id)); -} - -std::string CINF::GetCINFArmatureName(const UniqueID64& cinfId) { - return fmt::format(fmt("CINF_{}"), cinfId); -} - -} // namespace DataSpec::DNAMP3 diff --git a/DataSpec/DNAMP3/CINF.hpp b/DataSpec/DNAMP3/CINF.hpp index 353f21bb8..d40286143 100644 --- a/DataSpec/DNAMP3/CINF.hpp +++ b/DataSpec/DNAMP3/CINF.hpp @@ -1,14 +1,8 @@ #pragma once #include "DataSpec/DNACommon/DNACommon.hpp" -#include "../DNAMP2/CINF.hpp" +#include "DataSpec/DNAMP2/CINF.hpp" namespace DataSpec::DNAMP3 { - -struct CINF : DNAMP2::CINF { - Delete expl; - void sendCINFToBlender(hecl::blender::PyOutStream& os, const UniqueID64& cinfId) const; - static std::string GetCINFArmatureName(const UniqueID64& cinfId); -}; - +using CINF = DNAMP2::CINF; } // namespace DataSpec::DNAMP3 diff --git a/DataSpec/DNAMP3/CMDLMaterials.cpp b/DataSpec/DNAMP3/CMDLMaterials.cpp index 75f82dae7..e2ff1c8ae 100644 --- a/DataSpec/DNAMP3/CMDLMaterials.cpp +++ b/DataSpec/DNAMP3/CMDLMaterials.cpp @@ -6,341 +6,291 @@ using Stream = hecl::blender::PyOutStream; namespace DataSpec::DNAMP3 { using Material = MaterialSet::Material; -template <> -void MaterialSet::Material::SectionFactory::Enumerate(typename Read::StreamT& reader) { - DNAFourCC type; - type.read(reader); - switch (ISection::Type(type.toUint32())) { - case ISection::Type::PASS: - section = std::make_unique(); - section->read(reader); - break; - case ISection::Type::CLR: - section = std::make_unique(); - section->read(reader); - break; - case ISection::Type::INT: - section = std::make_unique(); - section->read(reader); - break; - default: - section.reset(); - break; - } -} -template <> -void MaterialSet::Material::SectionFactory::Enumerate(typename Write::StreamT& writer) { - if (!section) - return; - writer.writeUBytes((atUint8*)§ion->m_type, 4); - section->write(writer); -} -template <> -void MaterialSet::Material::SectionFactory::Enumerate(typename BinarySize::StreamT& s) { - s += 4; - section->binarySize(s); -} - template <> void MaterialSet::Material::Enumerate(typename Read::StreamT& reader) { header.read(reader); - sections.clear(); - do { - sections.emplace_back(); - sections.back().read(reader); - } while (sections.back().section); - sections.pop_back(); + chunks.clear(); + do { chunks.emplace_back().read(reader); } while (!chunks.back().holds_alternative()); + chunks.pop_back(); } template <> void MaterialSet::Material::Enumerate(typename Write::StreamT& writer) { header.write(writer); - for (const SectionFactory& section : sections) - section.write(writer); - writer.writeUBytes((atUint8*)"END ", 4); + for (const auto& chunk : chunks) + chunk.visit([&](auto& arg) { arg.write(writer); }); + DNAFourCC(FOURCC('END ')).write(writer); } template <> void MaterialSet::Material::Enumerate(typename BinarySize::StreamT& s) { header.binarySize(s); - for (const SectionFactory& section : sections) - section.binarySize(s); + for (const auto& chunk : chunks) + chunk.visit([&](auto& arg) { arg.binarySize(s); }); s += 4; } void MaterialSet::RegisterMaterialProps(Stream& out) { - out << "bpy.types.Material.retro_alpha_test = bpy.props.BoolProperty(name='Retro: Punchthrough Alpha')\n" + out << "bpy.types.Material.retro_enable_bloom = bpy.props.BoolProperty(name='Retro: Enable Bloom')\n" + "bpy.types.Material.retro_force_lighting_stage = bpy.props.BoolProperty(name='Retro: Force Lighting Stage')\n" + "bpy.types.Material.retro_pre_inca_transparency = bpy.props.BoolProperty(name='Retro: Pre-INCA Transparency')\n" + "bpy.types.Material.retro_alpha_test = bpy.props.BoolProperty(name='Retro: Alpha Test')\n" "bpy.types.Material.retro_shadow_occluder = bpy.props.BoolProperty(name='Retro: Shadow Occluder')\n" - "bpy.types.Material.retro_lightmapped = bpy.props.BoolProperty(name='Retro: Lightmapped')\n" - "bpy.types.Material.retro_opac = bpy.props.IntProperty(name='Retro: OPAC')\n" - "bpy.types.Material.retro_blod = bpy.props.IntProperty(name='Retro: BLOD')\n" - "bpy.types.Material.retro_bloi = bpy.props.IntProperty(name='Retro: BLOI')\n" - "bpy.types.Material.retro_bnif = bpy.props.IntProperty(name='Retro: BNIF')\n" - "bpy.types.Material.retro_xrbr = bpy.props.IntProperty(name='Retro: XRBR')\n" + "bpy.types.Material.retro_solid_white = bpy.props.BoolProperty(name='Retro: Solid White Only')\n" + "bpy.types.Material.retro_reflection_alpha_target = bpy.props.BoolProperty(name='Retro: Reflection Alpha Target')\n" + "bpy.types.Material.retro_solid_color = bpy.props.BoolProperty(name='Retro: Solid Color Only')\n" + "bpy.types.Material.retro_exclude_scan = bpy.props.BoolProperty(name='Retro: Exclude From Scan Visor')\n" + "bpy.types.Material.retro_xray_opaque = bpy.props.BoolProperty(name='Retro: XRay Opaque')\n" + "bpy.types.Material.retro_xray_alpha_target = bpy.props.BoolProperty(name='Retro: XRay Alpha Target')\n" + "bpy.types.Material.retro_inca_color_mod = bpy.props.BoolProperty(name='Retro: INCA Color Mod')\n" "\n"; } +static void LoadTexture(Stream& out, const UniqueID64& tex, + const PAKRouter& pakRouter, const PAK::Entry& entry) { + std::string texName = pakRouter.getBestEntryName(tex); + const nod::Node* node; + const typename PAKRouter::EntryType* texEntry = pakRouter.lookupEntry(tex, &node); + hecl::ProjectPath txtrPath = pakRouter.getWorking(texEntry); + if (!txtrPath.isNone()) { + txtrPath.makeDirChain(false); + PAKEntryReadStream rs = texEntry->beginReadStream(*node); + TXTR::Extract(rs, txtrPath); + } + hecl::SystemString resPath = pakRouter.getResourceRelativePath(entry, tex); + hecl::SystemUTF8Conv resPathView(resPath); + out.format(fmt("if '{}' in bpy.data.images:\n" + " image = bpy.data.images['{}']\n" + "else:\n" + " image = bpy.data.images.load('''//{}''')\n" + " image.name = '{}'\n" + "\n"), texName, texName, resPathView, texName); +} + void MaterialSet::ConstructMaterial(Stream& out, const PAKRouter& pakRouter, const PAK::Entry& entry, const Material& material, unsigned groupIdx, unsigned matIdx) { - unsigned i; - - out.format(fmt( - "new_material = bpy.data.materials.new('MAT_{}_{}')\n" - "new_material.use_shadows = True\n" - "new_material.use_transparent_shadows = True\n" - "new_material.diffuse_color = (1.0,1.0,1.0)\n" - "new_material.use_nodes = True\n" - "new_material.blend_method = 'BLEND'\n" - "new_nodetree = new_material.node_tree\n" - "material_node = new_nodetree.nodes['Material']\n" - "final_node = new_nodetree.nodes['Output']\n" - "\n" - "gridder = hecl.Nodegrid(new_nodetree)\n" - "gridder.place_node(final_node, 3)\n" - "gridder.place_node(material_node, 0)\n" - "material_node.material = new_material\n" - "\n" - "texture_nodes = []\n" - "kcolor_nodes = []\n" - "color_combiner_nodes = []\n" - "alpha_combiner_nodes = []\n" - "tex_links = []\n" - "tev_reg_sockets = [None]*4\n" - "\n"), - groupIdx, matIdx); + out.format(fmt("new_material = bpy.data.materials.new('MAT_{}_{}')\n"), groupIdx, matIdx); + out << "new_material.use_fake_user = True\n" + "new_material.use_nodes = True\n" + "new_material.use_backface_culling = True\n" + "new_material.show_transparent_back = False\n" + "new_material.blend_method = 'BLEND'\n" + "new_nodetree = new_material.node_tree\n" + "for n in new_nodetree.nodes:\n" + " new_nodetree.nodes.remove(n)\n" + "\n" + "gridder = hecl.Nodegrid(new_nodetree)\n" + "new_nodetree.nodes.remove(gridder.frames[2])\n" + "\n" + "texture_nodes = []\n" + "kcolors = {}\n" + "kalphas = {}\n" + "tex_links = []\n" + "\n"; /* Material Flags */ out.format(fmt( + "new_material.retro_enable_bloom = {}\n" + "new_material.retro_force_lighting_stage = {}\n" + "new_material.retro_pre_inca_transparency = {}\n" "new_material.retro_alpha_test = {}\n" "new_material.retro_shadow_occluder = {}\n" - "new_material.diffuse_color = (1, 1, 1, {})\n"), + "new_material.retro_solid_white = {}\n" + "new_material.retro_reflection_alpha_target = {}\n" + "new_material.retro_solid_color = {}\n" + "new_material.retro_exclude_scan = {}\n" + "new_material.retro_xray_opaque = {}\n" + "new_material.retro_xray_alpha_target = {}\n" + "new_material.retro_inca_color_mod = False\n"), + material.header.flags.enableBloom() ? "True" : "False", + material.header.flags.forceLightingStage() ? "True" : "False", + material.header.flags.preIncaTransparency() ? "True" : "False", material.header.flags.alphaTest() ? "True" : "False", material.header.flags.shadowOccluderMesh() ? "True" : "False", - material.header.flags.shadowOccluderMesh() ? "0" : "1"); + material.header.flags.justWhite() ? "True" : "False", + material.header.flags.reflectionAlphaTarget() ? "True" : "False", + material.header.flags.justSolidColor() ? "True" : "False", + material.header.flags.excludeFromScanVisor() ? "True" : "False", + material.header.flags.xrayOpaque() ? "True" : "False", + material.header.flags.xrayAlphaTarget() ? "True" : "False"); - /* Blend factors */ - out << "blend_node = new_nodetree.nodes.new('ShaderNodeGroup')\n" - "blend_node.name = 'Blend'\n" - "gridder.place_node(blend_node, 2)\n"; - if (material.header.flags.alphaBlending()) - out << "blend_node.node_tree = bpy.data.node_groups['HECLBlendOutput']\n"; - else if (material.header.flags.additiveBlending()) - out << "blend_node.node_tree = bpy.data.node_groups['HECLAdditiveOutput']\n"; - else { - out << "blend_node.node_tree = bpy.data.node_groups['HECLOpaqueOutput']\n" - "new_material.blend_method = 'OPAQUE'\n"; - } + out << "pnode = new_nodetree.nodes.new('ShaderNodeGroup')\n" + "pnode.name = 'Output'\n" + "pnode.node_tree = bpy.data.node_groups['RetroShaderMP3']\n" + "gridder.place_node(pnode, 1)\n"; - /* Texmap list */ - out << "tex_maps = []\n" - "pnode = None\n" - "anode = None\n" - "rflv_tex_node = None\n"; + if (material.header.flags.additiveIncandecence()) + out << "pnode.inputs['Add INCA'].default_value = 1\n"; - /* Add PASSes */ - i = 0; - unsigned texMapIdx = 0; - unsigned texMtxIdx = 0; - unsigned kColorIdx = 0; - Material::ISection* prevSection = nullptr; - for (const Material::SectionFactory& factory : material.sections) { - factory.section->constructNode(out, pakRouter, entry, prevSection, i++, texMapIdx, texMtxIdx, kColorIdx); - Material::SectionPASS* pass = Material::SectionPASS::castTo(factory.section.get()); - if (!pass || - (pass && Material::SectionPASS::Subtype(pass->subtype.toUint32()) != Material::SectionPASS::Subtype::RFLV)) - prevSection = factory.section.get(); - } + int texMtxIdx = 0; + for (const auto& chunk : material.chunks) { + if (const Material::PASS* pass = chunk.get_if()) { + LoadTexture(out, pass->txtrId, pakRouter, entry); + out << "# Texture\n" + "tex_node = new_nodetree.nodes.new('ShaderNodeTexImage')\n" + "texture_nodes.append(tex_node)\n" + "tex_node.image = image\n"; - /* Connect final PASS */ - out << "if pnode:\n" - " new_nodetree.links.new(pnode.outputs['Next Color'], final_node.inputs['Color'])\n" - "else:\n" - " new_nodetree.links.new(kcolor_nodes[-1][0].outputs[0], final_node.inputs['Color'])\n" - "if anode:\n" - " new_nodetree.links.new(anode.outputs['Value'], final_node.inputs['Alpha'])\n" - "elif pnode:\n" - " new_nodetree.links.new(pnode.outputs['Next Alpha'], final_node.inputs['Alpha'])\n" - "else:\n" - " new_nodetree.links.new(kcolor_nodes[-1][1].outputs[0], final_node.inputs['Alpha'])\n"; -} + if (!pass->uvAnim.empty()) { + const auto& uva = pass->uvAnim[0]; + switch (uva.uvSource) { + case Material::UVAnimationUVSource::Position: + default: + out << "tex_uv_node = new_nodetree.nodes.new('ShaderNodeTexCoord')\n" + "tex_links.append(new_nodetree.links.new(tex_uv_node.outputs['Window'], tex_node.inputs['Vector']))\n"; + break; + case Material::UVAnimationUVSource::Normal: + out << "tex_uv_node = new_nodetree.nodes.new('ShaderNodeTexCoord')\n" + "tex_links.append(new_nodetree.links.new(tex_uv_node.outputs['Normal'], tex_node.inputs['Vector']))\n"; + break; + case Material::UVAnimationUVSource::UV: + out.format(fmt("tex_uv_node = new_nodetree.nodes.new('ShaderNodeUVMap')\n" + "tex_links.append(new_nodetree.links.new(tex_uv_node.outputs['UV'], tex_node.inputs['Vector']))\n" + "tex_uv_node.uv_map = 'UV_{}'\n"), pass->uvSrc); + break; + } + out.format(fmt("tex_uv_node.label = 'MTX_{}'\n"), texMtxIdx); + } else { + out.format(fmt("tex_uv_node = new_nodetree.nodes.new('ShaderNodeUVMap')\n" + "tex_links.append(new_nodetree.links.new(tex_uv_node.outputs['UV'], tex_node.inputs['Vector']))\n" + "tex_uv_node.uv_map = 'UV_{}'\n"), pass->uvSrc); + } -void Material::SectionPASS::constructNode(hecl::blender::PyOutStream& out, const PAKRouter& pakRouter, - const PAK::Entry& entry, const Material::ISection* prevSection, unsigned idx, - unsigned& texMapIdx, unsigned& texMtxIdx, unsigned& kColorIdx) const { - /* Add Texture nodes */ - if (txtrId.isValid()) { - std::string texName = pakRouter.getBestEntryName(txtrId); - const nod::Node* node; - const PAK::Entry* texEntry = pakRouter.lookupEntry(txtrId, &node); - hecl::ProjectPath txtrPath = pakRouter.getWorking(texEntry); - if (txtrPath.isNone()) { - txtrPath.makeDirChain(false); - PAKEntryReadStream rs = texEntry->beginReadStream(*node); - TXTR::Extract(rs, txtrPath); + out << "gridder.place_node(tex_uv_node, 0)\n" + "gridder.place_node(tex_node, 0)\n" + "tex_uv_node.location[0] -= 120\n" + "tex_node.location[0] += 120\n" + "tex_node.location[1] += 176\n" + "\n"; + + if (!pass->uvAnim.empty()) { + const auto& uva = pass->uvAnim[0]; + DNAMP1::MaterialSet::Material::AddTextureAnim(out, uva.anim.mode, texMtxIdx++, uva.anim.vals); + } + + auto DoSwap = [&]() { + if (pass->flags.swapColorComponent() == Material::SwapColorComponent::Alpha) { + out << "swap_output = tex_node.outputs['Alpha']\n"; + } else { + out << "separate_node = new_nodetree.nodes.new('ShaderNodeSeparateRGB')\n" + "gridder.place_node(separate_node, 0, False)\n" + "separate_node.location[0] += 350\n" + "separate_node.location[1] += 350\n" + "new_nodetree.links.new(tex_node.outputs['Color'], separate_node.inputs[0])\n"; + out.format(fmt("swap_output = separate_node.outputs[{}]\n"), int(pass->flags.swapColorComponent())); + } + }; + + using Subtype = Material::PASS::Subtype; + switch (Subtype(pass->subtype.toUint32())) { + case Subtype::DIFF: + out << "new_nodetree.links.new(tex_node.outputs['Color'], pnode.inputs['DIFFC'])\n" + "new_nodetree.links.new(tex_node.outputs['Alpha'], pnode.inputs['DIFFA'])\n"; + break; + case Subtype::BLOL: + DoSwap(); + out << "new_nodetree.links.new(swap_output, pnode.inputs['BLOL'])\n"; + break; + case Subtype::BLOD: + DoSwap(); + out << "new_nodetree.links.new(swap_output, pnode.inputs['BLOD'])\n"; + break; + case Subtype::CLR: + out << "new_nodetree.links.new(tex_node.outputs['Color'], pnode.inputs['CLR'])\n" + "new_nodetree.links.new(tex_node.outputs['Alpha'], pnode.inputs['CLRA'])\n"; + break; + case Subtype::TRAN: + DoSwap(); + if (pass->flags.TRANInvert()) + out << "invert_node = new_nodetree.nodes.new('ShaderNodeInvert')\n" + "gridder.place_node(invert_node, 0, False)\n" + "invert_node.location[0] += 400\n" + "invert_node.location[1] += 350\n" + "new_nodetree.links.new(swap_output, invert_node.inputs['Color'])\n" + "swap_output = invert_node.outputs['Color']\n"; + out << "new_nodetree.links.new(swap_output, pnode.inputs['TRAN'])\n"; + break; + case Subtype::INCA: + out << "new_nodetree.links.new(tex_node.outputs['Color'], pnode.inputs['INCAC'])\n"; + if (pass->flags.alphaContribution()) { + DoSwap(); + out << "new_nodetree.links.new(swap_output, pnode.inputs['INCAA'])\n"; + } + out.format(fmt("new_material.retro_inca_color_mod = {}\n"), pass->flags.INCAColorMod() ? "True" : "False"); + break; + case Subtype::RFLV: + out << "new_nodetree.links.new(tex_node.outputs['Color'], pnode.inputs['RFLV'])\n"; + break; + case Subtype::RFLD: + out << "new_nodetree.links.new(tex_node.outputs['Color'], pnode.inputs['RFLD'])\n" + "new_nodetree.links.new(tex_node.outputs['Alpha'], pnode.inputs['RFLDA'])\n"; + break; + case Subtype::LRLD: + out << "new_nodetree.links.new(tex_node.outputs['Color'], pnode.inputs['LRLD'])\n"; + break; + case Subtype::LURD: + out << "new_nodetree.links.new(tex_node.outputs['Color'], pnode.inputs['LURDC'])\n" + "new_nodetree.links.new(tex_node.outputs['Alpha'], pnode.inputs['LURDA'])\n"; + break; + case Subtype::BLOI: + DoSwap(); + out << "new_nodetree.links.new(swap_output, pnode.inputs['BLOI'])\n"; + break; + case Subtype::XRAY: + DoSwap(); + out << "new_nodetree.links.new(tex_node.outputs['Color'], pnode.inputs['XRAYC'])\n" + "new_nodetree.links.new(swap_output, pnode.inputs['XRAYA'])\n"; + break; + default: + Log.report(logvisor::Fatal, fmt("Unknown PASS subtype")); + break; + } + } else if (const Material::CLR* clr = chunk.get_if()) { + using Subtype = Material::CLR::Subtype; + athena::simd_floats vec4; + clr->color.toVec4f().simd.copy_to(vec4); + switch (Subtype(clr->subtype.toUint32())) { + case Subtype::CLR: + out.format(fmt("pnode.inputs['CLR'].default_value = ({}, {}, {}, 1.0)\n" + "pnode.inputs['CLRA'].default_value = {}\n"), + vec4[0], vec4[1], vec4[2], vec4[3]); + break; + case Subtype::DIFB: + out.format(fmt("pnode.inputs['DIFBC'].default_value = ({}, {}, {}, 1.0)\n" + "pnode.inputs['DIFBA'].default_value = {}\n"), + vec4[0], vec4[1], vec4[2], vec4[3]); + break; + default: + Log.report(logvisor::Fatal, fmt("Unknown CLR subtype")); + break; + } + } else if (const Material::INT* val = chunk.get_if()) { + using Subtype = Material::INT::Subtype; + switch (Subtype(val->subtype.toUint32())) { + case Subtype::OPAC: + out.format(fmt("pnode.inputs['OPAC'].default_value = {}\n"), val->value / 255.f); + break; + case Subtype::BLOD: + out.format(fmt("pnode.inputs['BLOD'].default_value = {}\n"), val->value / 255.f); + break; + case Subtype::BLOI: + out.format(fmt("pnode.inputs['BLOI'].default_value = {}\n"), val->value / 255.f); + break; + case Subtype::BNIF: + out.format(fmt("pnode.inputs['BNIF'].default_value = {}\n"), val->value / 255.f); + break; + case Subtype::XRBR: + out.format(fmt("pnode.inputs['XRBR'].default_value = {}\n"), val->value / 255.f); + break; + default: + Log.report(logvisor::Fatal, fmt("Unknown INT subtype")); + break; + } } - hecl::SystemString resPath = pakRouter.getResourceRelativePath(entry, txtrId); - hecl::SystemUTF8Conv resPathView(resPath); - out.format(fmt( - "if '{}' in bpy.data.textures:\n" - " image = bpy.data.images['{}']\n" - " texture = bpy.data.textures[image.name]\n" - "else:\n" - " image = bpy.data.images.load('''//{}''')\n" - " image.name = '{}'\n" - " texture = bpy.data.textures.new(image.name, 'IMAGE')\n" - " texture.image = image\n" - "tex_maps.append(texture)\n" - "\n"), - texName, texName, resPathView, texName); - if (uvAnim.size()) { - const UVAnimation& uva = uvAnim[0]; - DNAMP1::MaterialSet::Material::AddTexture(out, GX::TexGenSrc(uva.unk1 + (uva.unk1 < 2 ? 0 : 2)), texMtxIdx, - texMapIdx++, false); - DNAMP1::MaterialSet::Material::AddTextureAnim(out, uva.anim.mode, texMtxIdx++, uva.anim.vals); - } else - DNAMP1::MaterialSet::Material::AddTexture(out, GX::TexGenSrc(uvSrc + 4), -1, texMapIdx++, false); - } - - /* Special case for RFLV (environment UV mask) */ - if (Subtype(subtype.toUint32()) == Subtype::RFLV) { - if (txtrId.isValid()) - out << "rflv_tex_node = texture_nodes[-1]\n"; - return; - } - - /* Add PASS node */ - bool linkRAS = false; - out << "prev_pnode = pnode\n" - "pnode = new_nodetree.nodes.new('ShaderNodeGroup')\n"; - switch (Subtype(subtype.toUint32())) { - case Subtype::DIFF: { - out << "pnode.node_tree = bpy.data.node_groups['RetroPassDIFF']\n"; - if (txtrId.isValid()) { - out << "new_material.hecl_lightmap = texture.name\n" - << "texture.image.use_fake_user = True\n"; - } - linkRAS = true; - break; - } - case Subtype::RIML: - out << "pnode.node_tree = bpy.data.node_groups['RetroPassRIML']\n"; - if (idx == 0) - linkRAS = true; - break; - case Subtype::BLOL: - out << "pnode.node_tree = bpy.data.node_groups['RetroPassBLOL']\n"; - if (idx == 0) - linkRAS = true; - break; - case Subtype::BLOD: - out << "pnode.node_tree = bpy.data.node_groups['RetroPassBLOD']\n"; - if (idx == 0) - linkRAS = true; - break; - case Subtype::CLR: - out << "pnode.node_tree = bpy.data.node_groups['RetroPassCLR']\n"; - if (idx == 0) - linkRAS = true; - break; - case Subtype::TRAN: - if (flags.TRANInvert()) - out << "pnode.node_tree = bpy.data.node_groups['RetroPassTRANInv']\n"; - else - out << "pnode.node_tree = bpy.data.node_groups['RetroPassTRAN']\n"; - break; - case Subtype::INCA: - out << "pnode.node_tree = bpy.data.node_groups['RetroPassINCA']\n"; - break; - case Subtype::RFLV: - out << "pnode.node_tree = bpy.data.node_groups['RetroPassRFLV']\n"; - break; - case Subtype::RFLD: - out << "pnode.node_tree = bpy.data.node_groups['RetroPassRFLD']\n" - "if rflv_tex_node:\n" - " new_nodetree.links.new(rflv_tex_node.outputs['Color'], pnode.inputs['Mask Color'])\n" - " new_nodetree.links.new(rflv_tex_node.outputs['Value'], pnode.inputs['Mask Alpha'])\n"; - break; - case Subtype::LRLD: - out << "pnode.node_tree = bpy.data.node_groups['RetroPassLRLD']\n"; - break; - case Subtype::LURD: - out << "pnode.node_tree = bpy.data.node_groups['RetroPassLURD']\n"; - break; - case Subtype::BLOI: - out << "pnode.node_tree = bpy.data.node_groups['RetroPassBLOI']\n"; - break; - case Subtype::XRAY: - out << "pnode.node_tree = bpy.data.node_groups['RetroPassXRAY']\n"; - break; - case Subtype::TOON: - out << "pnode.node_tree = bpy.data.node_groups['RetroPassTOON']\n"; - break; - default: - break; - } - out << "gridder.place_node(pnode, 2)\n"; - - if (txtrId.isValid()) { - out << "new_nodetree.links.new(texture_nodes[-1].outputs['Color'], pnode.inputs['Tex Color'])\n" - "new_nodetree.links.new(texture_nodes[-1].outputs['Value'], pnode.inputs['Tex Alpha'])\n"; - } - - if (linkRAS) - out << "new_nodetree.links.new(material_node.outputs['Color'], pnode.inputs['Prev Color'])\n" - "new_nodetree.links.new(material_node.outputs['Alpha'], pnode.inputs['Prev Alpha'])\n"; - else if (prevSection) { - if (prevSection->m_type == ISection::Type::PASS && - Subtype(static_cast(prevSection)->subtype.toUint32()) != Subtype::RFLV) - out << "new_nodetree.links.new(prev_pnode.outputs['Next Color'], pnode.inputs['Prev Color'])\n" - "new_nodetree.links.new(prev_pnode.outputs['Next Alpha'], pnode.inputs['Prev Alpha'])\n"; - else if (prevSection->m_type == ISection::Type::CLR) - out << "new_nodetree.links.new(kcolor_nodes[-1][0].outputs[0], pnode.inputs['Prev Color'])\n" - "new_nodetree.links.new(kcolor_nodes[-1][1].outputs[0], pnode.inputs['Prev Alpha'])\n"; - } - - /* Row Break in gridder */ - out << "gridder.row_break(2)\n"; -} - -void Material::SectionCLR::constructNode(hecl::blender::PyOutStream& out, const PAKRouter& pakRouter, - const PAK::Entry& entry, const Material::ISection* prevSection, unsigned idx, - unsigned& texMapIdx, unsigned& texMtxIdx, unsigned& kColorIdx) const { - DNAMP1::MaterialSet::Material::AddKcolor(out, color, kColorIdx++); - switch (Subtype(subtype.toUint32())) { - case Subtype::DIFB: - out << "kc_node.label += ' DIFB'\n" - "ka_node.label += ' DIFB'\n"; - break; - default: - break; - } -} - -void Material::SectionINT::constructNode(hecl::blender::PyOutStream& out, const PAKRouter& pakRouter, - const PAK::Entry& entry, const Material::ISection* prevSection, unsigned idx, - unsigned& texMapIdx, unsigned& texMtxIdx, unsigned& kColorIdx) const { - switch (Subtype(subtype.toUint32())) { - case Subtype::OPAC: { - GX::Color clr(value); - out.format(fmt( - "anode = new_nodetree.nodes.new('ShaderNodeValue')\n" - "anode.outputs['Value'].default_value = {}\n"), - float(clr[3]) / float(0xff)); - out << "gridder.place_node(anode, 1)\n"; - } break; - case Subtype::BLOD: - out.format(fmt("new_material.retro_blod = {}\n"), value); - break; - case Subtype::BLOI: - out.format(fmt("new_material.retro_bloi = {}\n"), value); - break; - case Subtype::BNIF: - out.format(fmt("new_material.retro_bnif = {}\n"), value); - break; - case Subtype::XRBR: - out.format(fmt("new_material.retro_xrbr = {}\n"), value); - break; - default: - break; } } } // namespace DataSpec::DNAMP3 + +AT_SPECIALIZE_TYPED_VARIANT_BIGDNA(DataSpec::DNAMP3::MaterialSet::Material::PASS, + DataSpec::DNAMP3::MaterialSet::Material::CLR, + DataSpec::DNAMP3::MaterialSet::Material::INT, + DataSpec::DNAMP3::MaterialSet::Material::END) diff --git a/DataSpec/DNAMP3/CMDLMaterials.hpp b/DataSpec/DNAMP3/CMDLMaterials.hpp index df73b62e0..89d562a72 100644 --- a/DataSpec/DNAMP3/CMDLMaterials.hpp +++ b/DataSpec/DNAMP3/CMDLMaterials.hpp @@ -18,6 +18,10 @@ struct MaterialSet : BigDNA { void addMaterialEndOff(atUint32) { ++materialCount; } struct Material : BigDNA { + enum class SwapColorComponent { Red, Green, Blue, Alpha }; + enum class UVAnimationUVSource : atUint16 { Position, Normal, UV }; + enum class UVAnimationMatrixConfig : atUint16 { NoMtxNoPost, MtxNoPost, NoMtxPost, MtxPost }; + AT_DECL_EXPLICIT_DNA using VAFlags = DNAMP1::MaterialSet::Material::VAFlags; struct Header : BigDNA { @@ -26,8 +30,18 @@ struct MaterialSet : BigDNA { struct Flags : BigDNA { AT_DECL_DNA Value flags; - bool alphaBlending() const { return (flags & 0x8) != 0; } - void setAlphaBlending(bool enabled) { + bool enableBloom() const { return (flags & 0x1) != 0; } + void setEnableBloom(bool enabled) { + flags &= ~0x1; + flags |= atUint32(enabled) << 0; + } + bool forceLightingStage() const { return (flags & 0x4) != 0; } + void setForceLightingStage(bool enabled) { + flags &= ~0x4; + flags |= atUint32(enabled) << 2; + } + bool preIncaTransparency() const { return (flags & 0x8) != 0; } + void setPreIncaTransparency(bool enabled) { flags &= ~0x8; flags |= atUint32(enabled) << 3; } @@ -36,8 +50,8 @@ struct MaterialSet : BigDNA { flags &= ~0x10; flags |= atUint32(enabled) << 4; } - bool additiveBlending() const { return (flags & 0x20) != 0; } - void setAdditiveBlending(bool enabled) { + bool additiveIncandecence() const { return (flags & 0x20) != 0; } + void setAdditiveIncandecence(bool enabled) { flags &= ~0x20; flags |= atUint32(enabled) << 5; } @@ -46,6 +60,36 @@ struct MaterialSet : BigDNA { flags &= ~0x100; flags |= atUint32(enabled) << 8; } + bool justWhite() const { return (flags & 0x200) != 0; } + void setJustWhite(bool enabled) { + flags &= ~0x200; + flags |= atUint32(enabled) << 9; + } + bool reflectionAlphaTarget() const { return (flags & 0x400) != 0; } + void setReflectionAlphaTarget(bool enabled) { + flags &= ~0x400; + flags |= atUint32(enabled) << 10; + } + bool justSolidColor() const { return (flags & 0x800) != 0; } + void setJustSolidColor(bool enabled) { + flags &= ~0x800; + flags |= atUint32(enabled) << 11; + } + bool excludeFromScanVisor() const { return (flags & 0x4000) != 0; } + void setExcludeFromScanVisor(bool enabled) { + flags &= ~0x4000; + flags |= atUint32(enabled) << 14; + } + bool xrayOpaque() const { return (flags & 0x8000) != 0; } + void setXRayOpaque(bool enabled) { + flags &= ~0x8000; + flags |= atUint32(enabled) << 15; + } + bool xrayAlphaTarget() const { return (flags & 0x10000) != 0; } + void setXRayAlphaTarget(bool enabled) { + flags &= ~0x10000; + flags |= atUint32(enabled) << 16; + } bool lightmapUVArray() const { return false; } /* For polymorphic compatibility with MP1/2 */ } flags; Value uniqueIdx; @@ -58,20 +102,12 @@ struct MaterialSet : BigDNA { const Header::Flags& getFlags() const { return header.flags; } const VAFlags& getVAFlags() const { return header.vaFlags; } - struct ISection : BigDNAV { - Delete expl; - enum class Type : atUint32 { PASS = SBIG('PASS'), CLR = SBIG('CLR '), INT = SBIG('INT ') } m_type; - ISection(Type type) : m_type(type) {} - virtual void constructNode(hecl::blender::PyOutStream& out, const PAKRouter& pakRouter, - const PAK::Entry& entry, const Material::ISection* prevSection, unsigned idx, - unsigned& texMapIdx, unsigned& texMtxIdx, unsigned& kColorIdx) const = 0; + enum class ChunkType : atUint32 { + PASS = 'PASS', CLR = 'CLR ', INT = 'INT ', END = 'END ' }; - struct SectionPASS : ISection { - SectionPASS() : ISection(ISection::Type::PASS) {} - static SectionPASS* castTo(ISection* sec) { - return sec->m_type == Type::PASS ? static_cast(sec) : nullptr; - } - AT_DECL_DNAV + + struct PASS : hecl::TypedRecordBigDNA { + AT_DECL_DNA Value size; enum class Subtype : atUint32 { DIFF = SBIG('DIFF'), @@ -93,6 +129,21 @@ struct MaterialSet : BigDNA { struct Flags : BigDNA { AT_DECL_DNA Value flags; + SwapColorComponent swapColorComponent() const { return SwapColorComponent(flags & 0x3); } + void setSwapColorComponent(SwapColorComponent comp) { + flags &= ~0x3; + flags |= atUint32(comp) << 0; + } + bool alphaContribution() const { return (flags & 0x4) != 0; } + void setAlphaContribution(bool enabled) { + flags &= ~0x4; + flags |= atUint32(enabled) << 2; + } + bool INCAColorMod() const { return (flags & 0x8) != 0; } + void setINCAColorMod(bool enabled) { + flags &= ~0x8; + flags |= atUint32(enabled) << 3; + } bool TRANInvert() const { return (flags & 0x10) != 0; } void setTRANInvert(bool enabled) { flags &= ~0x10; @@ -104,36 +155,21 @@ struct MaterialSet : BigDNA { Value uvAnimSize; struct UVAnimation : BigDNA { AT_DECL_DNA - Value unk1; - Value unk2; + Value uvSource; + Value mtxConfig; DNAMP1::MaterialSet::Material::UVAnimation anim; }; Vector uvAnim; - - void constructNode(hecl::blender::PyOutStream& out, const PAKRouter& pakRouter, - const PAK::Entry& entry, const Material::ISection* prevSection, unsigned idx, - unsigned& texMapIdx, unsigned& texMtxIdx, unsigned& kColorIdx) const override; }; - struct SectionCLR : ISection { - SectionCLR() : ISection(ISection::Type::CLR) {} - static SectionCLR* castTo(ISection* sec) { - return sec->m_type == Type::CLR ? static_cast(sec) : nullptr; - } - AT_DECL_DNAV + struct CLR : hecl::TypedRecordBigDNA { + AT_DECL_DNA enum class Subtype : atUint32 { CLR = SBIG('CLR '), DIFB = SBIG('DIFB') }; DNAFourCC subtype; GX::Color color; - - void constructNode(hecl::blender::PyOutStream& out, const PAKRouter& pakRouter, - const PAK::Entry& entry, const Material::ISection* prevSection, unsigned idx, - unsigned& texMapIdx, unsigned& texMtxIdx, unsigned& kColorIdx) const override; + CLR() = default; }; - struct SectionINT : ISection { - SectionINT() : ISection(ISection::Type::INT) {} - static SectionINT* castTo(ISection* sec) { - return sec->m_type == Type::INT ? static_cast(sec) : nullptr; - } - AT_DECL_DNAV + struct INT : hecl::TypedRecordBigDNA { + AT_DECL_DNA enum class Subtype : atUint32 { OPAC = SBIG('OPAC'), BLOD = SBIG('BLOD'), @@ -143,16 +179,12 @@ struct MaterialSet : BigDNA { }; DNAFourCC subtype; Value value; - - void constructNode(hecl::blender::PyOutStream& out, const PAKRouter& pakRouter, - const PAK::Entry& entry, const Material::ISection* prevSection, unsigned idx, - unsigned& texMapIdx, unsigned& texMtxIdx, unsigned& kColorIdx) const override; }; - struct SectionFactory : BigDNA { - AT_DECL_EXPLICIT_DNA - std::unique_ptr section; + struct END : hecl::TypedRecordBigDNA { + AT_DECL_DNA }; - std::vector sections; + using Chunk = hecl::TypedVariantBigDNA; + std::vector chunks; }; Vector materials; diff --git a/DataSpec/DNAMP3/CMakeLists.txt b/DataSpec/DNAMP3/CMakeLists.txt index 0c0ea91a6..e4950978b 100644 --- a/DataSpec/DNAMP3/CMakeLists.txt +++ b/DataSpec/DNAMP3/CMakeLists.txt @@ -14,11 +14,12 @@ set(DNAMP3_SOURCES DNAMP3.hpp DNAMP3.cpp PAK.cpp ANIM.cpp - CINF.cpp + CINF.hpp CHAR.cpp CMDL.hpp CMDL.cpp CMDLMaterials.cpp CSKR.cpp + PATH.hpp STRG.hpp STRG.cpp MAPA.hpp MREA.cpp) diff --git a/DataSpec/DNAMP3/DNAMP3.cpp b/DataSpec/DNAMP3/DNAMP3.cpp index a2b8199b0..c252ad33e 100644 --- a/DataSpec/DNAMP3/DNAMP3.cpp +++ b/DataSpec/DNAMP3/DNAMP3.cpp @@ -9,6 +9,7 @@ #include "CHAR.hpp" #include "MREA.hpp" #include "MAPA.hpp" +#include "PATH.hpp" #include "SAVW.hpp" #include "HINT.hpp" #include "DataSpec/DNACommon/TXTR.hpp" @@ -21,6 +22,8 @@ namespace DataSpec::DNAMP3 { logvisor::Module Log("urde::DNAMP3"); static bool GetNoShare(std::string_view name) { + if (name == "UniverseArea.pak"sv) + return false; std::string lowerName(name); std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower); if (!lowerName.compare(0, 7, "metroid")) @@ -194,6 +197,16 @@ void PAKBridge::addMAPATransforms(PAKRouter& pakRouter, fmt::format(fmt(_SYS_STR("!name_{}.yaml")), mlvl.worldNameId)); for (const MLVL::Area& area : mlvl.areas) { + { + /* Get PATH transform */ + const nod::Node* areaNode; + const PAK::Entry* areaEntry = pakRouter.lookupEntry(area.areaMREAId, &areaNode); + PAKEntryReadStream rs = areaEntry->beginReadStream(*areaNode); + UniqueID64 pathId = MREA::GetPATHId(rs); + if (pathId.isValid()) + addTo[pathId] = zeus::CMatrix4f(area.transformMtx[0], area.transformMtx[1], area.transformMtx[2], BottomRow) + .transposed(); + } hecl::ProjectPath areaDirPath = pakRouter.getWorking(area.areaMREAId).getParentPath(); if (area.areaNameId.isValid()) pathOverrides[area.areaNameId] = hecl::ProjectPath(areaDirPath, @@ -236,16 +249,20 @@ ResExtractor PAKBridge::LookupExtractor(const nod::Node& pakNode, con return {SAVWCommon::ExtractSAVW, {_SYS_STR(".yaml")}}; case SBIG('HINT'): return {HINT::Extract, {_SYS_STR(".yaml")}}; -// case SBIG('CMDL'): -// return {CMDL::Extract, {_SYS_STR(".blend")}, 1}; -// case SBIG('CHAR'): -// return {CHAR::Extract, {_SYS_STR(".yaml"), _SYS_STR(".blend")}, 2}; -// case SBIG('MLVL'): -// return {MLVL::Extract, {_SYS_STR(".yaml"), _SYS_STR(".blend")}, 3}; -// case SBIG('MREA'): -// return {MREA::Extract, {_SYS_STR(".blend")}, 4}; -// case SBIG('MAPA'): -// return {MAPA::Extract, {_SYS_STR(".blend")}, 4}; + case SBIG('CMDL'): + return {CMDL::Extract, {_SYS_STR(".blend")}, 1}; + case SBIG('CINF'): + return {CINF::Extract, {_SYS_STR(".blend")}, 1}; + case SBIG('CHAR'): + return {CHAR::Extract, {_SYS_STR(".yaml"), _SYS_STR(".blend")}, 2}; + case SBIG('MLVL'): + return {MLVL::Extract, {_SYS_STR(".yaml"), _SYS_STR(".blend")}, 3}; + case SBIG('MREA'): + return {MREA::Extract, {_SYS_STR(".blend")}, 4}; + case SBIG('MAPA'): + return {MAPA::Extract, {_SYS_STR(".blend")}, 4}; + case SBIG('PATH'): + return {PATH::Extract, {_SYS_STR(".blend")}, 5}; case SBIG('FSM2'): return {DNAFSM2::ExtractFSM2, {_SYS_STR(".yaml")}}; case SBIG('FONT'): diff --git a/DataSpec/DNAMP3/MREA.cpp b/DataSpec/DNAMP3/MREA.cpp index a54712423..293441c11 100644 --- a/DataSpec/DNAMP3/MREA.cpp +++ b/DataSpec/DNAMP3/MREA.cpp @@ -14,16 +14,14 @@ MREA::StreamReader::StreamReader(athena::io::IStreamReader& source, atUint32 blk m_blkCount = blkCount; m_blockInfos.reserve(blkCount); for (atUint32 i = 0; i < blkCount; ++i) { - m_blockInfos.emplace_back(); - BlockInfo& info = m_blockInfos.back(); + BlockInfo& info = m_blockInfos.emplace_back(); info.read(source); m_totalDecompLen += info.decompSize; } source.seekAlign32(); m_secIdxs.reserve(secIdxCount); for (atUint32 i = 0; i < secIdxCount; ++i) { - m_secIdxs.emplace_back(); - std::pair& idx = m_secIdxs.back(); + std::pair& idx = m_secIdxs.emplace_back(); idx.first.read(source); idx.second = source.readUint32Big(); } @@ -39,6 +37,15 @@ void MREA::StreamReader::writeSecIdxs(athena::io::IStreamWriter& writer) const { } } +bool MREA::StreamReader::seekToSection(FourCC sec, const std::vector& secSizes) { + auto search = std::find_if(m_secIdxs.begin(), m_secIdxs.end(), [sec](const auto& s) { return s.first == sec; }); + if (search != m_secIdxs.end()) { + DNAMP2::MREA::StreamReader::seekToSection(search->second, secSizes); + return true; + } + return false; +} + void MREA::ReadBabeDeadToBlender_3(hecl::blender::PyOutStream& os, athena::io::IStreamReader& rs) { atUint32 bdMagic = rs.readUint32Big(); if (bdMagic != 0xBABEDEAD) @@ -254,5 +261,20 @@ bool MREA::ExtractLayerDeps(PAKEntryReadStream& rs, PAKBridge::Level::Area& area return false; } +UniqueID64 MREA::GetPATHId(PAKEntryReadStream& rs) { + /* Do extract */ + Header head; + head.read(rs); + rs.seekAlign32(); + + /* MREA decompression stream */ + StreamReader drs(rs, head.compressedBlockCount, head.secIndexCount); + + /* Skip to PATH */ + if (drs.seekToSection(FOURCC('PFL2'), head.secSizes)) + return {drs}; + return {}; +} + } // namespace DNAMP3 } // namespace DataSpec diff --git a/DataSpec/DNAMP3/MREA.hpp b/DataSpec/DNAMP3/MREA.hpp index 35d234d54..5747b4393 100644 --- a/DataSpec/DNAMP3/MREA.hpp +++ b/DataSpec/DNAMP3/MREA.hpp @@ -13,6 +13,7 @@ struct MREA { StreamReader(athena::io::IStreamReader& source, atUint32 blkCount, atUint32 secIdxCount); std::vector>::const_iterator beginSecIdxs() { return m_secIdxs.begin(); } void writeSecIdxs(athena::io::IStreamWriter& writer) const; + bool seekToSection(FourCC sec, const std::vector& secSizes); }; struct Header : BigDNA { @@ -84,6 +85,8 @@ struct MREA { static void ReadBabeDeadToBlender_3(hecl::blender::PyOutStream& os, athena::io::IStreamReader& rs); + static UniqueID64 GetPATHId(PAKEntryReadStream& rs); + static bool Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl::ProjectPath& outPath, PAKRouter& pakRouter, const PAK::Entry& entry, bool, hecl::blender::Token& btok, std::function); diff --git a/DataSpec/DNAMP3/PATH.hpp b/DataSpec/DNAMP3/PATH.hpp new file mode 100644 index 000000000..f2b218055 --- /dev/null +++ b/DataSpec/DNAMP3/PATH.hpp @@ -0,0 +1,6 @@ +#pragma once +#include "DataSpec/DNACommon/PATH.hpp" + +namespace DataSpec::DNAMP3 { +using PATH = DNAPATH::PATH; +} // namespace DataSpec::DNAMP3 diff --git a/hecl b/hecl index b3d91f520..87ad5cbc8 160000 --- a/hecl +++ b/hecl @@ -1 +1 @@ -Subproject commit b3d91f520ad3a9429b0116f9b531ec12b2e71809 +Subproject commit 87ad5cbc81dad92d54c60d388157ca6300475c19 From 9a87a2443931a37e1672ab11f79d7bc856b965d6 Mon Sep 17 00:00:00 2001 From: Jack Andersen Date: Thu, 9 Apr 2020 17:21:05 -1000 Subject: [PATCH 028/224] Remove redundant condition from MP2's GetNoShare --- DataSpec/DNAMP2/DNAMP2.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/DataSpec/DNAMP2/DNAMP2.cpp b/DataSpec/DNAMP2/DNAMP2.cpp index 116a29b44..208bc8d14 100644 --- a/DataSpec/DNAMP2/DNAMP2.cpp +++ b/DataSpec/DNAMP2/DNAMP2.cpp @@ -25,8 +25,6 @@ namespace DataSpec::DNAMP2 { logvisor::Module Log("urde::DNAMP2"); static bool GetNoShare(std::string_view name) { - if (name == "FrontEnd.pak"sv) - return false; std::string lowerName(name); std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower); if (lowerName.compare(0, 7, "metroid") == 0) From 1e6b6622fe71b493cfaea0b9db2b431d031e936d Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 10 Apr 2020 02:12:11 -0400 Subject: [PATCH 029/224] CGuiFrame: Remove unnecessary mutable specifiers We can just drop the const qualifier on ProcessMouseInput() to make the mutable specifier unnecessary. --- Runtime/GuiSys/CGuiFrame.cpp | 2 +- Runtime/GuiSys/CGuiFrame.hpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Runtime/GuiSys/CGuiFrame.cpp b/Runtime/GuiSys/CGuiFrame.cpp index 1b1dd1329..03dc93daa 100644 --- a/Runtime/GuiSys/CGuiFrame.cpp +++ b/Runtime/GuiSys/CGuiFrame.cpp @@ -195,7 +195,7 @@ void CGuiFrame::ProcessUserInput(const CFinalInput& input) const { } } -bool CGuiFrame::ProcessMouseInput(const CFinalInput& input, const CGuiWidgetDrawParms& parms) const { +bool CGuiFrame::ProcessMouseInput(const CFinalInput& input, const CGuiWidgetDrawParms& parms) { if (const auto& kbm = input.GetKBM()) { zeus::CVector2f point(kbm->m_mouseCoord.norm[0] * 2.f - 1.f, kbm->m_mouseCoord.norm[1] * 2.f - 1.f); diff --git a/Runtime/GuiSys/CGuiFrame.hpp b/Runtime/GuiSys/CGuiFrame.hpp index a5c49d2b1..059316738 100644 --- a/Runtime/GuiSys/CGuiFrame.hpp +++ b/Runtime/GuiSys/CGuiFrame.hpp @@ -47,10 +47,10 @@ private: float m_aspectConstraint = -1.f; float m_maxAspect = -1.f; - mutable bool m_inMouseDown = false; - mutable bool m_inCancel = false; - mutable CGuiWidget* m_mouseDownWidget = nullptr; - mutable CGuiWidget* m_lastMouseOverWidget = nullptr; + bool m_inMouseDown = false; + bool m_inCancel = false; + CGuiWidget* m_mouseDownWidget = nullptr; + CGuiWidget* m_lastMouseOverWidget = nullptr; std::function m_mouseOverChangeCb; std::function m_mouseDownCb; std::function m_mouseUpCb; @@ -102,7 +102,7 @@ public: void Initialize(); void LoadWidgetsInGame(CInputStream& in, CSimplePool* sp); void ProcessUserInput(const CFinalInput& input) const; - bool ProcessMouseInput(const CFinalInput& input, const CGuiWidgetDrawParms& parms) const; + bool ProcessMouseInput(const CFinalInput& input, const CGuiWidgetDrawParms& parms); void ResetMouseState(); CGuiWidgetIdDB& GetWidgetIdDB() { return x18_idDB; } From 5f2ce02b059cd2db85b3e4ec33ca831832db7055 Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Thu, 9 Apr 2020 23:26:27 -0700 Subject: [PATCH 030/224] Fix extracting RS5FE.pak --- DataSpec/DNAMP3/DNAMP3.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DataSpec/DNAMP3/DNAMP3.cpp b/DataSpec/DNAMP3/DNAMP3.cpp index c252ad33e..52efdc8db 100644 --- a/DataSpec/DNAMP3/DNAMP3.cpp +++ b/DataSpec/DNAMP3/DNAMP3.cpp @@ -28,6 +28,8 @@ static bool GetNoShare(std::string_view name) { std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower); if (!lowerName.compare(0, 7, "metroid")) return false; + if (!lowerName.compare(0, 5, "rs5fe")) + return false; return true; } From f74c2d446f1562a658b9490bb5414b6f7b578f1b Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 10 Apr 2020 02:57:54 -0400 Subject: [PATCH 031/224] CEnvFxManager: Remove mutable keywords where applicable We can just make the relevant functions non-const to remove the use of mutable here. --- Runtime/World/CEnvFxManager.cpp | 36 ++++++++++++++++----------------- Runtime/World/CEnvFxManager.hpp | 26 ++++++++++++------------ 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/Runtime/World/CEnvFxManager.cpp b/Runtime/World/CEnvFxManager.cpp index 0ec4437a2..a9bd5bc62 100644 --- a/Runtime/World/CEnvFxManager.cpp +++ b/Runtime/World/CEnvFxManager.cpp @@ -375,10 +375,10 @@ static zeus::CColor GetFlakeColor(const zeus::CMatrix4f& mvp, const CEnvFxShader return zeus::CColor(1.f - zeus::clamp(0.f, screenHeight, 1.f), 1.f); } -void CEnvFxManagerGrid::RenderSnowParticles(const zeus::CTransform& camXf) const { - zeus::CVector3f xVec = 0.2f * camXf.basis[0]; - zeus::CVector3f zVec = 0.2f * camXf.basis[2]; - zeus::CMatrix4f mvp = CGraphics::GetPerspectiveProjectionMatrix(false) * CGraphics::g_GXModelView.toMatrix4f(); +void CEnvFxManagerGrid::RenderSnowParticles(const zeus::CTransform& camXf) { + const zeus::CVector3f xVec = 0.2f * camXf.basis[0]; + const zeus::CVector3f zVec = 0.2f * camXf.basis[2]; + const zeus::CMatrix4f mvp = CGraphics::GetPerspectiveProjectionMatrix(false) * CGraphics::g_GXModelView.toMatrix4f(); auto* bufOut = m_instBuf.access(); for (const auto& particle : x1c_particles) { bufOut->positions[0] = particle.toVec3f(); @@ -396,26 +396,26 @@ void CEnvFxManagerGrid::RenderSnowParticles(const zeus::CTransform& camXf) const CGraphics::DrawInstances(0, 4, x1c_particles.size()); } -void CEnvFxManagerGrid::RenderRainParticles(const zeus::CTransform& camXf) const { +void CEnvFxManagerGrid::RenderRainParticles(const zeus::CTransform& camXf) { m_lineRenderer.Reset(); - float zOffset = 2.f * (1.f - std::fabs(camXf.basis[2].dot(zeus::skUp))) + 1.f; - zeus::CColor color0(1.f, 10.f / 15.f); + const float zOffset = 2.f * (1.f - std::fabs(camXf.basis[2].dot(zeus::skUp))) + 1.f; + const zeus::CColor color0(1.f, 10.f / 15.f); for (const auto& particle : x1c_particles) { - zeus::CVector3f pos0 = particle.toVec3f(); + const zeus::CVector3f pos0 = particle.toVec3f(); zeus::CVector3f pos1 = pos0; pos1.z() += zOffset; - float uvy0 = pos0.z() * 10.f + m_uvyOffset; - float uvy1 = pos1.z() * 10.f + m_uvyOffset; + const float uvy0 = pos0.z() * 10.f + m_uvyOffset; + const float uvy1 = pos1.z() * 10.f + m_uvyOffset; m_lineRenderer.AddVertex(pos0, zeus::skWhite, 1.f, {0.f, uvy0}); m_lineRenderer.AddVertex(pos1, zeus::skClear, 1.f, {0.f, uvy1}); } m_lineRenderer.Render(g_Renderer->IsThermalVisorHotPass(), zeus::CColor(1.f, 0.15f)); } -void CEnvFxManagerGrid::RenderUnderwaterParticles(const zeus::CTransform& camXf) const { - zeus::CVector3f xVec = 0.5f * camXf.basis[0]; - zeus::CVector3f zVec = 0.5f * camXf.basis[2]; - zeus::CMatrix4f mvp = CGraphics::GetPerspectiveProjectionMatrix(false) * CGraphics::g_GXModelView.toMatrix4f(); +void CEnvFxManagerGrid::RenderUnderwaterParticles(const zeus::CTransform& camXf) { + const zeus::CVector3f xVec = 0.5f * camXf.basis[0]; + const zeus::CVector3f zVec = 0.5f * camXf.basis[2]; + const zeus::CMatrix4f mvp = CGraphics::GetPerspectiveProjectionMatrix(false) * CGraphics::g_GXModelView.toMatrix4f(); auto* bufOut = m_instBuf.access(); for (const auto& particle : x1c_particles) { bufOut->positions[0] = particle.toVec3f(); @@ -434,7 +434,7 @@ void CEnvFxManagerGrid::RenderUnderwaterParticles(const zeus::CTransform& camXf) } void CEnvFxManagerGrid::Render(const zeus::CTransform& xf, const zeus::CTransform& invXf, const zeus::CTransform& camXf, - float fxDensity, EEnvFxType fxType, const CEnvFxManager& parent) const { + float fxDensity, EEnvFxType fxType, CEnvFxManager& parent) { if (!x1c_particles.empty() && x14_block.first) { CGraphics::SetModelMatrix(xf * zeus::CTransform::Translate(x4_position.toVec2f() / 256.f)); parent.m_uniformData.mv = CGraphics::g_GXModelView.toMatrix4f(); @@ -469,7 +469,7 @@ void CEnvFxManagerGrid::Render(const zeus::CTransform& xf, const zeus::CTransfor } } -void CEnvFxManager::SetupSnowTevs(const CStateManager& mgr) const { +void CEnvFxManager::SetupSnowTevs(const CStateManager& mgr) { mgr.GetCameraManager()->GetCurrentCamera(mgr); if (mgr.GetCameraManager()->GetFluidCounter() != 0) { g_Renderer->SetWorldFog(ERglFogMode::PerspExp, 0.f, 35.f, zeus::skBlack); @@ -535,7 +535,7 @@ void CEnvFxManager::SetupUnderwaterTevs(const zeus::CTransform& invXf, const CSt // Swap: RGBR } -void CEnvFxManager::Render(const CStateManager& mgr) const { +void CEnvFxManager::Render(const CStateManager& mgr) { EEnvFxType fxType = mgr.GetWorld()->GetNeededEnvFx(); if (fxType != EEnvFxType::None) { if (mgr.GetPlayer().GetMorphballTransitionState() != CPlayer::EPlayerMorphBallState::Unmorphed || @@ -562,7 +562,7 @@ void CEnvFxManager::Render(const CStateManager& mgr) const { break; } m_fogUniformBuf->load(&CGraphics::g_Fog, sizeof(CGraphics::g_Fog)); - for (const auto& grid : x50_grids) + for (auto& grid : x50_grids) grid.Render(xf, invXf, camXf, x30_fxDensity, fxType, *this); // Backface cull diff --git a/Runtime/World/CEnvFxManager.hpp b/Runtime/World/CEnvFxManager.hpp index 02bc1f4e3..d0bc82dfc 100644 --- a/Runtime/World/CEnvFxManager.hpp +++ b/Runtime/World/CEnvFxManager.hpp @@ -64,34 +64,34 @@ class CEnvFxManagerGrid { std::pair x14_block = {false, FLT_MAX}; /* Blocked-bool, Z-coordinate */ std::vector x1c_particles; - mutable hecl::VertexBufferPool::Token m_instBuf; - mutable hecl::UniformBufferPool::Token m_uniformBuf; - mutable CLineRenderer m_lineRenderer; + hecl::VertexBufferPool::Token m_instBuf; + hecl::UniformBufferPool::Token m_uniformBuf; + CLineRenderer m_lineRenderer; boo::ObjToken m_snowBinding; boo::ObjToken m_underwaterBinding; - mutable float m_uvyOffset = 0.f; + float m_uvyOffset = 0.f; - void RenderSnowParticles(const zeus::CTransform& camXf) const; - void RenderRainParticles(const zeus::CTransform& camXf) const; - void RenderUnderwaterParticles(const zeus::CTransform& camXf) const; + void RenderSnowParticles(const zeus::CTransform& camXf); + void RenderRainParticles(const zeus::CTransform& camXf); + void RenderUnderwaterParticles(const zeus::CTransform& camXf); public: CEnvFxManagerGrid(const zeus::CVector2i& position, const zeus::CVector2i& extent, std::vector initialParticles, int reserve, CEnvFxManager& parent, boo::IGraphicsDataFactory::Context& ctx); void Render(const zeus::CTransform& xf, const zeus::CTransform& invXf, const zeus::CTransform& camXf, float fxDensity, - EEnvFxType fxType, const CEnvFxManager& parent) const; + EEnvFxType fxType, CEnvFxManager& parent); }; class CEnvFxManager { friend class CEnvFxManagerGrid; friend class CEnvFxShaders; - mutable hecl::VertexBufferPool m_instPool; - mutable hecl::UniformBufferPool m_uniformPool; - mutable CEnvFxShaders::Uniform m_uniformData; + hecl::VertexBufferPool m_instPool; + hecl::UniformBufferPool m_uniformPool; + CEnvFxShaders::Uniform m_uniformData; boo::ObjToken m_fogUniformBuf; zeus::CAABox x0_particleBounds = zeus::CAABox(-63.5f, 63.5f); @@ -133,7 +133,7 @@ class CEnvFxManager { void UpdateSnowParticles(const rstl::reserved_vector& snowForces); void UpdateRainParticles(const CVectorFixed8_8& zVec, const zeus::CVector3f& oopbtws, float dt); void UpdateUnderwaterParticles(const CVectorFixed8_8& zVec); - void SetupSnowTevs(const CStateManager& mgr) const; + void SetupSnowTevs(const CStateManager& mgr); void SetupRainTevs() const; void SetupUnderwaterTevs(const zeus::CTransform& invXf, const CStateManager& mgr) const; @@ -142,7 +142,7 @@ public: void AsyncLoadResources(CStateManager& mgr); void Update(float, CStateManager& mgr); - void Render(const CStateManager& mgr) const; + void Render(const CStateManager& mgr); void SetFxDensity(s32, float); void AreaLoaded(); void SetSplashRate(float f) { xb54_baseSplashRate = f; } From 8e263ff11b930b3999d81c403f83364d914f30fd Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 10 Apr 2020 13:25:44 -0400 Subject: [PATCH 032/224] CMapWorldInfo: Name all function prototype parameters Same thing but is more consistent and allows IDEs to do better parameter introspection. --- Runtime/AutoMapper/CMapWorldInfo.hpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Runtime/AutoMapper/CMapWorldInfo.hpp b/Runtime/AutoMapper/CMapWorldInfo.hpp index 7a468cd37..69ac18b65 100644 --- a/Runtime/AutoMapper/CMapWorldInfo.hpp +++ b/Runtime/AutoMapper/CMapWorldInfo.hpp @@ -18,17 +18,17 @@ class CMapWorldInfo { public: CMapWorldInfo() = default; - explicit CMapWorldInfo(CBitStreamReader&, const CSaveWorld& saveWorld, CAssetId mlvlId); + explicit CMapWorldInfo(CBitStreamReader& reader, const CSaveWorld& saveWorld, CAssetId mlvlId); void PutTo(CBitStreamWriter& writer, const CSaveWorld& savw, CAssetId mlvlId) const; - bool IsMapped(TAreaId) const; - void SetIsMapped(TAreaId, bool); + bool IsMapped(TAreaId aid) const; + void SetIsMapped(TAreaId aid, bool mapped); void SetDoorVisited(TEditorId eid, bool val); bool IsDoorVisited(TEditorId eid) const; - bool IsAreaVisited(TAreaId) const; - void SetAreaVisited(TAreaId, bool); - bool IsWorldVisible(TAreaId) const; - bool IsAreaVisible(TAreaId) const; + bool IsAreaVisited(TAreaId aid) const; + void SetAreaVisited(TAreaId aid, bool visited); + bool IsWorldVisible(TAreaId aid) const; + bool IsAreaVisible(TAreaId aid) const; bool IsAnythingSet() const; - void SetMapStationUsed(bool val) { x38_mapStationUsed = val; } + void SetMapStationUsed(bool isUsed) { x38_mapStationUsed = isUsed; } }; } // namespace urde From 89e2e65100631f9fbe158b289fc26b2945bacfe4 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 10 Apr 2020 13:43:52 -0400 Subject: [PATCH 033/224] CCameraManager: Eliminate variable shadowing We can get rid of shadowing in an inner scope. --- Runtime/Camera/CCameraManager.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Runtime/Camera/CCameraManager.cpp b/Runtime/Camera/CCameraManager.cpp index b73158140..a2fd101e7 100644 --- a/Runtime/Camera/CCameraManager.cpp +++ b/Runtime/Camera/CCameraManager.cpp @@ -398,8 +398,7 @@ void CCameraManager::UpdateCameraHints(float, CStateManager& mgr) { } } else { if (const TCastToConstPtr act = mgr.GetObjectById(bestHint->GetFirstHelper())) { - zeus::CVector3f ballPos = mgr.GetPlayer().GetBallPosition(); - zeus::CVector3f f26 = act->GetTranslation() - ballPos; + const zeus::CVector3f f26 = act->GetTranslation() - mgr.GetPlayer().GetBallPosition(); zeus::CVector3f ballToHelper = f26; if (ballToHelper.canBeNormalized()) { ballToHelper.normalize(); From 346d110b79822966b368519bc24730744fefdf3b Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 10 Apr 2020 15:02:36 -0400 Subject: [PATCH 034/224] Runtime: Replace bitfield unions with constructor initializers --- Runtime/CGameOptions.cpp | 10 ++++++---- Runtime/CGameOptions.hpp | 37 ++++++++++++------------------------- Runtime/CGameState.cpp | 2 ++ Runtime/CGameState.hpp | 10 ++-------- Runtime/CPakFile.cpp | 1 + Runtime/CPakFile.hpp | 15 +++++---------- Runtime/CPlayerState.cpp | 8 ++++---- Runtime/CPlayerState.hpp | 12 +++--------- Runtime/CStateManager.cpp | 9 ++++++++- Runtime/CStateManager.hpp | 20 +++++++------------- 10 files changed, 50 insertions(+), 74 deletions(-) diff --git a/Runtime/CGameOptions.cpp b/Runtime/CGameOptions.cpp index fff4226eb..4b2b8e4ee 100644 --- a/Runtime/CGameOptions.cpp +++ b/Runtime/CGameOptions.cpp @@ -212,10 +212,12 @@ void CGameOptions::PutTo(CBitStreamWriter& writer) const { writer.WriteEncoded(x68_27_swapBeamsControls, 1); } -CGameOptions::CGameOptions() { - x68_24_hudLag = true; - x68_26_rumble = true; - x68_28_hintSystem = true; +CGameOptions::CGameOptions() +: x68_24_hudLag(true) +, x68_25_invertY(false) +, x68_26_rumble(true) +, x68_27_swapBeamsControls(false) +, x68_28_hintSystem(true) { InitSoundMode(); } diff --git a/Runtime/CGameOptions.hpp b/Runtime/CGameOptions.hpp index 554ecea86..a77e3e849 100644 --- a/Runtime/CGameOptions.hpp +++ b/Runtime/CGameOptions.hpp @@ -56,18 +56,12 @@ class CPersistentOptions { u32 xc4_frozenBallCount = 0; u32 xc8_powerBombAmmoCount = 0; u32 xcc_logScanPercent = 0; - - union { - struct { - bool xd0_24_fusionLinked : 1; - bool xd0_25_normalModeBeat : 1; - bool xd0_26_hardModeBeat : 1; - bool xd0_27_fusionBeat : 1; - bool xd0_28_fusionSuitActive : 1; - bool xd0_29_allItemsCollected : 1; - }; - u16 _dummy = 0; - }; + bool xd0_24_fusionLinked : 1; + bool xd0_25_normalModeBeat : 1; + bool xd0_26_hardModeBeat : 1; + bool xd0_27_fusionBeat : 1; + bool xd0_28_fusionSuitActive : 1; + bool xd0_29_allItemsCollected : 1; public: CPersistentOptions() = default; @@ -116,22 +110,15 @@ class CGameOptions { u32 x5c_musicVol = 0x7f; u32 x60_hudAlpha = 0xff; u32 x64_helmetAlpha = 0xff; + bool x68_24_hudLag : 1; + bool x68_25_invertY : 1; + bool x68_26_rumble : 1; + bool x68_27_swapBeamsControls : 1; + bool x68_28_hintSystem : 1; + std::vector> x6c_controlTxtrMap; s32 m_gamma = 0; - union { - struct { - bool x68_24_hudLag : 1; - bool x68_25_invertY : 1; - bool x68_26_rumble : 1; - bool x68_27_swapBeamsControls : 1; - bool x68_28_hintSystem : 1; - }; - u16 _dummy = 0; - }; - - std::vector> x6c_controlTxtrMap; - public: CGameOptions(); explicit CGameOptions(CBitStreamReader& stream); diff --git a/Runtime/CGameState.cpp b/Runtime/CGameState.cpp index 2bd9531f6..ca4d7e469 100644 --- a/Runtime/CGameState.cpp +++ b/Runtime/CGameState.cpp @@ -137,6 +137,7 @@ CGameState::GameFileStateInfo CGameState::LoadGameFileState(const u8* data) { CGameState::CGameState() { x98_playerState = std::make_shared(); x9c_transManager = std::make_shared(); + x228_24_hardMode = false; x228_25_initPowerupsAtFirstSpawn = true; if (g_MemoryCardSys) InitializeMemoryStates(); @@ -144,6 +145,7 @@ CGameState::CGameState() { CGameState::CGameState(CBitStreamReader& stream, u32 saveIdx) : x20c_saveFileIdx(saveIdx) { x9c_transManager = std::make_shared(); + x228_24_hardMode = false; x228_25_initPowerupsAtFirstSpawn = true; for (bool& value : x0_) { diff --git a/Runtime/CGameState.hpp b/Runtime/CGameState.hpp index 32349f8d9..ad4146e6d 100644 --- a/Runtime/CGameState.hpp +++ b/Runtime/CGameState.hpp @@ -81,14 +81,8 @@ class CGameState { u32 x20c_saveFileIdx = 0; u64 x210_cardSerial = 0; std::vector x218_backupBuf; - - union { - struct { - bool x228_24_hardMode : 1; - bool x228_25_initPowerupsAtFirstSpawn : 1; - }; - u8 _dummy = 0; - }; + bool x228_24_hardMode : 1; + bool x228_25_initPowerupsAtFirstSpawn : 1; public: CGameState(); diff --git a/Runtime/CPakFile.cpp b/Runtime/CPakFile.cpp index 8d29f7367..7cb34c700 100644 --- a/Runtime/CPakFile.cpp +++ b/Runtime/CPakFile.cpp @@ -8,6 +8,7 @@ CPakFile::CPakFile(std::string_view filename, bool buildDepList, bool worldPak, Log.report(logvisor::Fatal, fmt("{}: Unable to open"), GetPath()); x28_24_buildDepList = buildDepList; //x28_24_buildDepList = true; // Always do this so URDE can rapidly pre-warm shaders + x28_25_aramFile = false; x28_26_worldPak = worldPak; x28_27_stashedInARAM = false; m_override = override; diff --git a/Runtime/CPakFile.hpp b/Runtime/CPakFile.hpp index d978d7fc6..f0b1ec91a 100644 --- a/Runtime/CPakFile.hpp +++ b/Runtime/CPakFile.hpp @@ -36,16 +36,11 @@ public: }; private: - union { - struct { - bool x28_24_buildDepList : 1; - bool x28_25_aramFile : 1; - bool x28_26_worldPak : 1; - bool x28_27_stashedInARAM : 1; - bool m_override : 1; - }; - u32 _dummy = 0; - }; + bool x28_24_buildDepList : 1; + bool x28_25_aramFile : 1; + bool x28_26_worldPak : 1; + bool x28_27_stashedInARAM : 1; + bool m_override : 1; enum class EAsyncPhase { Warmup = 0, InitialHeader = 1, diff --git a/Runtime/CPlayerState.cpp b/Runtime/CPlayerState.cpp index 38e9e9841..210a7f4e0 100644 --- a/Runtime/CPlayerState.cpp +++ b/Runtime/CPlayerState.cpp @@ -74,13 +74,13 @@ constexpr std::array ComboAmmoPeriods{ }; } // Anonymous namespace -CPlayerState::CPlayerState() : x188_staticIntf(5) { - x0_24_alive = true; +CPlayerState::CPlayerState() +: x0_24_alive(true), x0_25_firingComboBeam(false), x0_26_fusion(false), x188_staticIntf(5) { x24_powerups.resize(41); } -CPlayerState::CPlayerState(CBitStreamReader& stream) : x188_staticIntf(5) { - x0_24_alive = true; +CPlayerState::CPlayerState(CBitStreamReader& stream) +: x0_24_alive(true), x0_25_firingComboBeam(false), x0_26_fusion(false), x188_staticIntf(5) { x4_enabledItems = u32(stream.ReadEncoded(32)); const u32 integralHP = u32(stream.ReadEncoded(32)); diff --git a/Runtime/CPlayerState.hpp b/Runtime/CPlayerState.hpp index 22134070d..192095668 100644 --- a/Runtime/CPlayerState.hpp +++ b/Runtime/CPlayerState.hpp @@ -94,15 +94,9 @@ private: constexpr CPowerUp() = default; constexpr CPowerUp(u32 amount, u32 capacity) : x0_amount(amount), x4_capacity(capacity) {} }; - union { - struct { - bool x0_24_alive : 1; - bool x0_25_firingComboBeam : 1; - bool x0_26_fusion : 1; - }; - u32 dummy = 0; - }; - + bool x0_24_alive : 1; + bool x0_25_firingComboBeam : 1; + bool x0_26_fusion : 1; u32 x4_enabledItems = 0; EBeamId x8_currentBeam = EBeamId::Power; CHealthInfo xc_health = {99.f, 50.f}; diff --git a/Runtime/CStateManager.cpp b/Runtime/CStateManager.cpp index fda9eeb25..45cad7fc9 100644 --- a/Runtime/CStateManager.cpp +++ b/Runtime/CStateManager.cpp @@ -62,7 +62,14 @@ CStateManager::CStateManager(const std::weak_ptr& relayTracker, , x8bc_relayTracker(relayTracker) , x8c0_mapWorldInfo(mwInfo) , x8c4_worldTransManager(wtMgr) -, x8c8_worldLayerState(layerState) { +, x8c8_worldLayerState(layerState) +, xf94_24_readyToRender(false) +, xf94_25_quitGame(false) +, xf94_26_generatingObject(false) +, xf94_27_inMapScreen(false) +, xf94_28_inSaveUI(false) +, xf94_29_cinematicPause(false) +, xf94_30_fullThreat(false) { x86c_stateManagerContainer = std::make_unique(); x870_cameraManager = &x86c_stateManagerContainer->x0_cameraManager; x874_sortedListManager = &x86c_stateManagerContainer->x3c0_sortedListManager; diff --git a/Runtime/CStateManager.hpp b/Runtime/CStateManager.hpp index 225c79e07..1b138b7b7 100644 --- a/Runtime/CStateManager.hpp +++ b/Runtime/CStateManager.hpp @@ -202,19 +202,13 @@ private: CAssetId xf88_; float xf8c_ = 0.f; EStateManagerTransition xf90_deferredTransition = EStateManagerTransition::InGame; - - union { - struct { - bool xf94_24_readyToRender : 1; - bool xf94_25_quitGame : 1; - bool xf94_26_generatingObject : 1; - bool xf94_27_inMapScreen : 1; - bool xf94_28_inSaveUI : 1; - bool xf94_29_cinematicPause : 1; - bool xf94_30_fullThreat : 1; - }; - u32 xf94_ = 0; - }; + bool xf94_24_readyToRender : 1; + bool xf94_25_quitGame : 1; + bool xf94_26_generatingObject : 1; + bool xf94_27_inMapScreen : 1; + bool xf94_28_inSaveUI : 1; + bool xf94_29_cinematicPause : 1; + bool xf94_30_fullThreat : 1; CColoredQuadFilter m_deathWhiteout{EFilterType::Add}; CColoredQuadFilter m_escapeWhiteout{EFilterType::Add}; From 8e691d0f73384f13ae3491b60867c105cf818038 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 10 Apr 2020 15:02:55 -0400 Subject: [PATCH 035/224] Runtime/Audio: Replace bitfield unions with constructor initializers --- Runtime/Audio/CStreamAudioManager.cpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/Runtime/Audio/CStreamAudioManager.cpp b/Runtime/Audio/CStreamAudioManager.cpp index 51ee8d788..ba6c4db21 100644 --- a/Runtime/Audio/CStreamAudioManager.cpp +++ b/Runtime/Audio/CStreamAudioManager.cpp @@ -446,14 +446,9 @@ public: private: dspadpcm_header x0_header; std::string x60_fileName; // arg1 - union { - u32 dummy = 0; - struct { - bool x70_24_unclaimed : 1; - bool x70_25_headerReadCancelled : 1; - u8 x70_26_headerReadState : 2; // 0: not read 1: reading 2: read - }; - }; + bool x70_24_unclaimed : 1; + bool x70_25_headerReadCancelled : 1; + u8 x70_26_headerReadState : 2; // 0: not read 1: reading 2: read s8 x71_companionRight = -1; s8 x72_companionLeft = -1; float x73_volume = 0.f; @@ -465,13 +460,16 @@ private: static std::array g_Streams; public: - CDSPStreamManager() { x70_24_unclaimed = true; } + CDSPStreamManager() : x70_24_unclaimed(true), x70_25_headerReadCancelled(false), x70_26_headerReadState(0) {} CDSPStreamManager(std::string_view fileName, s32 handle, float volume, bool oneshot) - : x60_fileName(fileName), x73_volume(volume), x74_oneshot(oneshot), x78_handleId(handle) { - if (!CDvdFile::FileExists(fileName)) - x70_24_unclaimed = true; - } + : x60_fileName(fileName) + , x70_24_unclaimed(!CDvdFile::FileExists(fileName)) + , x70_25_headerReadCancelled(false) + , x70_26_headerReadState(0) + , x73_volume(volume) + , x74_oneshot(oneshot) + , x78_handleId(handle) {} static s32 FindUnclaimedStreamIdx() { for (size_t i = 0; i < g_Streams.size(); ++i) { From 496bb3e62459920ccfaef674953945d06eea3da0 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 10 Apr 2020 15:03:05 -0400 Subject: [PATCH 036/224] Runtime/Camera: Replace bitfield unions with constructor initializers --- Runtime/Camera/CCameraManager.cpp | 12 +++++++++--- Runtime/Camera/CCameraManager.hpp | 24 +++++------------------- 2 files changed, 14 insertions(+), 22 deletions(-) diff --git a/Runtime/Camera/CCameraManager.cpp b/Runtime/Camera/CCameraManager.cpp index a2fd101e7..f2a61f4f7 100644 --- a/Runtime/Camera/CCameraManager.cpp +++ b/Runtime/Camera/CCameraManager.cpp @@ -21,9 +21,15 @@ namespace urde { float CCameraManager::sFirstPersonFOV = 55.f; -CCameraManager::CCameraManager(TUniqueId curCameraId) : x0_curCameraId(curCameraId) { - CSfxManager::AddListener(CSfxManager::ESfxChannels::Game, zeus::skZero3f, zeus::skZero3f, - {1.f, 0.f, 0.f}, {0.f, 0.f, 1.f}, 50.f, 50.f, 1000.f, 1, 1.f); +CCameraManager::CCameraManager(TUniqueId curCameraId) +: x0_curCameraId(curCameraId) +, xa0_24_pendingRumble(false) +, xa0_25_rumbling(false) +, xa0_26_inWater(false) +, x3b8_24_(false) +, x3b8_25_(false) { + CSfxManager::AddListener(CSfxManager::ESfxChannels::Game, zeus::skZero3f, zeus::skZero3f, {1.f, 0.f, 0.f}, + {0.f, 0.f, 1.f}, 50.f, 50.f, 1000.f, 1, 1.f); sFirstPersonFOV = g_tweakGame->GetFirstPersonFOV(); } diff --git a/Runtime/Camera/CCameraManager.hpp b/Runtime/Camera/CCameraManager.hpp index 7268b6bf8..60b5edd40 100644 --- a/Runtime/Camera/CCameraManager.hpp +++ b/Runtime/Camera/CCameraManager.hpp @@ -40,16 +40,9 @@ class CCameraManager { float x94_fogDensityFactor = 1.f; float x98_fogDensitySpeed = 0.f; float x9c_fogDensityFactorTarget = 1.f; - - union { - struct { - bool xa0_24_pendingRumble : 1; - bool xa0_25_rumbling : 1; - bool xa0_26_inWater : 1; - }; - u8 _dummy1 = 0; - }; - + bool xa0_24_pendingRumble : 1; + bool xa0_25_rumbling : 1; + bool xa0_26_inWater : 1; TUniqueId xa2_spindleCamId = kInvalidUniqueId; TUniqueId xa4_pathCamId = kInvalidUniqueId; TUniqueId xa6_camHintId = kInvalidUniqueId; @@ -57,15 +50,8 @@ class CCameraManager { rstl::reserved_vector, 64> xac_cameraHints; rstl::reserved_vector x2b0_inactiveCameraHints; rstl::reserved_vector x334_activeCameraHints; - - union { - struct { - bool x3b8_24_ : 1; - bool x3b8_25_ : 1; - }; - u8 _dummy2; - }; - + bool x3b8_24_ : 1; + bool x3b8_25_ : 1; float x3bc_curFov = 60.f; void SetPathCamera(TUniqueId id, CStateManager& mgr); From 4a3ce8453fc28f1fec08c14d62f116cd0bf789c4 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 10 Apr 2020 15:03:15 -0400 Subject: [PATCH 037/224] Runtime/Graphics: Replace bitfield unions with constructor initializers --- Runtime/Character/CActorLights.cpp | 22 +++++++------- Runtime/Character/CActorLights.hpp | 28 +++++++----------- Runtime/Character/CAnimData.cpp | 12 ++++++-- Runtime/Character/CAnimData.hpp | 23 ++++++--------- Runtime/Character/CBodyController.cpp | 11 +++++-- Runtime/Character/CBodyController.hpp | 15 ++++------ Runtime/Character/CBodyState.hpp | 41 +++++++++++---------------- Runtime/Character/CBoneTracking.cpp | 4 ++- Runtime/Character/CBoneTracking.hpp | 19 +++++-------- Runtime/Character/CIkChain.hpp | 10 ++----- Runtime/Character/CModelData.cpp | 16 ++++++----- Runtime/Character/CModelData.hpp | 9 ++---- Runtime/Character/CRagDoll.cpp | 14 +++++---- Runtime/Character/CRagDoll.hpp | 17 ++++------- 14 files changed, 110 insertions(+), 131 deletions(-) diff --git a/Runtime/Character/CActorLights.cpp b/Runtime/Character/CActorLights.cpp index 3317c506e..4144aa614 100644 --- a/Runtime/Character/CActorLights.cpp +++ b/Runtime/Character/CActorLights.cpp @@ -18,20 +18,22 @@ s32 CActorLights::sFrameSchedulerCount = 0; CActorLights::CActorLights(u32 areaUpdateFramePeriod, const zeus::CVector3f& actorPosBias, int maxDynamicLights, int maxAreaLights, bool ambientChannelOverflow, bool layer2, bool disableWorldLights, float positionUpdateThreshold) -: x2a8_areaUpdateFramePeriod(areaUpdateFramePeriod) +: x298_24_dirty(true) +, x298_25_castShadows(true) +, x298_26_hasAreaLights(false) +, x298_27_findShadowLight(false) +, x298_28_inArea(!disableWorldLights && maxAreaLights > 0) +, x298_29_ambienceGenerated(ambientChannelOverflow) +, x298_30_layer2(layer2) +, x298_31_disableWorldLights(disableWorldLights) +, x299_24_inBrightLight(true) +, x299_25_useBrightLightLag(false) +, x299_26_ambientOnly(false) +, x2a8_areaUpdateFramePeriod(areaUpdateFramePeriod) , x2ac_actorPosBias(actorPosBias) , x2b8_maxAreaLights(maxAreaLights) , x2bc_maxDynamicLights(maxDynamicLights) , x2cc_actorPositionDeltaUpdateThreshold(positionUpdateThreshold * positionUpdateThreshold) { - x298_24_dirty = true; - x298_25_castShadows = true; - - x298_28_inArea = !disableWorldLights && maxAreaLights > 0; - x298_29_ambienceGenerated = ambientChannelOverflow; - x298_30_layer2 = layer2; - x298_31_disableWorldLights = disableWorldLights; - x299_24_inBrightLight = true; - sFrameSchedulerCount++; sFrameSchedulerCount &= 7; } diff --git a/Runtime/Character/CActorLights.hpp b/Runtime/Character/CActorLights.hpp index a6af5e8bd..4a5044786 100644 --- a/Runtime/Character/CActorLights.hpp +++ b/Runtime/Character/CActorLights.hpp @@ -20,23 +20,17 @@ class CActorLights { std::vector x144_dynamicLights; zeus::CColor x288_ambientColor = zeus::skBlack; TAreaId x294_aid = kInvalidAreaId; - - union { - struct { - bool x298_24_dirty : 1; - bool x298_25_castShadows : 1; - bool x298_26_hasAreaLights : 1; - bool x298_27_findShadowLight : 1; - bool x298_28_inArea : 1; - bool x298_29_ambienceGenerated : 1; - bool x298_30_layer2 : 1; - bool x298_31_disableWorldLights : 1; - bool x299_24_inBrightLight : 1; - bool x299_25_useBrightLightLag : 1; - bool x299_26_ambientOnly : 1; - }; - u16 _dummy = 0; - }; + bool x298_24_dirty : 1; + bool x298_25_castShadows : 1; + bool x298_26_hasAreaLights : 1; + bool x298_27_findShadowLight : 1; + bool x298_28_inArea : 1; + bool x298_29_ambienceGenerated : 1; + bool x298_30_layer2 : 1; + bool x298_31_disableWorldLights : 1; + bool x299_24_inBrightLight : 1; + bool x299_25_useBrightLightLag : 1; + bool x299_26_ambientOnly : 1; bool x29a_findNearestDynamicLights = false; s32 x29c_shadowLightArrIdx = -1; s32 x2a0_shadowLightIdx = -1; diff --git a/Runtime/Character/CAnimData.cpp b/Runtime/Character/CAnimData.cpp index f201b064b..111a50726 100644 --- a/Runtime/Character/CAnimData.cpp +++ b/Runtime/Character/CAnimData.cpp @@ -45,9 +45,9 @@ CAnimData::CAnimData(CAssetId id, const CCharacterInfo& character, int defaultAn const std::weak_ptr& ctx, std::shared_ptr animMgr, std::shared_ptr transMgr, TLockedToken charFactory, int drawInstCount) -: x0_charFactory(std::move(charFactory)) +: x0_charFactory(charFactory) , xc_charInfo(character) -, xcc_layoutData(std::move(layout)) +, xcc_layoutData(layout) , xd8_modelData(std::move(model)) , xfc_animCtx(ctx.lock()) , x100_animMgr(std::move(animMgr)) @@ -55,6 +55,14 @@ CAnimData::CAnimData(CAssetId id, const CCharacterInfo& character, int defaultAn , x1fc_transMgr(std::move(transMgr)) , x204_charIdx(charIdx) , x208_defaultAnim(defaultAnim) +, x220_24_animating(false) +, x220_25_loop(false) +, x220_26_aligningPos(false) +, x220_27_(false) +, x220_28_(false) +, x220_29_animationJustStarted(false) +, x220_30_poseBuilt(false) +, x220_31_poseCached(false) , x224_pose(layout->GetSegIdList().GetList().size()) , x2fc_poseBuilder(CLayoutDescription{layout}) , m_drawInstCount(drawInstCount) { diff --git a/Runtime/Character/CAnimData.hpp b/Runtime/Character/CAnimData.hpp index 184874263..ce488f2a2 100644 --- a/Runtime/Character/CAnimData.hpp +++ b/Runtime/Character/CAnimData.hpp @@ -124,21 +124,14 @@ private: u32 x214_passedParticleCount = 0; u32 x218_passedSoundCount = 0; s32 x21c_particleLightIdx = 0; - - union { - u32 x220_flags = 0; - struct { - bool x220_24_animating : 1; - bool x220_25_loop : 1; - bool x220_26_aligningPos : 1; - bool x220_27_ : 1; - bool x220_28_ : 1; - bool x220_29_animationJustStarted : 1; - bool x220_30_poseBuilt : 1; - bool x220_31_poseCached : 1; - }; - }; - + bool x220_24_animating : 1; + bool x220_25_loop : 1; + bool x220_26_aligningPos : 1; + bool x220_27_ : 1; + bool x220_28_ : 1; + bool x220_29_animationJustStarted : 1; + bool x220_30_poseBuilt : 1; + bool x220_31_poseCached : 1; CPoseAsTransforms x224_pose; CHierarchyPoseBuilder x2fc_poseBuilder; diff --git a/Runtime/Character/CBodyController.cpp b/Runtime/Character/CBodyController.cpp index ddd92cf35..94f86a935 100644 --- a/Runtime/Character/CBodyController.cpp +++ b/Runtime/Character/CBodyController.cpp @@ -12,8 +12,15 @@ namespace urde { CBodyController::CBodyController(CActor& actor, float turnSpeed, EBodyType bodyType) -: x0_actor(actor), x2a4_bodyStateInfo(actor, bodyType), x2f4_bodyType(bodyType), x2fc_turnSpeed(turnSpeed) { - x300_28_playDeathAnims = true; +: x0_actor(actor) +, x2a4_bodyStateInfo(actor, bodyType) +, x2f4_bodyType(bodyType) +, x2fc_turnSpeed(turnSpeed) +, x300_24_animationOver(false) +, x300_25_active(false) +, x300_26_frozen(false) +, x300_27_hasBeenFrozen(false) +, x300_28_playDeathAnims(true) { x2a4_bodyStateInfo.x18_bodyController = this; } diff --git a/Runtime/Character/CBodyController.hpp b/Runtime/Character/CBodyController.hpp index ac9839dae..a50d2663d 100644 --- a/Runtime/Character/CBodyController.hpp +++ b/Runtime/Character/CBodyController.hpp @@ -28,16 +28,11 @@ class CBodyController { EBodyType x2f4_bodyType; s32 x2f8_curAnim = -1; float x2fc_turnSpeed; - union { - struct { - bool x300_24_animationOver : 1; - bool x300_25_active : 1; - bool x300_26_frozen : 1; - bool x300_27_hasBeenFrozen : 1; - bool x300_28_playDeathAnims : 1; - }; - u32 _dummy = 0; - }; + bool x300_24_animationOver : 1; + bool x300_25_active : 1; + bool x300_26_frozen : 1; + bool x300_27_hasBeenFrozen : 1; + bool x300_28_playDeathAnims : 1; float x304_intoFreezeDur = 0.f; float x308_frozenDur = 0.f; float x30c_breakoutDur = 0.f; diff --git a/Runtime/Character/CBodyState.hpp b/Runtime/Character/CBodyState.hpp index 9dfce3539..17b83075a 100644 --- a/Runtime/Character/CBodyState.hpp +++ b/Runtime/Character/CBodyState.hpp @@ -202,22 +202,23 @@ class CBSJump : public CBodyState { zeus::CVector3f xc_waypoint1; zeus::CVector3f x18_velocity; zeus::CVector3f x24_waypoint2; - union { - struct { - bool x30_24_bodyForceSet : 1; - bool x30_25_wallJump : 1; - bool x30_26_wallBounceRight : 1; - bool x30_27_wallBounceComplete : 1; - bool x30_28_startInJumpLoop : 1; - }; - u32 _dummy = 0; - }; + bool x30_24_bodyForceSet : 1; + bool x30_25_wallJump : 1; + bool x30_26_wallBounceRight : 1; + bool x30_27_wallBounceComplete : 1; + bool x30_28_startInJumpLoop : 1; pas::EAnimationState GetBodyStateTransition(float dt, const CBodyController& bc) const; bool CheckForWallJump(CBodyController& bc, CStateManager& mgr); void CheckForLand(CBodyController& bc, CStateManager& mgr); void PlayJumpLoop(CStateManager& mgr, CBodyController& bc); public: + CBSJump() + : x30_24_bodyForceSet(false) + , x30_25_wallJump(false) + , x30_26_wallBounceRight(false) + , x30_27_wallBounceComplete(false) + , x30_28_startInJumpLoop(false) {} bool IsMoving() const override { return true; } bool ApplyHeadTracking() const override { return false; } bool CanShoot() const override; @@ -277,17 +278,13 @@ public: }; class CBSScripted : public CBodyState { - union { - struct { - bool x4_24_loopAnim : 1; - bool x4_25_timedLoop : 1; - }; - u32 _dummy = 0; - }; + bool x4_24_loopAnim : 1; + bool x4_25_timedLoop : 1; float x8_remTime = 0.f; pas::EAnimationState GetBodyStateTransition(float dt, const CBodyController& bc) const; public: + CBSScripted() : x4_24_loopAnim(false), x4_25_timedLoop(false) {} bool ApplyHeadTracking() const override { return false; } void Start(CBodyController& bc, CStateManager& mgr) override; pas::EAnimationState UpdateBody(float dt, CBodyController& bc, CStateManager& mgr) override; @@ -313,13 +310,8 @@ class CBSWallHang : public CBodyState { pas::EWallHangState x4_state = pas::EWallHangState::Invalid; TUniqueId x8_wpId = kInvalidUniqueId; zeus::CVector3f xc_launchVel; - union { - struct { - bool x18_24_launched : 1; - bool x18_25_needsExit : 1; - }; - u32 _dummy = 0; - }; + bool x18_24_launched : 1; + bool x18_25_needsExit : 1; pas::EAnimationState GetBodyStateTransition(float dt, const CBodyController& bc) const; void FixInPlace(CBodyController& bc); bool CheckForLand(CBodyController& bc, CStateManager& mgr); @@ -327,6 +319,7 @@ class CBSWallHang : public CBodyState { void SetLaunchVelocity(CBodyController& bc); public: + CBSWallHang() : x18_24_launched(false), x18_25_needsExit(false) {} bool IsMoving() const override { return true; } bool CanShoot() const override { return x4_state == pas::EWallHangState::WallHang; } bool IsInAir(const CBodyController& bc) const override; diff --git a/Runtime/Character/CBoneTracking.cpp b/Runtime/Character/CBoneTracking.cpp index 0814f4be2..b6afda934 100644 --- a/Runtime/Character/CBoneTracking.cpp +++ b/Runtime/Character/CBoneTracking.cpp @@ -15,6 +15,8 @@ CBoneTracking::CBoneTracking(const CAnimData& animData, std::string_view bone, : x14_segId(animData.GetCharLayoutInfo().GetSegIdFromString(bone)) , x1c_maxTrackingAngle(maxTrackingAngle) , x20_angSpeed(angSpeed) +, x36_24_active(false) +, x36_25_hasTrackedRotation(false) , x36_26_noParent(True(flags & EBoneTrackingFlags::NoParent)) , x36_27_noParentOrigin(True(flags & EBoneTrackingFlags::NoParentOrigin)) , x36_28_noHorizontalAim(True(flags & EBoneTrackingFlags::NoHorizontalAim)) @@ -107,4 +109,4 @@ void CBoneTracking::UnsetTarget() { x34_target = kInvalidUniqueId; } void CBoneTracking::SetTargetPosition(const zeus::CVector3f& targetPos) { x24_targetPosition = targetPos; } void CBoneTracking::SetNoHorizontalAim(bool b) { x36_28_noHorizontalAim = b; } -} // namespace urde \ No newline at end of file +} // namespace urde diff --git a/Runtime/Character/CBoneTracking.hpp b/Runtime/Character/CBoneTracking.hpp index 148c8de06..94d9456aa 100644 --- a/Runtime/Character/CBoneTracking.hpp +++ b/Runtime/Character/CBoneTracking.hpp @@ -33,17 +33,12 @@ class CBoneTracking { float x20_angSpeed; std::optional x24_targetPosition; TUniqueId x34_target = kInvalidUniqueId; - union { - struct { - bool x36_24_active : 1; - bool x36_25_hasTrackedRotation : 1; - bool x36_26_noParent : 1; - bool x36_27_noParentOrigin : 1; - bool x36_28_noHorizontalAim : 1; - bool x36_29_parentIk : 1; - }; - u32 _dummy = 0; - }; + bool x36_24_active : 1; + bool x36_25_hasTrackedRotation : 1; + bool x36_26_noParent : 1; + bool x36_27_noParentOrigin : 1; + bool x36_28_noHorizontalAim : 1; + bool x36_29_parentIk : 1; public: CBoneTracking(const CAnimData& animData, std::string_view bone, @@ -60,4 +55,4 @@ public: void SetNoHorizontalAim(bool b); }; -} // namespace urde \ No newline at end of file +} // namespace urde diff --git a/Runtime/Character/CIkChain.hpp b/Runtime/Character/CIkChain.hpp index 4df48d3b2..c572dc836 100644 --- a/Runtime/Character/CIkChain.hpp +++ b/Runtime/Character/CIkChain.hpp @@ -21,16 +21,10 @@ class CIkChain { zeus::CQuaternion x24_holdRot; zeus::CVector3f x34_holdPos; float x40_time = 0.f; - - union { - struct { - bool x44_24_activated : 1; - }; - u32 x44_dummy = 0; - }; + bool x44_24_activated : 1; public: - CIkChain() = default; + CIkChain() : x44_24_activated(false) {} bool GetActive() const { return x44_24_activated; } void Update(float); diff --git a/Runtime/Character/CModelData.cpp b/Runtime/Character/CModelData.cpp index b5ee3efda..98c0119be 100644 --- a/Runtime/Character/CModelData.cpp +++ b/Runtime/Character/CModelData.cpp @@ -25,14 +25,16 @@ CModelData::~CModelData() = default; CModelData::CModelData() {} CModelData CModelData::CModelDataNull() { return CModelData(); } -CModelData::CModelData(const CStaticRes& res, int instCount) : x0_scale(res.GetScale()), m_drawInstCount(instCount) { +CModelData::CModelData(const CStaticRes& res, int instCount) +: x0_scale(res.GetScale()), x14_24_renderSorted(false), x14_25_sortThermal(false), m_drawInstCount(instCount) { x1c_normalModel = g_SimplePool->GetObj({SBIG('CMDL'), res.GetId()}); if (!x1c_normalModel) Log.report(logvisor::Fatal, fmt("unable to find CMDL {}"), res.GetId()); m_normalModelInst = x1c_normalModel->MakeNewInstance(0, instCount); } -CModelData::CModelData(const CAnimRes& res, int instCount) : x0_scale(res.GetScale()), m_drawInstCount(instCount) { +CModelData::CModelData(const CAnimRes& res, int instCount) +: x0_scale(res.GetScale()), x14_24_renderSorted(false), x14_25_sortThermal(false), m_drawInstCount(instCount) { TToken factory = g_CharFactoryBuilder->GetFactory(res); x10_animData = factory->CreateCharacter(res.GetCharacterNodeId(), res.CanLoop(), factory, res.GetDefaultAnim(), instCount); @@ -76,13 +78,13 @@ bool CModelData::IsLoaded(int shaderIdx) const { } u32 CModelData::GetNumMaterialSets() const { - if (x10_animData) - return x10_animData->GetModelData()->GetModel()->GetNumMaterialSets(); + if (x10_animData) + return x10_animData->GetModelData()->GetModel()->GetNumMaterialSets(); - if (x1c_normalModel) - return x1c_normalModel->GetNumMaterialSets(); + if (x1c_normalModel) + return x1c_normalModel->GetNumMaterialSets(); - return 1; + return 1; } CModelData::EWhichModel CModelData::GetRenderingModel(const CStateManager& stateMgr) { diff --git a/Runtime/Character/CModelData.hpp b/Runtime/Character/CModelData.hpp index ab746220f..57e1680c7 100644 --- a/Runtime/Character/CModelData.hpp +++ b/Runtime/Character/CModelData.hpp @@ -62,13 +62,8 @@ class CModelData { zeus::CVector3f x0_scale; bool xc_ = false; std::unique_ptr x10_animData; - union { - struct { - bool x14_24_renderSorted : 1; - bool x14_25_sortThermal : 1; - }; - u32 _flags = 0; - }; + bool x14_24_renderSorted : 1; + bool x14_25_sortThermal : 1; zeus::CColor x18_ambientColor; TLockedToken x1c_normalModel; diff --git a/Runtime/Character/CRagDoll.cpp b/Runtime/Character/CRagDoll.cpp index 77f6a7f43..0ca6d8b0a 100644 --- a/Runtime/Character/CRagDoll.cpp +++ b/Runtime/Character/CRagDoll.cpp @@ -59,11 +59,15 @@ void CRagDoll::CRagDollPlaneConstraint::Update() { } CRagDoll::CRagDoll(float normalGravity, float floatingGravity, float overTime, u32 flags) -: x44_normalGravity(normalGravity), x48_floatingGravity(floatingGravity), x50_overTimer(overTime) { - x68_27_continueSmallMovements = bool(flags & 0x1); - x68_28_noOverTimer = bool(flags & 0x2); - x68_29_noAiCollision = bool(flags & 0x4); -} +: x44_normalGravity(normalGravity) +, x48_floatingGravity(floatingGravity) +, x50_overTimer(overTime) +, x68_24_prevMovingSlowly(false) +, x68_25_over(false) +, x68_26_primed(false) +, x68_27_continueSmallMovements(bool(flags & 0x1)) +, x68_28_noOverTimer(bool(flags & 0x2)) +, x68_29_noAiCollision(bool(flags & 0x4)) {} void CRagDoll::AccumulateForces(float dt, float waterTop) { float fps = 1.f / dt; diff --git a/Runtime/Character/CRagDoll.hpp b/Runtime/Character/CRagDoll.hpp index 678861df7..3f383e68b 100644 --- a/Runtime/Character/CRagDoll.hpp +++ b/Runtime/Character/CRagDoll.hpp @@ -94,17 +94,12 @@ protected: float x54_impactVel = 0.f; zeus::CVector3f x58_averageVel; float x64_angTimer = 0.f; - union { - struct { - bool x68_24_prevMovingSlowly : 1; - bool x68_25_over : 1; - bool x68_26_primed : 1; - bool x68_27_continueSmallMovements : 1; - bool x68_28_noOverTimer : 1; - bool x68_29_noAiCollision : 1; - }; - u32 _dummy = 0; - }; + bool x68_24_prevMovingSlowly : 1; + bool x68_25_over : 1; + bool x68_26_primed : 1; + bool x68_27_continueSmallMovements : 1; + bool x68_28_noOverTimer : 1; + bool x68_29_noAiCollision : 1; void AccumulateForces(float dt, float waterTop); void SetNumParticles(int num) { x4_particles.reserve(num); } void AddParticle(CSegId id, const zeus::CVector3f& prevPos, const zeus::CVector3f& curPos, float radius); From f83b970e75027952a2aa315578705a52a5fc484f Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 10 Apr 2020 15:03:24 -0400 Subject: [PATCH 038/224] Runtime/Collision: Replace bitfield unions with constructor initializers --- Runtime/Collision/CMetroidAreaCollider.hpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/Runtime/Collision/CMetroidAreaCollider.hpp b/Runtime/Collision/CMetroidAreaCollider.hpp index 7f34f557c..97a0a9e6d 100644 --- a/Runtime/Collision/CMetroidAreaCollider.hpp +++ b/Runtime/Collision/CMetroidAreaCollider.hpp @@ -173,16 +173,12 @@ public: class CAreaCollisionCache { zeus::CAABox x0_aabb; rstl::reserved_vector x18_leafCaches; - union { - struct { - bool x1b40_24_leafOverflow : 1; - bool x1b40_25_cacheOverflow : 1; - }; - u32 _dummy = 0; - }; + bool x1b40_24_leafOverflow : 1; + bool x1b40_25_cacheOverflow : 1; public: - explicit CAreaCollisionCache(const zeus::CAABox& aabb) : x0_aabb(aabb) {} + explicit CAreaCollisionCache(const zeus::CAABox& aabb) + : x0_aabb(aabb), x1b40_24_leafOverflow(false), x1b40_25_cacheOverflow(false) {} void ClearCache(); const zeus::CAABox& GetCacheBounds() const { return x0_aabb; } void SetCacheBounds(const zeus::CAABox& aabb) { x0_aabb = aabb; } From 232823ae697657cdb4651e4a9e03a0b9951dde7d Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 10 Apr 2020 15:03:31 -0400 Subject: [PATCH 039/224] Runtime/Graphics: Replace bitfield unions with constructor initializers --- Runtime/Graphics/CBooRenderer.cpp | 11 ++++++++++- Runtime/Graphics/CBooRenderer.hpp | 23 +++++++++-------------- Runtime/Graphics/CMoviePlayer.cpp | 10 ++++++---- Runtime/Graphics/CMoviePlayer.hpp | 14 ++++---------- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Runtime/Graphics/CBooRenderer.cpp b/Runtime/Graphics/CBooRenderer.cpp index a0f9b4f14..4b23e81da 100644 --- a/Runtime/Graphics/CBooRenderer.cpp +++ b/Runtime/Graphics/CBooRenderer.cpp @@ -681,7 +681,16 @@ void CBooRenderer::LoadBallFade() { } CBooRenderer::CBooRenderer(IObjectStore& store, IFactory& resFac) -: x8_factory(resFac), xc_store(store), x2a8_thermalRand(20) { +: x8_factory(resFac), xc_store(store), x2a8_thermalRand(20) +, x318_24_refectionDirty(false) +, x318_25_drawWireframe(false) +, x318_26_requestRGBA6(false) +, x318_27_currentRGBA6(false) +, x318_28_disableFog(false) +, x318_29_thermalVisor(false) +, x318_30_inAreaDraw(false) +, x318_31_persistRGBA6(false) +, m_thermalHotPass(false) { g_Renderer = this; xee_24_ = true; diff --git a/Runtime/Graphics/CBooRenderer.hpp b/Runtime/Graphics/CBooRenderer.hpp index 7c3016297..81e4e47cb 100644 --- a/Runtime/Graphics/CBooRenderer.hpp +++ b/Runtime/Graphics/CBooRenderer.hpp @@ -152,20 +152,15 @@ class CBooRenderer final : public IRenderer { // std::unique_ptr x314_phazonSuitMask; CPhazonSuitFilter m_phazonSuitFilter; - union { - struct { - bool x318_24_refectionDirty : 1; - bool x318_25_drawWireframe : 1; - bool x318_26_requestRGBA6 : 1; - bool x318_27_currentRGBA6 : 1; - bool x318_28_disableFog : 1; - bool x318_29_thermalVisor : 1; - bool x318_30_inAreaDraw : 1; - bool x318_31_persistRGBA6 : 1; - bool m_thermalHotPass : 1; - }; - u16 dummy = 0; - }; + bool x318_24_refectionDirty : 1; + bool x318_25_drawWireframe : 1; + bool x318_26_requestRGBA6 : 1; + bool x318_27_currentRGBA6 : 1; + bool x318_28_disableFog : 1; + bool x318_29_thermalVisor : 1; + bool x318_30_inAreaDraw : 1; + bool x318_31_persistRGBA6 : 1; + bool m_thermalHotPass : 1; void GenerateFogVolumeRampTex(boo::IGraphicsDataFactory::Context& ctx); void GenerateSphereRampTex(boo::IGraphicsDataFactory::Context& ctx); diff --git a/Runtime/Graphics/CMoviePlayer.cpp b/Runtime/Graphics/CMoviePlayer.cpp index f4af28744..6771971e0 100644 --- a/Runtime/Graphics/CMoviePlayer.cpp +++ b/Runtime/Graphics/CMoviePlayer.cpp @@ -140,10 +140,12 @@ u32 CMoviePlayer::THPAudioDecode(s16* buffer, const u8* audioFrame, bool stereo) } CMoviePlayer::CMoviePlayer(const char* path, float preLoadSeconds, bool loop, bool deinterlace) -: CDvdFile(path), xec_preLoadSeconds(preLoadSeconds) { - xf4_24_loop = loop; - m_deinterlace = deinterlace; - +: CDvdFile(path) +, xec_preLoadSeconds(preLoadSeconds) +, xf4_24_loop(loop) +, xf4_25_hasAudio(false) +, xf4_26_fieldFlip(false) +, m_deinterlace(deinterlace) { /* Read THP header information */ u8 buf[64]; SyncRead(buf, 64); diff --git a/Runtime/Graphics/CMoviePlayer.hpp b/Runtime/Graphics/CMoviePlayer.hpp index f32d47fe1..7d74267cf 100644 --- a/Runtime/Graphics/CMoviePlayer.hpp +++ b/Runtime/Graphics/CMoviePlayer.hpp @@ -99,21 +99,15 @@ private: float xe8_curSeconds = 0.f; float xec_preLoadSeconds; u32 xf0_preLoadFrames = 0; + bool xf4_24_loop : 1; + bool xf4_25_hasAudio : 1; + bool xf4_26_fieldFlip : 1; + bool m_deinterlace : 1; u32 xf8_ = 0; u32 xfc_fieldIndex = 0; std::unique_ptr m_yuvBuf; - union { - u32 m_dummy = 0; - struct { - bool xf4_24_loop : 1; - bool xf4_25_hasAudio : 1; - bool xf4_26_fieldFlip : 1; - bool m_deinterlace : 1; - }; - }; - specter::View::ViewBlock m_viewVertBlock; boo::ObjToken m_blockBuf; boo::ObjToken m_vertBuf; From e38a7f97bdd3ba4df032d7cdf4c6856c979da352 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 10 Apr 2020 15:11:10 -0400 Subject: [PATCH 040/224] Runtime/GuiSys: Replace bitfield unions with constructor initializers --- Runtime/GuiSys/CErrorOutputWindow.cpp | 1 + Runtime/GuiSys/CErrorOutputWindow.hpp | 15 +++++---------- Runtime/GuiSys/CGuiSliderGroup.cpp | 5 ++++- Runtime/GuiSys/CGuiSliderGroup.hpp | 11 +++-------- Runtime/GuiSys/CHudEnergyInterface.cpp | 13 ++++++------- Runtime/GuiSys/CHudEnergyInterface.hpp | 13 ++++--------- Runtime/GuiSys/CHudFreeLookInterface.cpp | 12 ++++++------ Runtime/GuiSys/CHudFreeLookInterface.hpp | 15 +++++---------- Runtime/GuiSys/CHudHelmetInterface.cpp | 11 ++++++----- Runtime/GuiSys/CHudHelmetInterface.hpp | 15 +++++---------- Runtime/GuiSys/CHudMissileInterface.cpp | 9 ++++----- Runtime/GuiSys/CHudMissileInterface.hpp | 15 +++++---------- 12 files changed, 54 insertions(+), 81 deletions(-) diff --git a/Runtime/GuiSys/CErrorOutputWindow.cpp b/Runtime/GuiSys/CErrorOutputWindow.cpp index 04596dd20..aae8942d9 100644 --- a/Runtime/GuiSys/CErrorOutputWindow.cpp +++ b/Runtime/GuiSys/CErrorOutputWindow.cpp @@ -5,6 +5,7 @@ namespace urde { CErrorOutputWindow::CErrorOutputWindow(bool flag) : CIOWin("Error Output Window") { + x18_24_ = false; x18_25_ = true; x18_26_ = true; x18_27_ = true; diff --git a/Runtime/GuiSys/CErrorOutputWindow.hpp b/Runtime/GuiSys/CErrorOutputWindow.hpp index 85b2231d6..b6088a9ba 100644 --- a/Runtime/GuiSys/CErrorOutputWindow.hpp +++ b/Runtime/GuiSys/CErrorOutputWindow.hpp @@ -11,16 +11,11 @@ public: private: State x14_state = State::Zero; - union { - struct { - bool x18_24_; - bool x18_25_; - bool x18_26_; - bool x18_27_; - bool x18_28_; - }; - u16 dummy = 0; - }; + bool x18_24_; + bool x18_25_; + bool x18_26_; + bool x18_27_; + bool x18_28_; const wchar_t* x1c_msg; public: diff --git a/Runtime/GuiSys/CGuiSliderGroup.cpp b/Runtime/GuiSys/CGuiSliderGroup.cpp index bdb3e49d7..74bbe0ff2 100644 --- a/Runtime/GuiSys/CGuiSliderGroup.cpp +++ b/Runtime/GuiSys/CGuiSliderGroup.cpp @@ -11,7 +11,10 @@ CGuiSliderGroup::CGuiSliderGroup(const CGuiWidgetParms& parms, float min, float , xbc_maxVal(max) , xc0_roundedCurVal(def) , xc4_curVal(def) -, xc8_increment(inc) {} +, xc8_increment(inc) +, xf4_24_inputPending(false) +, m_mouseInside(false) +, m_mouseDown(false) {} void CGuiSliderGroup::SetSelectionChangedCallback(std::function&& func) { xd8_changeCallback = std::move(func); diff --git a/Runtime/GuiSys/CGuiSliderGroup.hpp b/Runtime/GuiSys/CGuiSliderGroup.hpp index 3c13f783b..da3578d24 100644 --- a/Runtime/GuiSys/CGuiSliderGroup.hpp +++ b/Runtime/GuiSys/CGuiSliderGroup.hpp @@ -22,14 +22,9 @@ private: std::array xcc_sliderRangeWidgets{}; std::function xd8_changeCallback; EState xf0_state = EState::None; - union { - struct { - bool xf4_24_inputPending : 1; - mutable bool m_mouseInside : 1; - bool m_mouseDown : 1; - }; - u32 _dummy = 0; - }; + bool xf4_24_inputPending : 1; + mutable bool m_mouseInside : 1; + bool m_mouseDown : 1; mutable float m_mouseT = 0.f; diff --git a/Runtime/GuiSys/CHudEnergyInterface.cpp b/Runtime/GuiSys/CHudEnergyInterface.cpp index e664f2bed..8109e51de 100644 --- a/Runtime/GuiSys/CHudEnergyInterface.cpp +++ b/Runtime/GuiSys/CHudEnergyInterface.cpp @@ -27,12 +27,11 @@ CHudEnergyInterface::CHudEnergyInterface(CGuiFrame& selHud, float tankEnergy, in : x0_hudType(hudType) , xc_tankEnergy(tankEnergy) , x10_totalEnergyTanks(totalEnergyTanks) -, x14_numTanksFilled(numTanksFilled) { - x1c_24_ = true; - x1c_25_ = true; - x1c_26_barDirty = true; - x1c_27_energyLow = energyLow; - +, x14_numTanksFilled(numTanksFilled) +, x1c_24_(true) +, x1c_25_(true) +, x1c_26_barDirty(true) +, x1c_27_energyLow(energyLow) { x20_textpane_energydigits = static_cast(selHud.FindWidget("textpane_energydigits")); x24_meter_energytanks = static_cast(selHud.FindWidget("meter_energytanks")); x28_textpane_energywarning = static_cast(selHud.FindWidget("textpane_energywarning")); @@ -100,7 +99,7 @@ void CHudEnergyInterface::Update(float dt, float energyLowPulse) { x1c_26_barDirty = false; x18_cachedBarEnergy = x2c_energybart01_energybar->GetFilledEnergy(); std::string string = - fmt::format(fmt("{:02d}"), int(std::fmod(x18_cachedBarEnergy, CPlayerState::GetEnergyTankCapacity()))); + fmt::format(fmt("{:02d}"), int(std::fmod(x18_cachedBarEnergy, CPlayerState::GetEnergyTankCapacity()))); x20_textpane_energydigits->TextSupport().SetText(string); } diff --git a/Runtime/GuiSys/CHudEnergyInterface.hpp b/Runtime/GuiSys/CHudEnergyInterface.hpp index 2c2fda089..7ad71557b 100644 --- a/Runtime/GuiSys/CHudEnergyInterface.hpp +++ b/Runtime/GuiSys/CHudEnergyInterface.hpp @@ -19,15 +19,10 @@ class CHudEnergyInterface { int x10_totalEnergyTanks; int x14_numTanksFilled; float x18_cachedBarEnergy = 0.f; - union { - struct { - bool x1c_24_ : 1; - bool x1c_25_ : 1; - bool x1c_26_barDirty : 1; - bool x1c_27_energyLow : 1; - }; - u16 _dummy = 0; - }; + bool x1c_24_ : 1; + bool x1c_25_ : 1; + bool x1c_26_barDirty : 1; + bool x1c_27_energyLow : 1; CGuiTextPane* x20_textpane_energydigits; CAuiMeter* x24_meter_energytanks; CGuiTextPane* x28_textpane_energywarning; diff --git a/Runtime/GuiSys/CHudFreeLookInterface.cpp b/Runtime/GuiSys/CHudFreeLookInterface.cpp index 75d86e18b..94a6395f5 100644 --- a/Runtime/GuiSys/CHudFreeLookInterface.cpp +++ b/Runtime/GuiSys/CHudFreeLookInterface.cpp @@ -8,12 +8,12 @@ namespace urde { CHudFreeLookInterface::CHudFreeLookInterface(CGuiFrame& selHud, EHudType hudType, bool inFreeLook, bool lookControlHeld, bool lockedOnObj) -: x4_hudType(hudType) { - x70_24_inFreeLook = inFreeLook; - x70_25_lookControlHeld = lookControlHeld; - x70_26_lockedOnObj = lockedOnObj; - x70_27_visibleDebug = true; - x70_28_visibleGame = true; +: x4_hudType(hudType) +, x70_24_inFreeLook(inFreeLook) +, x70_25_lookControlHeld(lookControlHeld) +, x70_26_lockedOnObj(lockedOnObj) +, x70_27_visibleDebug(true) +, x70_28_visibleGame(true) { x6c_lockOnInterp = (lockedOnObj && hudType == EHudType::Scan) ? 0.f : 1.f; x74_basewidget_freelookleft = selHud.FindWidget("basewidget_freelookleft"); diff --git a/Runtime/GuiSys/CHudFreeLookInterface.hpp b/Runtime/GuiSys/CHudFreeLookInterface.hpp index fedc6931b..d9d41bea1 100644 --- a/Runtime/GuiSys/CHudFreeLookInterface.hpp +++ b/Runtime/GuiSys/CHudFreeLookInterface.hpp @@ -24,16 +24,11 @@ class CHudFreeLookInterface : public IFreeLookInterface { zeus::CTransform x38_freeLookRightXf; float x68_freeLookInterp = 0.f; float x6c_lockOnInterp; - union { - struct { - bool x70_24_inFreeLook : 1; - bool x70_25_lookControlHeld : 1; - bool x70_26_lockedOnObj : 1; - bool x70_27_visibleDebug : 1; - bool x70_28_visibleGame : 1; - }; - u16 _dummy = 0; - }; + bool x70_24_inFreeLook : 1; + bool x70_25_lookControlHeld : 1; + bool x70_26_lockedOnObj : 1; + bool x70_27_visibleDebug : 1; + bool x70_28_visibleGame : 1; CGuiWidget* x74_basewidget_freelookleft; CGuiModel* x78_model_shieldleft; CGuiModel* x7c_model_freelookleft; diff --git a/Runtime/GuiSys/CHudHelmetInterface.cpp b/Runtime/GuiSys/CHudHelmetInterface.cpp index 963ab114d..a9a915e52 100644 --- a/Runtime/GuiSys/CHudHelmetInterface.cpp +++ b/Runtime/GuiSys/CHudHelmetInterface.cpp @@ -7,11 +7,12 @@ namespace urde { -CHudHelmetInterface::CHudHelmetInterface(CGuiFrame& helmetFrame) { - x3c_24_helmetVisibleDebug = true; - x3c_25_helmetVisibleGame = true; - x3c_26_glowVisibleDebug = true; - x3c_27_glowVisibleGame = true; +CHudHelmetInterface::CHudHelmetInterface(CGuiFrame& helmetFrame) +: x3c_24_helmetVisibleDebug(true) +, x3c_25_helmetVisibleGame(true) +, x3c_26_glowVisibleDebug(true) +, x3c_27_glowVisibleGame(true) +, x3c_28_hudLagDirty(false) { x40_camera = helmetFrame.GetFrameCamera(); x44_BaseWidget_Pivot = helmetFrame.FindWidget("BaseWidget_Pivot"); x48_BaseWidget_Helmet = helmetFrame.FindWidget("BaseWidget_Helmet"); diff --git a/Runtime/GuiSys/CHudHelmetInterface.hpp b/Runtime/GuiSys/CHudHelmetInterface.hpp index 534f02fce..0046f540c 100644 --- a/Runtime/GuiSys/CHudHelmetInterface.hpp +++ b/Runtime/GuiSys/CHudHelmetInterface.hpp @@ -12,16 +12,11 @@ class CHudHelmetInterface { zeus::CMatrix3f x0_hudLagRotation; zeus::CVector3f x24_pivotPosition; zeus::CVector3f x30_hudLagPosition; - union { - struct { - bool x3c_24_helmetVisibleDebug : 1; - bool x3c_25_helmetVisibleGame : 1; - bool x3c_26_glowVisibleDebug : 1; - bool x3c_27_glowVisibleGame : 1; - bool x3c_28_hudLagDirty : 1; - }; - u16 _dummy = 0; - }; + bool x3c_24_helmetVisibleDebug : 1; + bool x3c_25_helmetVisibleGame : 1; + bool x3c_26_glowVisibleDebug : 1; + bool x3c_27_glowVisibleGame : 1; + bool x3c_28_hudLagDirty : 1; CGuiCamera* x40_camera; CGuiWidget* x44_BaseWidget_Pivot; CGuiWidget* x48_BaseWidget_Helmet; diff --git a/Runtime/GuiSys/CHudMissileInterface.cpp b/Runtime/GuiSys/CHudMissileInterface.cpp index 36b900a22..6e42b974e 100644 --- a/Runtime/GuiSys/CHudMissileInterface.cpp +++ b/Runtime/GuiSys/CHudMissileInterface.cpp @@ -26,11 +26,10 @@ CHudMissileInterface::CHudMissileInterface(CGuiFrame& selHud, int missileCapacit : x0_hudType(hudType) , x4_missileCapacity(missileCapacity) , x8_numMissles(numMissiles) -, x4c_chargeBeamFactor(chargeFactor) { - x58_24_missilesActive = missilesActive; - x58_25_visibleDebug = true; - x58_26_visibleGame = true; - +, x4c_chargeBeamFactor(chargeFactor) +, x58_24_missilesActive(missilesActive) +, x58_25_visibleDebug(true) +, x58_26_visibleGame(true) { x5c_basewidget_missileicon = selHud.FindWidget("basewidget_missileicon"); x60_textpane_missiledigits = static_cast(selHud.FindWidget("textpane_missiledigits")); x64_energybart01_missilebar = static_cast(selHud.FindWidget("energybart01_missilebar")); diff --git a/Runtime/GuiSys/CHudMissileInterface.hpp b/Runtime/GuiSys/CHudMissileInterface.hpp index df21193ec..da8753dfa 100644 --- a/Runtime/GuiSys/CHudMissileInterface.hpp +++ b/Runtime/GuiSys/CHudMissileInterface.hpp @@ -26,16 +26,11 @@ class CHudMissileInterface { float x4c_chargeBeamFactor; float x50_missileIconAltDeplete = 0.f; float x54_missileIconIncrement = 0.f; - union { - struct { - bool x58_24_missilesActive : 1; - bool x58_25_visibleDebug : 1; - bool x58_26_visibleGame : 1; - bool x58_27_hasArrows : 1; - bool x58_28_notXRay : 1; - }; - u16 _dummy = 0; - }; + bool x58_24_missilesActive : 1; + bool x58_25_visibleDebug : 1; + bool x58_26_visibleGame : 1; + bool x58_27_hasArrows : 1; + bool x58_28_notXRay : 1; CGuiWidget* x5c_basewidget_missileicon; CGuiTextPane* x60_textpane_missiledigits; CAuiEnergyBarT01* x64_energybart01_missilebar; From d23e76db541710bbb8787920803f5e863bf8fc8e Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 10 Apr 2020 15:12:46 -0400 Subject: [PATCH 041/224] Runtime/Input: Replace bitfield unions with constructor initializers --- Runtime/Input/CRumbleVoice.hpp | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/Runtime/Input/CRumbleVoice.hpp b/Runtime/Input/CRumbleVoice.hpp index 719aab552..b0dd7978a 100644 --- a/Runtime/Input/CRumbleVoice.hpp +++ b/Runtime/Input/CRumbleVoice.hpp @@ -32,15 +32,10 @@ struct SAdsrData { float xc_decayDur = 0.f; float x10_sustainGain = 0.f; float x14_releaseDur = 0.f; - union { - struct { - bool x18_24_hasSustain : 1; - bool x18_25_autoRelease : 1; - }; - u32 dummy = 0; - }; + bool x18_24_hasSustain : 1; + bool x18_25_autoRelease : 1; - constexpr SAdsrData() noexcept { x18_24_hasSustain = false; x18_25_autoRelease = false; }; + constexpr SAdsrData() noexcept : x18_24_hasSustain(false), x18_25_autoRelease(false) {} constexpr SAdsrData(float attackGain, float autoReleaseDur, float attackDur, float decayDur, float sustainGain, float releaseDur, bool hasSustain, bool autoRelease) noexcept : x0_attackGain(attackGain) @@ -48,10 +43,9 @@ struct SAdsrData { , x8_attackDur(attackDur) , xc_decayDur(decayDur) , x10_sustainGain(sustainGain) - , x14_releaseDur(releaseDur) { - x18_24_hasSustain = hasSustain; - x18_25_autoRelease = autoRelease; - } + , x14_releaseDur(releaseDur) + , x18_24_hasSustain(hasSustain) + , x18_25_autoRelease(autoRelease) {} }; struct SAdsrDelta { From 402e45ecb52955f4cca796398a003b5aa764f2db Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 10 Apr 2020 15:25:40 -0400 Subject: [PATCH 042/224] Runtime/MP1: Replace bitfield unions with constructor initializers --- Runtime/MP1/CFrontEndUI.cpp | 3 +-- Runtime/MP1/CFrontEndUI.hpp | 9 ++------- Runtime/MP1/CInGameGuiManager.cpp | 9 +++++---- Runtime/MP1/CInGameGuiManager.hpp | 14 ++++---------- Runtime/MP1/CLogBookScreen.cpp | 6 ++++-- Runtime/MP1/CLogBookScreen.hpp | 22 +++++++++------------ Runtime/MP1/CMFGame.cpp | 14 +++++++++----- Runtime/MP1/CMFGame.hpp | 19 ++++-------------- Runtime/MP1/CPauseScreenBase.cpp | 19 +++++++++++++++--- Runtime/MP1/CPauseScreenBase.hpp | 32 ++++++++++++++----------------- Runtime/MP1/CPauseScreenBlur.cpp | 5 ++--- Runtime/MP1/CPauseScreenBlur.hpp | 10 +++------- Runtime/MP1/CPlayMovie.cpp | 8 +++++++- Runtime/MP1/CPlayMovie.hpp | 14 +++++--------- Runtime/MP1/CSamusDoll.cpp | 12 +++++++++--- Runtime/MP1/CSamusDoll.hpp | 21 ++++++++------------ Runtime/MP1/CSamusHud.cpp | 6 ++++-- Runtime/MP1/CSamusHud.hpp | 15 ++++----------- Runtime/MP1/CSlideShow.cpp | 20 +++++++++++++------ Runtime/MP1/CSlideShow.hpp | 24 +++++++++-------------- Runtime/MP1/MP1.cpp | 12 +++++++++++- Runtime/MP1/MP1.hpp | 23 +++++++++------------- 22 files changed, 153 insertions(+), 164 deletions(-) diff --git a/Runtime/MP1/CFrontEndUI.cpp b/Runtime/MP1/CFrontEndUI.cpp index 6fedaf6f3..9da2e65db 100644 --- a/Runtime/MP1/CFrontEndUI.cpp +++ b/Runtime/MP1/CFrontEndUI.cpp @@ -1412,10 +1412,9 @@ void CFrontEndUI::SNesEmulatorFrame::Draw(CSaveGameScreen* saveUi) const { } } -CFrontEndUI::SOptionsFrontEndFrame::SOptionsFrontEndFrame() { +CFrontEndUI::SOptionsFrontEndFrame::SOptionsFrontEndFrame() : x134_24_visible(true), x134_25_exitOptions(false) { x4_frme = g_SimplePool->GetObj("FRME_OptionsFrontEnd"); x10_pauseScreen = g_SimplePool->GetObj("STRG_PauseScreen"); - x134_24_visible = true; } void CFrontEndUI::SOptionsFrontEndFrame::DoSliderChange(CGuiSliderGroup* caller, float value) { diff --git a/Runtime/MP1/CFrontEndUI.hpp b/Runtime/MP1/CFrontEndUI.hpp index b1c2aac75..046f0522a 100644 --- a/Runtime/MP1/CFrontEndUI.hpp +++ b/Runtime/MP1/CFrontEndUI.hpp @@ -279,13 +279,8 @@ public: float x38_rowPitch = 0.f; CSfxHandle x3c_sliderSfx; CRumbleGenerator x40_rumbleGen; - union { - u8 _dummy = 0; - struct { - bool x134_24_visible : 1; - bool x134_25_exitOptions : 1; - }; - }; + bool x134_24_visible : 1; + bool x134_25_exitOptions : 1; std::unique_ptr m_touchBar; bool m_touchBarInValue = false; diff --git a/Runtime/MP1/CInGameGuiManager.cpp b/Runtime/MP1/CInGameGuiManager.cpp index effe4dd60..31a4dd461 100644 --- a/Runtime/MP1/CInGameGuiManager.cpp +++ b/Runtime/MP1/CInGameGuiManager.cpp @@ -178,7 +178,11 @@ CInGameGuiManager::CInGameGuiManager(CStateManager& stateMgr, CArchitectureQueue , x1c_rand(1234) , x20_faceplateDecor(stateMgr) , x50_deathDot(g_SimplePool->GetObj("TXTR_DeathDot")) -, x5c_pauseScreenDGRPs(LockPauseScreenDependencies()) { +, x5c_pauseScreenDGRPs(LockPauseScreenDependencies()) +, x1f8_24_(false) +, x1f8_25_playerAlive(true) +, x1f8_26_deferTransition(false) +, x1f8_27_exitSaveUI(true) { x1e0_helmetVisMode = g_tweakGui->GetHelmetVisMode(); x1e4_enableTargetingManager = g_tweakGui->GetEnableTargetingManager(); x1e8_enableAutoMapper = g_tweakGui->GetEnableAutoMapper(); @@ -187,9 +191,6 @@ CInGameGuiManager::CInGameGuiManager(CStateManager& stateMgr, CArchitectureQueue x1f4_visorStaticAlpha = stateMgr.GetPlayer().GetVisorStaticAlpha(); - x1f8_25_playerAlive = true; - x1f8_27_exitSaveUI = true; - xc8_inGameGuiDGRPs.reserve(InGameGuiDGRPs.size()); for (const char* const dgrp : InGameGuiDGRPs) { xc8_inGameGuiDGRPs.emplace_back(g_SimplePool->GetObj(dgrp)); diff --git a/Runtime/MP1/CInGameGuiManager.hpp b/Runtime/MP1/CInGameGuiManager.hpp index 76ba934f2..3009e4d34 100644 --- a/Runtime/MP1/CInGameGuiManager.hpp +++ b/Runtime/MP1/CInGameGuiManager.hpp @@ -95,6 +95,10 @@ private: EHudVisMode x1ec_hudVisMode; u32 x1f0_enablePlayerVisor; float x1f4_visorStaticAlpha; + bool x1f8_24_ : 1; + bool x1f8_25_playerAlive : 1; + bool x1f8_26_deferTransition : 1; + bool x1f8_27_exitSaveUI : 1; std::optional m_deathRenderTexQuad; std::optional m_deathDotQuad; @@ -102,16 +106,6 @@ private: CColoredQuadFilter m_deathWhiteout{EFilterType::Blend}; CColoredQuadFilter m_deathBlackout{EFilterType::Blend}; - union { - struct { - bool x1f8_24_ : 1; - bool x1f8_25_playerAlive : 1; - bool x1f8_26_deferTransition : 1; - bool x1f8_27_exitSaveUI : 1; - }; - u32 _dummy = 0; - }; - static std::vector> LockPauseScreenDependencies(); bool CheckDGRPLoadComplete() const; void BeginStateTransition(EInGameGuiState state, CStateManager& stateMgr); diff --git a/Runtime/MP1/CLogBookScreen.cpp b/Runtime/MP1/CLogBookScreen.cpp index e665c0c16..e4dc73fff 100644 --- a/Runtime/MP1/CLogBookScreen.cpp +++ b/Runtime/MP1/CLogBookScreen.cpp @@ -14,7 +14,10 @@ namespace urde::MP1 { CLogBookScreen::CLogBookScreen(const CStateManager& mgr, CGuiFrame& frame, const CStringTable& pauseStrg) -: CPauseScreenBase(mgr, frame, pauseStrg, true) { +: CPauseScreenBase(mgr, frame, pauseStrg, true) +, x260_24_loaded(false) +, x260_25_inTextScroll(false) +, x260_26_exitTextScroll(false) { x19c_scanCompletes.resize(5); x200_viewScans.resize(5); x258_artifactDoll = std::make_unique(); @@ -177,7 +180,6 @@ bool CLogBookScreen::IsScanCategoryReady(CSaveWorld::EScanCategory category) con }); } - void CLogBookScreen::UpdateBodyText() { if (x10_mode != EMode::TextScroll) { x174_textpane_body->TextSupport().SetText(u""); diff --git a/Runtime/MP1/CLogBookScreen.hpp b/Runtime/MP1/CLogBookScreen.hpp index 8b2892b7b..f782faf0f 100644 --- a/Runtime/MP1/CLogBookScreen.hpp +++ b/Runtime/MP1/CLogBookScreen.hpp @@ -13,7 +13,7 @@ namespace urde { class CPlayerState; class CScannableObjectInfo; class CStringTable; -} +} // namespace urde namespace urde::MP1 { class CArtifactDoll; @@ -25,18 +25,14 @@ class CLogBookScreen : public CPauseScreenBase { x200_viewScans; float x254_viewInterp = 0.f; std::unique_ptr x258_artifactDoll; - - enum class ELeavePauseState { InPause = 0, LeavingPause = 1, LeftPause = 2 }; - - ELeavePauseState x25c_leavePauseState = ELeavePauseState::InPause; - union { - struct { - bool x260_24_loaded : 1; - bool x260_25_inTextScroll : 1; - bool x260_26_exitTextScroll : 1; - }; - s32 _dummy = 0; - }; + enum class ELeavePauseState { + InPause = 0, + LeavingPause = 1, + LeftPause = 2 + } x25c_leavePauseState = ELeavePauseState::InPause; + bool x260_24_loaded : 1; + bool x260_25_inTextScroll : 1; + bool x260_26_exitTextScroll : 1; void InitializeLogBook(); void UpdateRightTitles(); diff --git a/Runtime/MP1/CMFGame.cpp b/Runtime/MP1/CMFGame.cpp index affd3f57e..1691b80f7 100644 --- a/Runtime/MP1/CMFGame.cpp +++ b/Runtime/MP1/CMFGame.cpp @@ -14,13 +14,16 @@ namespace urde::MP1 { CMFGame::CMFGame(const std::weak_ptr& stateMgr, const std::weak_ptr& guiMgr, const CArchitectureQueue&) -: CMFGameBase("CMFGame"), x14_stateManager(stateMgr.lock()), x18_guiManager(guiMgr.lock()) { - x2a_25_samusAlive = true; +: CMFGameBase("CMFGame") +, x14_stateManager(stateMgr.lock()) +, x18_guiManager(guiMgr.lock()) +, x2a_24_initialized(false) +, x2a_25_samusAlive(true) { static_cast(*g_Main).SetMFGameBuilt(true); } CMFGame::~CMFGame() { - CMain& main = static_cast(*g_Main); + auto& main = static_cast(*g_Main); main.SetMFGameBuilt(false); main.SetScreenFading(false); CDecalManager::Reinitialize(); @@ -253,8 +256,9 @@ void CMFGame::EnterMapScreen() { x14_stateManager->SetInMapScreen(true); } -CMFGameLoader::CMFGameLoader() : CMFGameLoaderBase("CMFGameLoader") { - CMain* m = static_cast(g_Main); +CMFGameLoader::CMFGameLoader() +: CMFGameLoaderBase("CMFGameLoader"), x2c_24_initialized(false), x2c_25_transitionFinished(false) { + auto* m = static_cast(g_Main); switch (m->GetFlowState()) { case EFlowState::Default: case EFlowState::StateSetter: { diff --git a/Runtime/MP1/CMFGame.hpp b/Runtime/MP1/CMFGame.hpp index fe7d70ca3..d491089b1 100644 --- a/Runtime/MP1/CMFGame.hpp +++ b/Runtime/MP1/CMFGame.hpp @@ -23,13 +23,8 @@ class CMFGame : public CMFGameBase { float x20_cineSkipTime; u32 x24_ = 0; TUniqueId x28_skippedCineCam = kInvalidUniqueId; - union { - struct { - bool x2a_24_initialized : 1; - bool x2a_25_samusAlive : 1; - }; - u8 _dummy = 0; - }; + bool x2a_24_initialized : 1; + bool x2a_25_samusAlive : 1; CColoredQuadFilter m_fadeToBlack{EFilterType::Multiply}; @@ -57,14 +52,8 @@ class CMFGameLoader : public CMFGameLoaderBase { std::shared_ptr x14_stateMgr; std::shared_ptr x18_guiMgr; std::vector x1c_loadList; - - union { - struct { - bool x2c_24_initialized : 1; - bool x2c_25_transitionFinished : 1; - }; - u8 _dummy = 0; - }; + bool x2c_24_initialized : 1; + bool x2c_25_transitionFinished : 1; void MakeLoadDependencyList(); diff --git a/Runtime/MP1/CPauseScreenBase.cpp b/Runtime/MP1/CPauseScreenBase.cpp index 1f9e662c8..f8d4adde5 100644 --- a/Runtime/MP1/CPauseScreenBase.cpp +++ b/Runtime/MP1/CPauseScreenBase.cpp @@ -18,9 +18,22 @@ namespace urde::MP1 { CPauseScreenBase::CPauseScreenBase(const CStateManager& mgr, CGuiFrame& frame, const CStringTable& pauseStrg, bool isLogBook) -: x4_mgr(mgr), x8_frame(frame), xc_pauseStrg(pauseStrg) { - m_isLogBook = isLogBook; - m_playRightTableSfx = true; +: x4_mgr(mgr) +, x8_frame(frame) +, xc_pauseStrg(pauseStrg) +, x198_24_ready(false) +, x198_25_handledInput(false) +, x198_26_exitPauseScreen(false) +, x198_27_canDraw(false) +, x198_28_pulseTextArrowTop(false) +, x198_29_pulseTextArrowBottom(false) +, m_isLogBook(isLogBook) +, m_bodyUpClicked(false) +, m_bodyDownClicked(false) +, m_bodyClicked(false) +, m_leftClicked(false) +, m_rightClicked(false) +, m_playRightTableSfx(true) { InitializeFrameGlue(); } diff --git a/Runtime/MP1/CPauseScreenBase.hpp b/Runtime/MP1/CPauseScreenBase.hpp index 7b9937143..95178d5e2 100644 --- a/Runtime/MP1/CPauseScreenBase.hpp +++ b/Runtime/MP1/CPauseScreenBase.hpp @@ -74,24 +74,20 @@ protected: CGuiSliderGroup* x18c_slidergroup_slider = nullptr; CGuiTableGroup* x190_tablegroup_double = nullptr; CGuiTableGroup* x194_tablegroup_triple = nullptr; - union { - struct { - bool x198_24_ready : 1; - bool x198_25_handledInput : 1; - bool x198_26_exitPauseScreen : 1; - bool x198_27_canDraw : 1; - bool x198_28_pulseTextArrowTop : 1; - bool x198_29_pulseTextArrowBottom : 1; - bool m_isLogBook : 1; - bool m_bodyUpClicked : 1; - bool m_bodyDownClicked : 1; - bool m_bodyClicked : 1; - bool m_leftClicked : 1; - bool m_rightClicked : 1; - bool m_playRightTableSfx : 1; - }; - u32 _dummy = 0; - }; + bool x198_24_ready : 1; + bool x198_25_handledInput : 1; + bool x198_26_exitPauseScreen : 1; + bool x198_27_canDraw : 1; + bool x198_28_pulseTextArrowTop : 1; + bool x198_29_pulseTextArrowBottom : 1; + bool m_isLogBook : 1; + bool m_bodyUpClicked : 1; + bool m_bodyDownClicked : 1; + bool m_bodyClicked : 1; + bool m_leftClicked : 1; + bool m_rightClicked : 1; + bool m_playRightTableSfx : 1; + void InitializeFrameGlue(); void ChangeMode(EMode mode, bool playSfx = true); void UpdateSideTable(CGuiTableGroup* table); diff --git a/Runtime/MP1/CPauseScreenBlur.cpp b/Runtime/MP1/CPauseScreenBlur.cpp index 37dbacbef..f750dba69 100644 --- a/Runtime/MP1/CPauseScreenBlur.cpp +++ b/Runtime/MP1/CPauseScreenBlur.cpp @@ -6,9 +6,8 @@ namespace urde::MP1 { -CPauseScreenBlur::CPauseScreenBlur() : x4_mapLightQuarter(g_SimplePool->GetObj("TXTR_MapLightQuarter")) { - x50_25_gameDraw = true; -} +CPauseScreenBlur::CPauseScreenBlur() +: x4_mapLightQuarter(g_SimplePool->GetObj("TXTR_MapLightQuarter")), x50_24_blurring(false), x50_25_gameDraw(true) {} void CPauseScreenBlur::OnNewInGameGuiState(EInGameGuiState state, CStateManager& stateMgr) { switch (state) { diff --git a/Runtime/MP1/CPauseScreenBlur.hpp b/Runtime/MP1/CPauseScreenBlur.hpp index e96b2eafc..69a7e4951 100644 --- a/Runtime/MP1/CPauseScreenBlur.hpp +++ b/Runtime/MP1/CPauseScreenBlur.hpp @@ -20,16 +20,12 @@ class CPauseScreenBlur { EState x14_nextState = EState::InGame; float x18_blurAmt = 0.f; CCameraBlurPass x1c_camBlur; + bool x50_24_blurring : 1; + bool x50_25_gameDraw : 1; + CTexturedQuadFilter m_quarterFilter{EFilterType::Multiply, x4_mapLightQuarter}; CScanLinesFilterEven m_linesFilter{EFilterType::Multiply}; - union { - struct { - bool x50_24_blurring : 1; - bool x50_25_gameDraw : 1; - }; - u32 _dummy = 0; - }; void OnBlurComplete(bool); void SetState(EState state); diff --git a/Runtime/MP1/CPlayMovie.cpp b/Runtime/MP1/CPlayMovie.cpp index fcffdaf28..9d9494fc8 100644 --- a/Runtime/MP1/CPlayMovie.cpp +++ b/Runtime/MP1/CPlayMovie.cpp @@ -8,7 +8,13 @@ const char* kMovies[] = {"Video/wingame.thp", "Video/wingame_best.thp", " bool CPlayMovie::IsResultsScreen(EWhichMovie which) { return int(which) <= 2; } -CPlayMovie::CPlayMovie(EWhichMovie which) : CPlayMovieBase("CPlayMovie", kMovies[int(which)]), x18_which(which) { +CPlayMovie::CPlayMovie(EWhichMovie which) +: CPlayMovieBase("CPlayMovie", kMovies[int(which)]) +, x18_which(which) +, x78_24_(false) +, x78_25_(false) +, x78_26_resultsScreen(false) +, x78_27_(false) { (void)x18_which; } diff --git a/Runtime/MP1/CPlayMovie.hpp b/Runtime/MP1/CPlayMovie.hpp index f881461e1..8e40a9f85 100644 --- a/Runtime/MP1/CPlayMovie.hpp +++ b/Runtime/MP1/CPlayMovie.hpp @@ -20,15 +20,11 @@ public: private: EWhichMovie x18_which; - union { - struct { - bool x78_24_ : 1; - bool x78_25_ : 1; - bool x78_26_resultsScreen : 1; - bool x78_27_ : 1; - }; - u16 _dummy = 0; - }; + bool x78_24_ : 1; + bool x78_25_ : 1; + bool x78_26_resultsScreen : 1; + bool x78_27_ : 1; + static bool IsResultsScreen(EWhichMovie which); public: diff --git a/Runtime/MP1/CSamusDoll.cpp b/Runtime/MP1/CSamusDoll.cpp index a4ca9f2cb..74fbbd177 100644 --- a/Runtime/MP1/CSamusDoll.cpp +++ b/Runtime/MP1/CSamusDoll.cpp @@ -98,7 +98,15 @@ CSamusDoll::CSamusDoll(const CDependencyGroup& suitDgrp, const CDependencyGroup& bool hasGrappleBeam) : x10_ballXf(zeus::CTransform::Translate(0.f, 0.f, 0.625f * g_tweakPlayer->GetPlayerBallHalfExtent())) , x44_suit(suit) -, x48_beam(beam) { +, x48_beam(beam) +, x270_24_hasSpiderBall(hasSpiderBall) +, x270_25_hasGrappleBeam(hasGrappleBeam) +, x270_26_pulseSuit(false) +, x270_27_pulseBeam(false) +, x270_28_pulseGrapple(false) +, x270_29_pulseBoots(false) +, x270_30_pulseVisor(false) +, x270_31_loaded(false) { x70_fixedRot.rotateZ(M_PIF); x90_userInterpRot = xb0_userRot = x70_fixedRot; x1d4_spiderBallGlass = g_SimplePool->GetObj(SpiderBallGlassModels[size_t(suit)].first); @@ -115,8 +123,6 @@ CSamusDoll::CSamusDoll(const CDependencyGroup& suitDgrp, const CDependencyGroup& x230_ballTransitionFlash = g_SimplePool->GetObj("MorphBallTransitionFlash"); x23c_lights.push_back(CLight::BuildDirectional(zeus::skForward, zeus::skWhite)); x24c_actorLights = std::make_unique(8, zeus::skZero3f, 4, 4, false, false, false, 0.1f); - x270_24_hasSpiderBall = hasSpiderBall; - x270_25_hasGrappleBeam = hasGrappleBeam; x22c_ballInnerGlowGen->SetGlobalScale(zeus::CVector3f(0.625f)); x0_depToks.reserve(suitDgrp.GetObjectTagVector().size() + ballDgrp.GetObjectTagVector().size()); for (const SObjectTag& tag : suitDgrp.GetObjectTagVector()) { diff --git a/Runtime/MP1/CSamusDoll.hpp b/Runtime/MP1/CSamusDoll.hpp index ac0ddd645..6833a75e6 100644 --- a/Runtime/MP1/CSamusDoll.hpp +++ b/Runtime/MP1/CSamusDoll.hpp @@ -71,19 +71,14 @@ class CSamusDoll { CSfxHandle x264_offsetSfx; CSfxHandle x268_rotateSfx; CSfxHandle x26c_zoomSfx; - union { - struct { - bool x270_24_hasSpiderBall : 1; - bool x270_25_hasGrappleBeam : 1; - bool x270_26_pulseSuit : 1; - bool x270_27_pulseBeam : 1; - bool x270_28_pulseGrapple : 1; - bool x270_29_pulseBoots : 1; - bool x270_30_pulseVisor : 1; - bool x270_31_loaded : 1; - }; - u32 _dummy = 0; - }; + bool x270_24_hasSpiderBall : 1; + bool x270_25_hasGrappleBeam : 1; + bool x270_26_pulseSuit : 1; + bool x270_27_pulseBeam : 1; + bool x270_28_pulseGrapple : 1; + bool x270_29_pulseBoots : 1; + bool x270_30_pulseVisor : 1; + bool x270_31_loaded : 1; static constexpr zeus::CVector3f skInitialOffset{0.0f, 0.0f, 0.8f}; static CModelData BuildSuitModelData1(CPlayerState::EPlayerSuit suit); diff --git a/Runtime/MP1/CSamusHud.cpp b/Runtime/MP1/CSamusHud.cpp index 5681b8c86..8d003aa98 100644 --- a/Runtime/MP1/CSamusHud.cpp +++ b/Runtime/MP1/CSamusHud.cpp @@ -23,9 +23,11 @@ CSamusHud::CSamusHud(CStateManager& stateMgr) : x8_targetingMgr(stateMgr) , x258_frmeHelmet(g_SimplePool->GetObj("FRME_Helmet")) , x268_frmeBaseHud(g_SimplePool->GetObj("FRME_BaseHud")) +, x2e0_24_inFreeLook(false) +, x2e0_25_lookControlHeld(false) +, x2e0_26_latestFirstPerson(true) +, x2e0_27_energyLow(stateMgr.GetPlayer().IsEnergyLow(stateMgr)) , m_energyDrainFilter(g_tweakGui->GetEnergyDrainFilterAdditive() ? EFilterType::Add : EFilterType::Blend) { - x2e0_26_latestFirstPerson = true; - x2e0_27_energyLow = stateMgr.GetPlayer().IsEnergyLow(stateMgr); x33c_lights = std::make_unique(8, zeus::skZero3f, 4, 1, true, 0, 0, 0.1f); x340_hudLights.resize(3, SCachedHudLight(zeus::skZero3f, zeus::skWhite, 0.f, 0.f, 0.f, 0.f)); x46c_.resize(3); diff --git a/Runtime/MP1/CSamusHud.hpp b/Runtime/MP1/CSamusHud.hpp index 47baf9248..c140ba43d 100644 --- a/Runtime/MP1/CSamusHud.hpp +++ b/Runtime/MP1/CSamusHud.hpp @@ -95,17 +95,10 @@ class CSamusHud { u32 x2d4_totalEnergyTanks = 0; u32 x2d8_missileAmount = 0; u32 x2dc_missileCapacity = 0; - - union { - struct { - bool x2e0_24_inFreeLook : 1; - bool x2e0_25_lookControlHeld : 1; - bool x2e0_26_latestFirstPerson : 1; - bool x2e0_27_energyLow : 1; - }; - u16 _dummy = 0; - }; - + bool x2e0_24_inFreeLook : 1; + bool x2e0_25_lookControlHeld : 1; + bool x2e0_26_latestFirstPerson : 1; + bool x2e0_27_energyLow : 1; u32 x2e4_ = 0; u32 x2e8_ = 0; CPlayerGun::EMissleMode x2ec_missileMode = CPlayerGun::EMissleMode::Inactive; diff --git a/Runtime/MP1/CSlideShow.cpp b/Runtime/MP1/CSlideShow.cpp index 40b0d9571..9c588f7cd 100644 --- a/Runtime/MP1/CSlideShow.cpp +++ b/Runtime/MP1/CSlideShow.cpp @@ -6,12 +6,20 @@ namespace urde { -CSlideShow::CSlideShow() : CIOWin("SlideShow"), x5c_slideA(*this), x90_slideB(*this) { - x130_ = g_tweakSlideShow->GetX54(); - x134_24_ = true; - x134_30_ = true; - x135_24_ = true; - +CSlideShow::CSlideShow() +: CIOWin("SlideShow") +, x5c_slideA(*this) +, x90_slideB(*this) +, x130_(g_tweakSlideShow->GetX54()) +, x134_24_(true) +, x134_25_(false) +, x134_26_(false) +, x134_27_(false) +, x134_28_disableInput(false) +, x134_29_(false) +, x134_30_(true) +, x134_31_(false) +, x135_24_(true) { const SObjectTag* font = g_ResFactory->GetResourceIdByName(g_tweakSlideShow->GetFont()); if (font) { CGuiTextProperties propsA(false, true, EJustification::Center, EVerticalJustification::Bottom); diff --git a/Runtime/MP1/CSlideShow.hpp b/Runtime/MP1/CSlideShow.hpp index 11087684f..20bed1176 100644 --- a/Runtime/MP1/CSlideShow.hpp +++ b/Runtime/MP1/CSlideShow.hpp @@ -87,21 +87,15 @@ private: float x12c_ = 32.f; */ float x130_; - - union { - struct { - bool x134_24_ : 1; - bool x134_25_ : 1; - bool x134_26_ : 1; - bool x134_27_ : 1; - bool x134_28_disableInput : 1; - bool x134_29_ : 1; - bool x134_30_ : 1; - bool x134_31_ : 1; - bool x135_24_ : 1; - }; - u32 dummy = 0; - }; + bool x134_24_ : 1; + bool x134_25_ : 1; + bool x134_26_ : 1; + bool x134_27_ : 1; + bool x134_28_disableInput : 1; + bool x134_29_ : 1; + bool x134_30_ : 1; + bool x134_31_ : 1; + bool x135_24_ : 1; bool LoadTXTRDep(std::string_view name); static bool AreAllDepsLoaded(const std::vector>& deps); diff --git a/Runtime/MP1/MP1.cpp b/Runtime/MP1/MP1.cpp index 3c1735d0d..eb89c9578 100644 --- a/Runtime/MP1/MP1.cpp +++ b/Runtime/MP1/MP1.cpp @@ -240,7 +240,17 @@ void CGameArchitectureSupport::specialKeyUp(boo::ESpecialKey key, boo::EModifier CMain::CMain(IFactory* resFactory, CSimplePool* resStore, boo::IGraphicsDataFactory* gfxFactory, boo::IGraphicsCommandQueue* cmdQ, const boo::ObjToken& spareTex) -: m_booSetter(gfxFactory, cmdQ, spareTex), x128_globalObjects(resFactory, resStore) { +: m_booSetter(gfxFactory, cmdQ, spareTex) +, x128_globalObjects(resFactory, resStore) +, x160_24_finished(false) +, x160_25_mfGameBuilt(false) +, x160_26_screenFading(false) +, x160_27_(false) +, x160_28_manageCard(false) +, x160_29_(false) +, x160_30_(false) +, x160_31_cardBusy(false) +, x161_24_gameFrameDrawn(false) { xe4_gameplayResult = EGameplayResult::Playing; g_Main = this; } diff --git a/Runtime/MP1/MP1.hpp b/Runtime/MP1/MP1.hpp index cf25985ec..f805dff6a 100644 --- a/Runtime/MP1/MP1.hpp +++ b/Runtime/MP1/MP1.hpp @@ -227,20 +227,15 @@ private: u32 x130_[10] = {1000000}; - union { - struct { - bool x160_24_finished : 1; - bool x160_25_mfGameBuilt : 1; - bool x160_26_screenFading : 1; - bool x160_27_ : 1; - bool x160_28_manageCard : 1; - bool x160_29_ : 1; - bool x160_30_ : 1; - bool x160_31_cardBusy : 1; - bool x161_24_gameFrameDrawn : 1; - }; - u16 _dummy = 0; - }; + bool x160_24_finished : 1; + bool x160_25_mfGameBuilt : 1; + bool x160_26_screenFading : 1; + bool x160_27_ : 1; + bool x160_28_manageCard : 1; + bool x160_29_ : 1; + bool x160_30_ : 1; + bool x160_31_cardBusy : 1; + bool x161_24_gameFrameDrawn : 1; std::unique_ptr x164_archSupport; From 153004faee48fb9a12d0a696339fdb932d89a613 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 10 Apr 2020 15:33:05 -0400 Subject: [PATCH 043/224] Runtime/MP1/World: Replace bitfield unions with constructor initializers --- Runtime/MP1/World/CBabygoth.cpp | 17 ++++- Runtime/MP1/World/CBabygoth.hpp | 33 ++++----- Runtime/MP1/World/CBeetle.cpp | 13 ++-- Runtime/MP1/World/CBeetle.hpp | 11 +-- Runtime/MP1/World/CMetroid.cpp | 3 +- Runtime/MP1/World/CMetroid.hpp | 7 +- Runtime/MP1/World/CMetroidBeta.cpp | 10 ++- Runtime/MP1/World/CMetroidBeta.hpp | 21 +++--- Runtime/MP1/World/CParasite.cpp | 17 +++-- Runtime/MP1/World/CParasite.hpp | 30 ++++----- Runtime/MP1/World/CSpacePirate.cpp | 2 + Runtime/MP1/World/CSpacePirate.hpp | 103 ++++++++++++++--------------- Runtime/MP1/World/CWarWasp.cpp | 12 +++- Runtime/MP1/World/CWarWasp.hpp | 22 +++--- 14 files changed, 154 insertions(+), 147 deletions(-) diff --git a/Runtime/MP1/World/CBabygoth.cpp b/Runtime/MP1/World/CBabygoth.cpp index 1a831d151..775fa57ee 100644 --- a/Runtime/MP1/World/CBabygoth.cpp +++ b/Runtime/MP1/World/CBabygoth.cpp @@ -69,7 +69,21 @@ CBabygoth::CBabygoth(TUniqueId uid, std::string_view name, const CEntityInfo& in g_SimplePool->GetObj({SBIG('WPSC'), babyData.x44_fireBreathWeapon}) : g_SimplePool->GetObj("FlameThrower"sv)) , x98c_dVuln(pInfo.GetDamageVulnerability()) -, xa00_shellHitPoints(babyData.GetShellHitPoints()) { +, xa00_shellHitPoints(babyData.GetShellHitPoints()) +, xa48_24_isAlert(false) +, xa48_25_(false) +, xa48_26_inProjectileAttack(false) +, xa48_27_(false) +, xa48_28_pendingAttackContactDamage(false) +, xa48_29_hasBeenEnraged(false) +, xa48_30_heardPlayerFire(false) +, xa48_31_approachNeedsPathSearch(true) +, xa49_24_gettingUp(false) +, xa49_25_shouldStepBackwards(false) +, xa49_26_readyForTeam(false) +, xa49_27_locomotionValid(false) +, xa49_28_onApproachPath(false) +, xa49_29_objectSpaceCollision(false) { TLockedToken model = g_SimplePool->GetObj({SBIG('CMDL'), babyData.x138_noShellModel}); TLockedToken skin = g_SimplePool->GetObj({SBIG('CSKR'), babyData.x13c_noShellSkin}); xa08_noShellModel = @@ -80,7 +94,6 @@ CBabygoth::CBabygoth(TUniqueId uid, std::string_view name, const CEntityInfo& in xa2c_destroyShellParticle = g_SimplePool->GetObj({SBIG('PART'), babyData.x154_destroyShellParticle}); if (x570_babyData.x148_intermediateCrackParticle.IsValid()) xa38_intermediateCrackParticle = g_SimplePool->GetObj({SBIG('PART'), babyData.x148_intermediateCrackParticle}); - xa48_31_approachNeedsPathSearch = true; x958_iceProjectile.Token().Lock(); UpdateTouchBounds(); x460_knockBackController.SetEnableFreeze(false); diff --git a/Runtime/MP1/World/CBabygoth.hpp b/Runtime/MP1/World/CBabygoth.hpp index 706f0be2e..a39674db2 100644 --- a/Runtime/MP1/World/CBabygoth.hpp +++ b/Runtime/MP1/World/CBabygoth.hpp @@ -100,25 +100,20 @@ private: TToken xa20_crackTwoParticle; TToken xa2c_destroyShellParticle; TLockedToken xa38_intermediateCrackParticle; // Used to be an optional, not necessary in URDE - union { - struct { - bool xa48_24_isAlert : 1; - bool xa48_25_ : 1; - bool xa48_26_inProjectileAttack : 1; - bool xa48_27_ : 1; - bool xa48_28_pendingAttackContactDamage : 1; - bool xa48_29_hasBeenEnraged : 1; - bool xa48_30_heardPlayerFire : 1; - bool xa48_31_approachNeedsPathSearch : 1; - bool xa49_24_gettingUp : 1; - bool xa49_25_shouldStepBackwards : 1; - bool xa49_26_readyForTeam : 1; - bool xa49_27_locomotionValid : 1; - bool xa49_28_onApproachPath : 1; - bool xa49_29_objectSpaceCollision : 1; - }; - u32 _dummy = 0; - }; + bool xa48_24_isAlert : 1; + bool xa48_25_ : 1; + bool xa48_26_inProjectileAttack : 1; + bool xa48_27_ : 1; + bool xa48_28_pendingAttackContactDamage : 1; + bool xa48_29_hasBeenEnraged : 1; + bool xa48_30_heardPlayerFire : 1; + bool xa48_31_approachNeedsPathSearch : 1; + bool xa49_24_gettingUp : 1; + bool xa49_25_shouldStepBackwards : 1; + bool xa49_26_readyForTeam : 1; + bool xa49_27_locomotionValid : 1; + bool xa49_28_onApproachPath : 1; + bool xa49_29_objectSpaceCollision : 1; void AddSphereCollisionList(const SSphereJointInfo*, s32, std::vector&); diff --git a/Runtime/MP1/World/CBeetle.cpp b/Runtime/MP1/World/CBeetle.cpp index 85764d1e0..2f94a2614 100644 --- a/Runtime/MP1/World/CBeetle.cpp +++ b/Runtime/MP1/World/CBeetle.cpp @@ -18,22 +18,23 @@ CBeetle::CBeetle(TUniqueId uid, std::string_view name, const CEntityInfo& info, CModelData&& mData, const CPatternedInfo& pInfo, CPatterned::EFlavorType flavor, CBeetle::EEntranceType entranceType, const CDamageInfo& touchDamage, const CDamageVulnerability& platingVuln, const zeus::CVector3f& tailAimReference, - float initialAttackDelay, float retreatTime, float f3, - const CDamageVulnerability& tailVuln, const CActorParameters& aParams, - const std::optional& tailModel) + float initialAttackDelay, float retreatTime, float f3, const CDamageVulnerability& tailVuln, + const CActorParameters& aParams, const std::optional& tailModel) : CPatterned(ECharacter::Beetle, uid, name, flavor, info, xf, std::move(mData), pInfo, EMovementType::Ground, EColliderType::One, EBodyType::BiPedal, aParams, EKnockBackVariant(flavor)) , x56c_entranceType(entranceType) , x574_tailAimReference(tailAimReference) , x580_f3(f3) , x584_touchDamage(touchDamage) -, x5ac_tailModel(tailModel ? std::optional(CModelData(*tailModel)) : - std::optional()) +, x5ac_tailModel(tailModel ? std::optional(CModelData(*tailModel)) : std::nullopt) , x5fc_pathFindSearch(nullptr, 1, pInfo.GetPathfindingIndex(), 1.f, 1.f) , x744_platingVuln(platingVuln) , x7ac_tailVuln(tailVuln) , x814_attackDelayTimer(initialAttackDelay) -, x834_retreatTime(retreatTime) { +, x834_retreatTime(retreatTime) +, x838_24_hitSomething(false) +, x838_25_burrowing(false) +, x838_26_canSkid(false) { x5a0_headbuttDist = GetAnimationDistance(CPASAnimParmData(7, CPASAnimParm::FromEnum(0), CPASAnimParm::FromEnum(1))); x5a4_jumpBackwardDist = x64_modelData->GetScale().y() * diff --git a/Runtime/MP1/World/CBeetle.hpp b/Runtime/MP1/World/CBeetle.hpp index 3e396b02e..a810c5a6f 100644 --- a/Runtime/MP1/World/CBeetle.hpp +++ b/Runtime/MP1/World/CBeetle.hpp @@ -38,14 +38,9 @@ private: zeus::CVector3f x824_predictPos; float x830_intoGroundFactor = 1.f; float x834_retreatTime; - union { - struct { - bool x838_24_hitSomething : 1; - bool x838_25_burrowing : 1; - bool x838_26_canSkid : 1; - }; - u32 _dummy3 = 0; - }; + bool x838_24_hitSomething : 1; + bool x838_25_burrowing : 1; + bool x838_26_canSkid : 1; void SquadAdd(CStateManager& mgr); void SquadRemove(CStateManager& mgr); diff --git a/Runtime/MP1/World/CMetroid.cpp b/Runtime/MP1/World/CMetroid.cpp index 8adbdbff1..0361fa327 100644 --- a/Runtime/MP1/World/CMetroid.cpp +++ b/Runtime/MP1/World/CMetroid.cpp @@ -23,6 +23,7 @@ CMetroid::CMetroid(TUniqueId uid, std::string_view name, EFlavorType flavor, con const zeus::CTransform& xf, CModelData&& mData, const CPatternedInfo& pInfo, const CActorParameters& aParms, const CMetroidData& metroidData, TUniqueId) : CPatterned(ECharacter::Metroid, uid, name, flavor, info, xf, std::move(mData), pInfo, EMovementType::Flyer, - EColliderType::One, EBodyType::Flyer, aParms, EKnockBackVariant::Medium) {} + EColliderType::One, EBodyType::Flyer, aParms, EKnockBackVariant::Medium) +, x9bf_29_(false) {} } // namespace urde::MP1 diff --git a/Runtime/MP1/World/CMetroid.hpp b/Runtime/MP1/World/CMetroid.hpp index 1a547f75c..14c4d5b25 100644 --- a/Runtime/MP1/World/CMetroid.hpp +++ b/Runtime/MP1/World/CMetroid.hpp @@ -30,12 +30,7 @@ public: }; class CMetroid : public CPatterned { - union { - struct { - bool x9bf_29_ : 1; - }; - u32 _dummy = 0; - }; + bool x9bf_29_ : 1; public: DEFINE_PATTERNED(Metroid) diff --git a/Runtime/MP1/World/CMetroidBeta.cpp b/Runtime/MP1/World/CMetroidBeta.cpp index fac634659..6750f6006 100644 --- a/Runtime/MP1/World/CMetroidBeta.cpp +++ b/Runtime/MP1/World/CMetroidBeta.cpp @@ -56,7 +56,15 @@ CMetroidBeta::CMetroidBeta(TUniqueId uid, std::string_view name, const CEntityIn , x824_(std::make_unique(x7f0_, 0)) , x828_(std::make_unique(x7fc_)) , x82c_(std::make_unique(x808_)) -, x830_(std::make_unique(x814_)) { +, x830_(std::make_unique(x814_)) +, x840_24_(false) +, x840_25_(false) +, x840_26_(false) +, x840_27_(false) +, x840_28_(false) +, x840_29_(false) +, x840_30_(false) +, x840_31_(false) { x820_->SetParticleEmission(false); x828_->SetParticleEmission(false); x82c_->SetParticleEmission(false); diff --git a/Runtime/MP1/World/CMetroidBeta.hpp b/Runtime/MP1/World/CMetroidBeta.hpp index 5c421dcf6..0c4400203 100644 --- a/Runtime/MP1/World/CMetroidBeta.hpp +++ b/Runtime/MP1/World/CMetroidBeta.hpp @@ -75,19 +75,14 @@ class CMetroidBeta : public CPatterned { float x834_ = 0.f; CRandom16 x838_ = CRandom16(1469); float x83c_; - union { - struct { - bool x840_24_ : 1; - bool x840_25_ : 1; - bool x840_26_ : 1; - bool x840_27_ : 1; - bool x840_28_ : 1; - bool x840_29_ : 1; - bool x840_30_ : 1; - bool x840_31_ : 1; - }; - u32 _dummy = 0; - }; + bool x840_24_ : 1; + bool x840_25_ : 1; + bool x840_26_ : 1; + bool x840_27_ : 1; + bool x840_28_ : 1; + bool x840_29_ : 1; + bool x840_30_ : 1; + bool x840_31_ : 1; void CreateCollisionActorManager(CStateManager& mgr); void AddSphereJoints(SSphereJointInfo* sphereJoints, s32 count, std::vector& joints); diff --git a/Runtime/MP1/World/CParasite.cpp b/Runtime/MP1/World/CParasite.cpp index 07fb97d61..e21fed1f5 100644 --- a/Runtime/MP1/World/CParasite.cpp +++ b/Runtime/MP1/World/CParasite.cpp @@ -58,10 +58,19 @@ CParasite::CParasite(TUniqueId uid, std::string_view name, EFlavorType flavor, c , x714_iceZoomerJointHP(iceZoomerJointHP) , x73c_haltSfx(CSfxManager::TranslateSFXID(haltSfx)) , x73e_getUpSfx(CSfxManager::TranslateSFXID(getUpSfx)) -, x740_crouchSfx(CSfxManager::TranslateSFXID(crouchSfx)) { - x742_28_onGround = true; - x742_30_attackOver = true; - +, x740_crouchSfx(CSfxManager::TranslateSFXID(crouchSfx)) +, x742_24_receivedTelegraph(false) +, x742_25_jumpVelDirty(false) +, x742_26_(false) +, x742_27_landed(false) +, x742_28_onGround(true) +, x742_29_(false) +, x742_30_attackOver(true) +, x742_31_(false) +, x743_24_halted(false) +, x743_25_vulnerable(false) +, x743_26_oculusShotAt(false) +, x743_27_inJump(false) { switch (x5d0_walkerType) { case EWalkerType::Geemer: x460_knockBackController.SetEnableFreeze(false); diff --git a/Runtime/MP1/World/CParasite.hpp b/Runtime/MP1/World/CParasite.hpp index 1e673d124..69b07dc15 100644 --- a/Runtime/MP1/World/CParasite.hpp +++ b/Runtime/MP1/World/CParasite.hpp @@ -70,23 +70,19 @@ class CParasite : public CWallWalker { u16 x73c_haltSfx; u16 x73e_getUpSfx; u16 x740_crouchSfx; - union { - struct { - bool x742_24_receivedTelegraph : 1; - bool x742_25_jumpVelDirty : 1; - bool x742_26_ : 1; - bool x742_27_landed : 1; - bool x742_28_onGround : 1; - bool x742_29_ : 1; - bool x742_30_attackOver : 1; - bool x742_31_ : 1; - bool x743_24_halted : 1; - bool x743_25_vulnerable : 1; - bool x743_26_oculusShotAt : 1; - bool x743_27_inJump : 1; - }; - u16 _dummy = 0; - }; + bool x742_24_receivedTelegraph : 1; + bool x742_25_jumpVelDirty : 1; + bool x742_26_ : 1; + bool x742_27_landed : 1; + bool x742_28_onGround : 1; + bool x742_29_ : 1; + bool x742_30_attackOver : 1; + bool x742_31_ : 1; + bool x743_24_halted : 1; + bool x743_25_vulnerable : 1; + bool x743_26_oculusShotAt : 1; + bool x743_27_inJump : 1; + bool CloseToWall(const CStateManager& mgr) const; void FaceTarget(const zeus::CVector3f& target); TUniqueId RecursiveFindClosestWayPoint(CStateManager& mgr, TUniqueId id, float& dist); diff --git a/Runtime/MP1/World/CSpacePirate.cpp b/Runtime/MP1/World/CSpacePirate.cpp index 409a11e5b..f95beba06 100644 --- a/Runtime/MP1/World/CSpacePirate.cpp +++ b/Runtime/MP1/World/CSpacePirate.cpp @@ -418,6 +418,7 @@ CSpacePirate::CSpacePirate(TUniqueId uid, std::string_view name, const CEntityIn x637_24_enablePatrol = false; x637_25_enableAim = false; x637_26_hearPlayerFire = false; + x637_27_inProjectilePath = false; x637_28_noPlayerLos = false; x637_29_inWallHang = false; x637_30_jumpVelSet = false; @@ -438,6 +439,7 @@ CSpacePirate::CSpacePirate(TUniqueId uid, std::string_view name, const CEntityIn x639_29_enableBreakDodge = false; x639_30_closeMelee = false; x639_31_sentAttackMsg = false; + x63a_24_normalDodge = false; x758_headSeg = x64_modelData->GetAnimationData()->GetLocatorSegId("Head_1"sv); x7b6_gunSeg = x64_modelData->GetAnimationData()->GetLocatorSegId("R_gun_LCTR"sv); diff --git a/Runtime/MP1/World/CSpacePirate.hpp b/Runtime/MP1/World/CSpacePirate.hpp index 0663fd803..89e61b92d 100644 --- a/Runtime/MP1/World/CSpacePirate.hpp +++ b/Runtime/MP1/World/CSpacePirate.hpp @@ -97,61 +97,56 @@ private: }; CSpacePirateData x568_pirateData; - union { - struct { - bool x634_24_pendingAmbush : 1; - bool x634_25_ceilingAmbush : 1; - bool x634_26_nonAggressive : 1; - bool x634_27_melee : 1; - bool x634_28_noShuffleCloseCheck : 1; - bool x634_29_onlyAttackInRange : 1; - bool x634_30_ : 1; - bool x634_31_noKnockbackImpulseReset : 1; - bool x635_24_noMeleeAttack : 1; - bool x635_25_breakAttack : 1; - bool x635_26_seated : 1; - bool x635_27_shadowPirate : 1; - bool x635_28_alertBeforeCloak : 1; - bool x635_29_noBreakDodge : 1; - bool x635_30_floatingCorpse : 1; - bool x635_31_ragdollNoAiCollision : 1; - bool x636_24_trooper : 1; - bool x636_25_hearNoise : 1; - bool x636_26_enableMeleeAttack : 1; - bool x636_27_ : 1; - bool x636_28_ : 1; - bool x636_29_enableRetreat : 1; - bool x636_30_shuffleClose : 1; - bool x636_31_inAttackState : 1; - bool x637_24_enablePatrol : 1; - bool x637_25_enableAim : 1; - bool x637_26_hearPlayerFire : 1; - bool x637_27_inProjectilePath : 1; - bool x637_28_noPlayerLos : 1; - bool x637_29_inWallHang : 1; - bool x637_30_jumpVelSet : 1; - bool x637_31_prevInCineCam : 1; - bool x638_24_pendingFrenzyChance : 1; - bool x638_25_appliedBladeDamage : 1; - bool x638_26_alwaysAggressive : 1; - bool x638_27_coverCheck : 1; - bool x638_28_enableDodge : 1; - bool x638_29_noPlayerDodge : 1; - bool x638_30_ragdollOver : 1; - bool x638_31_mayStartAttack : 1; - bool x639_24_ : 1; - bool x639_25_useJumpBackJump : 1; - bool x639_26_started : 1; - bool x639_27_inRange : 1; - bool x639_28_satUp : 1; - bool x639_29_enableBreakDodge : 1; - bool x639_30_closeMelee : 1; - bool x639_31_sentAttackMsg : 1; - bool x63a_24_normalDodge : 1; - }; - u64 _dummy = 0; - }; + bool x634_24_pendingAmbush : 1; + bool x634_25_ceilingAmbush : 1; + bool x634_26_nonAggressive : 1; + bool x634_27_melee : 1; + bool x634_28_noShuffleCloseCheck : 1; + bool x634_29_onlyAttackInRange : 1; + bool x634_30_ : 1; + bool x634_31_noKnockbackImpulseReset : 1; + bool x635_24_noMeleeAttack : 1; + bool x635_25_breakAttack : 1; + bool x635_26_seated : 1; + bool x635_27_shadowPirate : 1; + bool x635_28_alertBeforeCloak : 1; + bool x635_29_noBreakDodge : 1; + bool x635_30_floatingCorpse : 1; + bool x635_31_ragdollNoAiCollision : 1; + bool x636_24_trooper : 1; + bool x636_25_hearNoise : 1; + bool x636_26_enableMeleeAttack : 1; + bool x636_27_ : 1; + bool x636_28_ : 1; + bool x636_29_enableRetreat : 1; + bool x636_30_shuffleClose : 1; + bool x636_31_inAttackState : 1; + bool x637_24_enablePatrol : 1; + bool x637_25_enableAim : 1; + bool x637_26_hearPlayerFire : 1; + bool x637_27_inProjectilePath : 1; + bool x637_28_noPlayerLos : 1; + bool x637_29_inWallHang : 1; + bool x637_30_jumpVelSet : 1; + bool x637_31_prevInCineCam : 1; + bool x638_24_pendingFrenzyChance : 1; + bool x638_25_appliedBladeDamage : 1; + bool x638_26_alwaysAggressive : 1; + bool x638_27_coverCheck : 1; + bool x638_28_enableDodge : 1; + bool x638_29_noPlayerDodge : 1; + bool x638_30_ragdollOver : 1; + bool x638_31_mayStartAttack : 1; + bool x639_24_ : 1; + bool x639_25_useJumpBackJump : 1; + bool x639_26_started : 1; + bool x639_27_inRange : 1; + bool x639_28_satUp : 1; + bool x639_29_enableBreakDodge : 1; + bool x639_30_closeMelee : 1; + bool x639_31_sentAttackMsg : 1; + bool x63a_24_normalDodge : 1; s32 x63c_frenzyFrames = 0; TUniqueId x640_coverPoint = kInvalidUniqueId; diff --git a/Runtime/MP1/World/CWarWasp.cpp b/Runtime/MP1/World/CWarWasp.cpp index 69da69330..0f5002574 100644 --- a/Runtime/MP1/World/CWarWasp.cpp +++ b/Runtime/MP1/World/CWarWasp.cpp @@ -24,9 +24,15 @@ CWarWasp::CWarWasp(TUniqueId uid, std::string_view name, const CEntityInfo& info , x590_pfSearch(nullptr, 0x3, pInfo.GetPathfindingIndex(), 1.f, 1.f) , x684_(dInfo1) , x6d4_projectileInfo(projectileWeapon, projectileDamage) -, x72c_projectileVisorSfx(CSfxManager::TranslateSFXID(projecileVisorSfx)) { - x72e_24_jumpBackRepeat = true; - x72e_26_initiallyInactive = !pInfo.GetActive(); +, x72c_projectileVisorSfx(CSfxManager::TranslateSFXID(projecileVisorSfx)) +, x72e_24_jumpBackRepeat(true) +, x72e_25_canApplyDamage(false) +, x72e_26_initiallyInactive(!pInfo.GetActive()) +, x72e_27_teamMatesMelee(false) +, x72e_28_inProjectileAttack(false) +, x72e_29_pathObstructed(false) +, x72e_30_isRetreating(false) +, x72e_31_heardNoise(false) { x6d4_projectileInfo.Token().Lock(); UpdateTouchBounds(); SetCoefficientOfRestitutionModifier(0.1f); diff --git a/Runtime/MP1/World/CWarWasp.hpp b/Runtime/MP1/World/CWarWasp.hpp index 86cb01aaa..b5b5f84d8 100644 --- a/Runtime/MP1/World/CWarWasp.hpp +++ b/Runtime/MP1/World/CWarWasp.hpp @@ -33,19 +33,15 @@ class CWarWasp : public CPatterned { float x718_circleBurstOffTotemAngle = zeus::degToRad(90.f); TLockedToken x71c_projectileVisorParticle; // Used to be optional u16 x72c_projectileVisorSfx; - union { - struct { - bool x72e_24_jumpBackRepeat : 1; - bool x72e_25_canApplyDamage : 1; - bool x72e_26_initiallyInactive : 1; - bool x72e_27_teamMatesMelee : 1; - bool x72e_28_inProjectileAttack : 1; - bool x72e_29_pathObstructed : 1; - bool x72e_30_isRetreating : 1; - bool x72e_31_heardNoise : 1; - }; - u32 _dummy = 0; - }; + bool x72e_24_jumpBackRepeat : 1; + bool x72e_25_canApplyDamage : 1; + bool x72e_26_initiallyInactive : 1; + bool x72e_27_teamMatesMelee : 1; + bool x72e_28_inProjectileAttack : 1; + bool x72e_29_pathObstructed : 1; + bool x72e_30_isRetreating : 1; + bool x72e_31_heardNoise : 1; + void SwarmAdd(CStateManager& mgr); void SwarmRemove(CStateManager& mgr); void ApplyDamage(CStateManager& mgr); From f483f5c1e6717e3cdb1de847ab7d1ad051de2751 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 10 Apr 2020 15:47:36 -0400 Subject: [PATCH 044/224] CPersistentOptions: Initialize bitfields in default constructor --- Runtime/CGameOptions.hpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Runtime/CGameOptions.hpp b/Runtime/CGameOptions.hpp index a77e3e849..01513df55 100644 --- a/Runtime/CGameOptions.hpp +++ b/Runtime/CGameOptions.hpp @@ -64,7 +64,13 @@ class CPersistentOptions { bool xd0_29_allItemsCollected : 1; public: - CPersistentOptions() = default; + CPersistentOptions() + : xd0_24_fusionLinked(false) + , xd0_25_normalModeBeat(false) + , xd0_26_hardModeBeat(false) + , xd0_27_fusionBeat(false) + , xd0_28_fusionSuitActive(false) + , xd0_29_allItemsCollected(false) {} explicit CPersistentOptions(CBitStreamReader& stream); bool GetCinematicState(CAssetId mlvlId, TEditorId cineId) const; From 72370910ada919f1aae3dba13073c38e31387f72 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 10 Apr 2020 17:18:09 -0400 Subject: [PATCH 045/224] IAnimReader: Make use of size_t for capacity and iterators Allows using container sizes and capacities without needing to cast them, allowing for dehardcoding of array sizes in some scenarios. --- Runtime/Character/CAnimData.cpp | 79 +++++++++-------- Runtime/Character/CAnimSourceReader.cpp | 16 ++-- Runtime/Character/CAnimSourceReader.hpp | 12 +-- .../CAnimTreeAnimReaderContainer.cpp | 16 ++-- .../CAnimTreeAnimReaderContainer.hpp | 12 +-- Runtime/Character/CAnimTreeDoubleChild.cpp | 36 ++++---- Runtime/Character/CAnimTreeDoubleChild.hpp | 12 +-- Runtime/Character/CAnimTreeLoopIn.cpp | 16 ++-- Runtime/Character/CAnimTreeLoopIn.hpp | 12 +-- Runtime/Character/CAnimTreeSequence.cpp | 16 ++-- Runtime/Character/CAnimTreeSequence.hpp | 12 +-- Runtime/Character/CAnimTreeSingleChild.cpp | 16 ++-- Runtime/Character/CAnimTreeSingleChild.hpp | 12 +-- Runtime/Character/CAnimTreeTimeScale.cpp | 60 +++++++------ Runtime/Character/CAnimTreeTimeScale.hpp | 12 +-- Runtime/Character/CPOINode.cpp | 85 ++++++++++--------- Runtime/Character/CPOINode.hpp | 10 +-- Runtime/Character/CSequenceHelper.cpp | 30 ++++--- Runtime/Character/IAnimReader.cpp | 36 ++++---- Runtime/Character/IAnimReader.hpp | 25 +++--- Runtime/Character/IMetaAnim.cpp | 18 ++-- 21 files changed, 296 insertions(+), 247 deletions(-) diff --git a/Runtime/Character/CAnimData.cpp b/Runtime/Character/CAnimData.cpp index f201b064b..152af6400 100644 --- a/Runtime/Character/CAnimData.cpp +++ b/Runtime/Character/CAnimData.cpp @@ -135,11 +135,13 @@ SAdvancementDeltas CAnimData::AdvanceAdditiveAnims(float dt) { std::shared_ptr& anim = additive.second.GetAnim(); if (additive.second.IsActive()) { while (time.GreaterThanZero() && std::fabs(time.GetSeconds()) >= 0.00001f) { - x210_passedIntCount += anim->GetInt32POIList(time, g_Int32POINodes.data(), 16, x210_passedIntCount, 0); - x20c_passedBoolCount += anim->GetBoolPOIList(time, g_BoolPOINodes.data(), 8, x20c_passedBoolCount, 0); + x210_passedIntCount += + u32(anim->GetInt32POIList(time, g_Int32POINodes.data(), g_Int32POINodes.size(), x210_passedIntCount, 0)); + x20c_passedBoolCount += + u32(anim->GetBoolPOIList(time, g_BoolPOINodes.data(), g_BoolPOINodes.size(), x20c_passedBoolCount, 0)); x214_passedParticleCount += - anim->GetParticlePOIList(time, g_ParticlePOINodes.data(), 8, x214_passedParticleCount, 0); - x218_passedSoundCount += anim->GetSoundPOIList(time, g_SoundPOINodes.data(), 8, x218_passedSoundCount, 0); + u32(anim->GetParticlePOIList(time, g_ParticlePOINodes.data(), 8, x214_passedParticleCount, 0)); + x218_passedSoundCount += u32(anim->GetSoundPOIList(time, g_SoundPOINodes.data(), 8, x218_passedSoundCount, 0)); SAdvancementResults results = AdvanceAdditiveAnim(anim, time); deltas.x0_posDelta += results.x8_deltas.x0_posDelta; @@ -149,11 +151,13 @@ SAdvancementDeltas CAnimData::AdvanceAdditiveAnims(float dt) { } else { CCharAnimTime remTime = anim->VGetTimeRemaining(); while (remTime.GreaterThanZero() && std::fabs(remTime.GetSeconds()) >= 0.00001f) { - x210_passedIntCount += anim->GetInt32POIList(time, g_Int32POINodes.data(), 16, x210_passedIntCount, 0); - x20c_passedBoolCount += anim->GetBoolPOIList(time, g_BoolPOINodes.data(), 8, x20c_passedBoolCount, 0); + x210_passedIntCount += + u32(anim->GetInt32POIList(time, g_Int32POINodes.data(), g_Int32POINodes.size(), x210_passedIntCount, 0)); + x20c_passedBoolCount += + u32(anim->GetBoolPOIList(time, g_BoolPOINodes.data(), g_BoolPOINodes.size(), x20c_passedBoolCount, 0)); x214_passedParticleCount += - anim->GetParticlePOIList(time, g_ParticlePOINodes.data(), 8, x214_passedParticleCount, 0); - x218_passedSoundCount += anim->GetSoundPOIList(time, g_SoundPOINodes.data(), 8, x218_passedSoundCount, 0); + u32(anim->GetParticlePOIList(time, g_ParticlePOINodes.data(), 8, x214_passedParticleCount, 0)); + x218_passedSoundCount += u32(anim->GetSoundPOIList(time, g_SoundPOINodes.data(), 8, x218_passedSoundCount, 0)); SAdvancementResults results = AdvanceAdditiveAnim(anim, time); deltas.x0_posDelta += results.x8_deltas.x0_posDelta; @@ -263,8 +267,9 @@ SAdvancementDeltas CAnimData::GetAdvancementDeltas(const CCharAnimTime& a, const } CCharAnimTime CAnimData::GetTimeOfUserEvent(EUserEventType type, const CCharAnimTime& time) const { - u32 count = x1f8_animRoot->GetInt32POIList(time, g_TransientInt32POINodes.data(), 16, 0, 64); - for (u32 i = 0; i < count; ++i) { + const size_t count = + x1f8_animRoot->GetInt32POIList(time, g_TransientInt32POINodes.data(), g_TransientInt32POINodes.size(), 0, 64); + for (size_t i = 0; i < count; ++i) { CInt32POINode& poi = g_TransientInt32POINodes[i]; if (poi.GetPoiType() == EPOIType::UserEvent && EUserEventType(poi.GetValue()) == type) { CCharAnimTime ret = poi.GetTime(); @@ -283,8 +288,8 @@ void CAnimData::MultiplyPlaybackRate(float mul) { x200_speedScale *= mul; } void CAnimData::SetPlaybackRate(float set) { x200_speedScale = set; } void CAnimData::SetRandomPlaybackRate(CRandom16& r) { - for (u32 i = 0; i < x210_passedIntCount; ++i) { - CInt32POINode& poi = g_Int32POINodes[i]; + for (size_t i = 0; i < x210_passedIntCount; ++i) { + const CInt32POINode& poi = g_Int32POINodes[i]; if (poi.GetPoiType() == EPOIType::RandRate) { float tmp = (r.Next() % poi.GetValue()) / 100.f; if ((r.Next() % 100) < 50) @@ -304,10 +309,10 @@ void CAnimData::CalcPlaybackAlignmentParms(const CAnimPlaybackParms& parms, x220_27_ = false; if (parms.GetDeltaOrient() && parms.GetObjectXform()) { ResetPOILists(); - x210_passedIntCount += - node->GetInt32POIList(CCharAnimTime::Infinity(), g_Int32POINodes.data(), 16, x210_passedIntCount, 64); - for (u32 i = 0; i < x210_passedIntCount; ++i) { - CInt32POINode& poi = g_Int32POINodes[i]; + x210_passedIntCount += u32(node->GetInt32POIList(CCharAnimTime::Infinity(), g_Int32POINodes.data(), + g_Int32POINodes.size(), x210_passedIntCount, 64)); + for (size_t i = 0; i < x210_passedIntCount; ++i) { + const CInt32POINode& poi = g_Int32POINodes[i]; if (poi.GetPoiType() == EPOIType::UserEvent && EUserEventType(poi.GetValue()) == EUserEventType::AlignTargetRot) { SAdvancementResults res = node->VGetAdvancementResults(poi.GetTime(), 0.f); orient = zeus::CQuaternion::slerp(zeus::CQuaternion(), @@ -328,10 +333,10 @@ void CAnimData::CalcPlaybackAlignmentParms(const CAnimPlaybackParms& parms, CCharAnimTime timeStart, timeAlign; if (parms.GetTargetPos() && parms.GetObjectXform()) { ResetPOILists(); - x210_passedIntCount += - node->GetInt32POIList(CCharAnimTime::Infinity(), g_Int32POINodes.data(), 16, x210_passedIntCount, 64); - for (u32 i = 0; i < x210_passedIntCount; ++i) { - CInt32POINode& poi = g_Int32POINodes[i]; + x210_passedIntCount += u32(node->GetInt32POIList(CCharAnimTime::Infinity(), g_Int32POINodes.data(), + g_Int32POINodes.size(), x210_passedIntCount, 64)); + for (size_t i = 0; i < x210_passedIntCount; ++i) { + const CInt32POINode& poi = g_Int32POINodes[i]; if (poi.GetPoiType() == EPOIType::UserEvent) { if (EUserEventType(poi.GetValue()) == EUserEventType::AlignTargetPosStart) { didStart = true; @@ -380,9 +385,9 @@ void CAnimData::CalcPlaybackAlignmentParms(const CAnimPlaybackParms& parms, zeus::CVector3f startPos; if (parms.GetTargetPos() && parms.GetObjectXform()) { ResetPOILists(); - x210_passedIntCount += - node->GetInt32POIList(CCharAnimTime::Infinity(), g_Int32POINodes.data(), 16, x210_passedIntCount, 64); - for (u32 i = 0; i < x210_passedIntCount; ++i) { + x210_passedIntCount += u32(node->GetInt32POIList(CCharAnimTime::Infinity(), g_Int32POINodes.data(), + g_Int32POINodes.size(), x210_passedIntCount, 64)); + for (size_t i = 0; i < x210_passedIntCount; ++i) { CInt32POINode& poi = g_Int32POINodes[i]; if (poi.GetPoiType() == EPOIType::UserEvent) { if (EUserEventType(poi.GetValue()) == EUserEventType::AlignTargetPosStart) { @@ -678,23 +683,27 @@ SAdvancementDeltas CAnimData::DoAdvance(float dt, bool& suspendParticles, CRando CCharAnimTime time(scaleDt); if (x220_25_loop) { while (time.GreaterThanZero() && !time.EpsilonZero()) { - x210_passedIntCount += x1f8_animRoot->GetInt32POIList(time, g_Int32POINodes.data(), 16, x210_passedIntCount, 0); - x20c_passedBoolCount += x1f8_animRoot->GetBoolPOIList(time, g_BoolPOINodes.data(), 16, x20c_passedBoolCount, 0); + x210_passedIntCount += u32(x1f8_animRoot->GetInt32POIList(time, g_Int32POINodes.data(), g_Int32POINodes.size(), + x210_passedIntCount, 0)); + x20c_passedBoolCount += u32( + x1f8_animRoot->GetBoolPOIList(time, g_BoolPOINodes.data(), g_BoolPOINodes.size(), x20c_passedBoolCount, 0)); x214_passedParticleCount += - x1f8_animRoot->GetParticlePOIList(time, g_ParticlePOINodes.data(), 16, x214_passedParticleCount, 0); + u32(x1f8_animRoot->GetParticlePOIList(time, g_ParticlePOINodes.data(), 16, x214_passedParticleCount, 0)); x218_passedSoundCount += - x1f8_animRoot->GetSoundPOIList(time, g_SoundPOINodes.data(), 16, x218_passedSoundCount, 0); + u32(x1f8_animRoot->GetSoundPOIList(time, g_SoundPOINodes.data(), 16, x218_passedSoundCount, 0)); AdvanceAnim(time, offsetPost, quatPost); } } else { CCharAnimTime remTime = x1f8_animRoot->VGetTimeRemaining(); while (!remTime.EpsilonZero() && !time.EpsilonZero()) { - x210_passedIntCount += x1f8_animRoot->GetInt32POIList(time, g_Int32POINodes.data(), 16, x210_passedIntCount, 0); - x20c_passedBoolCount += x1f8_animRoot->GetBoolPOIList(time, g_BoolPOINodes.data(), 16, x20c_passedBoolCount, 0); + x210_passedIntCount += u32(x1f8_animRoot->GetInt32POIList(time, g_Int32POINodes.data(), g_Int32POINodes.size(), + x210_passedIntCount, 0)); + x20c_passedBoolCount += u32( + x1f8_animRoot->GetBoolPOIList(time, g_BoolPOINodes.data(), g_BoolPOINodes.size(), x20c_passedBoolCount, 0)); x214_passedParticleCount += - x1f8_animRoot->GetParticlePOIList(time, g_ParticlePOINodes.data(), 16, x214_passedParticleCount, 0); + u32(x1f8_animRoot->GetParticlePOIList(time, g_ParticlePOINodes.data(), 16, x214_passedParticleCount, 0)); x218_passedSoundCount += - x1f8_animRoot->GetSoundPOIList(time, g_SoundPOINodes.data(), 16, x218_passedSoundCount, 0); + u32(x1f8_animRoot->GetSoundPOIList(time, g_SoundPOINodes.data(), 16, x218_passedSoundCount, 0)); AdvanceAnim(time, offsetPost, quatPost); remTime = x1f8_animRoot->VGetTimeRemaining(); time = std::max(0.f, std::min(remTime.GetSeconds(), time.GetSeconds())); @@ -721,8 +730,8 @@ SAdvancementDeltas CAnimData::Advance(float dt, const zeus::CVector3f& scale, CS if (suspendParticles) x120_particleDB.SuspendAllActiveEffects(stateMgr); - for (u32 i = 0; i < x214_passedParticleCount; ++i) { - CParticlePOINode& node = g_ParticlePOINodes[i]; + for (size_t i = 0; i < x214_passedParticleCount; ++i) { + const CParticlePOINode& node = g_ParticlePOINodes[i]; if (node.GetCharacterIndex() == -1 || node.GetCharacterIndex() == x204_charIdx) { x120_particleDB.AddParticleEffect(node.GetString(), node.GetFlags(), node.GetParticleData(), scale, stateMgr, aid, false, x21c_particleLightIdx); @@ -750,8 +759,8 @@ void CAnimData::AdvanceAnim(CCharAnimTime& time, zeus::CVector3f& offset, zeus:: x1f8_animRoot = CAnimTreeNode::Cast(std::move(*simplified)); if ((x220_28_ || x220_27_) && x210_passedIntCount > 0) { - for (u32 i = 0; i < x210_passedIntCount; ++i) { - CInt32POINode& node = g_Int32POINodes[i]; + for (size_t i = 0; i < x210_passedIntCount; ++i) { + const CInt32POINode& node = g_Int32POINodes[i]; if (node.GetPoiType() == EPOIType::UserEvent) { switch (EUserEventType(node.GetValue())) { case EUserEventType::AlignTargetPosStart: { diff --git a/Runtime/Character/CAnimSourceReader.cpp b/Runtime/Character/CAnimSourceReader.cpp index 29c01fb9e..88c72f7eb 100644 --- a/Runtime/Character/CAnimSourceReader.cpp +++ b/Runtime/Character/CAnimSourceReader.cpp @@ -132,8 +132,8 @@ void CAnimSourceReaderBase::UpdatePOIStates() { } } -u32 CAnimSourceReaderBase::VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, - u32 unk) const { +size_t CAnimSourceReaderBase::VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { if (x4_sourceInfo->HasPOIData()) { const std::vector& boolNodes = x4_sourceInfo->GetBoolPOIStream(); return _getPOIList(time, listOut, capacity, iterator, unk, boolNodes, xc_curTime, *x4_sourceInfo, @@ -142,8 +142,8 @@ u32 CAnimSourceReaderBase::VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINo return 0; } -u32 CAnimSourceReaderBase::VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, - u32 iterator, u32 unk) const { +size_t CAnimSourceReaderBase::VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { if (x4_sourceInfo->HasPOIData()) { const std::vector& int32Nodes = x4_sourceInfo->GetInt32POIStream(); return _getPOIList(time, listOut, capacity, iterator, unk, int32Nodes, xc_curTime, *x4_sourceInfo, @@ -152,8 +152,8 @@ u32 CAnimSourceReaderBase::VGetInt32POIList(const CCharAnimTime& time, CInt32POI return 0; } -u32 CAnimSourceReaderBase::VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, - u32 iterator, u32 unk) const { +size_t CAnimSourceReaderBase::VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { if (x4_sourceInfo->HasPOIData()) { const std::vector& particleNodes = x4_sourceInfo->GetParticlePOIStream(); return _getPOIList(time, listOut, capacity, iterator, unk, particleNodes, xc_curTime, *x4_sourceInfo, @@ -162,8 +162,8 @@ u32 CAnimSourceReaderBase::VGetParticlePOIList(const CCharAnimTime& time, CParti return 0; } -u32 CAnimSourceReaderBase::VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, - u32 iterator, u32 unk) const { +size_t CAnimSourceReaderBase::VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { if (x4_sourceInfo->HasPOIData()) { const std::vector& soundNodes = x4_sourceInfo->GetSoundPOIStream(); return _getPOIList(time, listOut, capacity, iterator, unk, soundNodes, xc_curTime, *x4_sourceInfo, diff --git a/Runtime/Character/CAnimSourceReader.hpp b/Runtime/Character/CAnimSourceReader.hpp index 2628f3655..8509d1885 100644 --- a/Runtime/Character/CAnimSourceReader.hpp +++ b/Runtime/Character/CAnimSourceReader.hpp @@ -61,13 +61,13 @@ protected: public: CAnimSourceReaderBase(std::unique_ptr&& sourceInfo, const CCharAnimTime& time); - u32 VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, u32) const override; - u32 VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, - u32) const override; - u32 VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, u32 iterator, + size_t VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, size_t iterator, u32) const override; + size_t VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, size_t iterator, + u32) const override; + size_t VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, size_t iterator, + u32) const override; + size_t VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, size_t iterator, u32) const override; - u32 VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, - u32) const override; bool VGetBoolPOIState(std::string_view name) const override; s32 VGetInt32POIState(std::string_view name) const override; CParticleData::EParentedMode VGetParticlePOIState(std::string_view name) const override; diff --git a/Runtime/Character/CAnimTreeAnimReaderContainer.cpp b/Runtime/Character/CAnimTreeAnimReaderContainer.cpp index f508095a8..325205bb6 100644 --- a/Runtime/Character/CAnimTreeAnimReaderContainer.cpp +++ b/Runtime/Character/CAnimTreeAnimReaderContainer.cpp @@ -38,23 +38,23 @@ zeus::CQuaternion CAnimTreeAnimReaderContainer::VGetRotation(const CSegId& seg) return x14_reader->VGetRotation(seg); } -u32 CAnimTreeAnimReaderContainer::VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, - u32 iterator, u32 unk) const { +size_t CAnimTreeAnimReaderContainer::VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { return x14_reader->GetBoolPOIList(time, listOut, capacity, iterator, unk); } -u32 CAnimTreeAnimReaderContainer::VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, - u32 iterator, u32 unk) const { +size_t CAnimTreeAnimReaderContainer::VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, + size_t capacity, size_t iterator, u32 unk) const { return x14_reader->GetInt32POIList(time, listOut, capacity, iterator, unk); } -u32 CAnimTreeAnimReaderContainer::VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, - u32 capacity, u32 iterator, u32 unk) const { +size_t CAnimTreeAnimReaderContainer::VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, + size_t capacity, size_t iterator, u32 unk) const { return x14_reader->GetParticlePOIList(time, listOut, capacity, iterator, unk); } -u32 CAnimTreeAnimReaderContainer::VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, - u32 iterator, u32 unk) const { +size_t CAnimTreeAnimReaderContainer::VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, + size_t capacity, size_t iterator, u32 unk) const { return x14_reader->GetSoundPOIList(time, listOut, capacity, iterator, unk); } diff --git a/Runtime/Character/CAnimTreeAnimReaderContainer.hpp b/Runtime/Character/CAnimTreeAnimReaderContainer.hpp index 5df66319e..44d55afe0 100644 --- a/Runtime/Character/CAnimTreeAnimReaderContainer.hpp +++ b/Runtime/Character/CAnimTreeAnimReaderContainer.hpp @@ -30,13 +30,13 @@ public: bool VHasOffset(const CSegId& seg) const override; zeus::CVector3f VGetOffset(const CSegId& seg) const override; zeus::CQuaternion VGetRotation(const CSegId& seg) const override; - u32 VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, u32) const override; - u32 VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, - u32) const override; - u32 VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, u32 iterator, + size_t VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, size_t iterator, u32) const override; + size_t VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, size_t iterator, + u32) const override; + size_t VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, size_t iterator, + u32) const override; + size_t VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, size_t iterator, u32) const override; - u32 VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, - u32) const override; bool VGetBoolPOIState(std::string_view name) const override; s32 VGetInt32POIState(std::string_view name) const override; CParticleData::EParentedMode VGetParticlePOIState(std::string_view name) const override; diff --git a/Runtime/Character/CAnimTreeDoubleChild.cpp b/Runtime/Character/CAnimTreeDoubleChild.cpp index bd401390a..2a9d251c0 100644 --- a/Runtime/Character/CAnimTreeDoubleChild.cpp +++ b/Runtime/Character/CAnimTreeDoubleChild.cpp @@ -53,48 +53,52 @@ SAdvancementResults CAnimTreeDoubleChild::VAdvanceView(const CCharAnimTime& a) { return (resA.x0_remTime > resB.x0_remTime) ? resA : resB; } -u32 CAnimTreeDoubleChild::VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, - u32 unk) const { - u32 newCapacity = x14_a->GetBoolPOIList(time, listOut, capacity, iterator, unk); +size_t CAnimTreeDoubleChild::VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { + size_t newCapacity = x14_a->GetBoolPOIList(time, listOut, capacity, iterator, unk); newCapacity += x18_b->GetBoolPOIList(time, listOut, capacity, newCapacity + iterator, unk); - if (newCapacity > capacity) + if (newCapacity > capacity) { newCapacity = capacity; + } std::sort(listOut, listOut + newCapacity); return newCapacity; } -u32 CAnimTreeDoubleChild::VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, - u32 iterator, u32 unk) const { - u32 newCapacity = x14_a->GetInt32POIList(time, listOut, capacity, iterator, unk); +size_t CAnimTreeDoubleChild::VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { + size_t newCapacity = x14_a->GetInt32POIList(time, listOut, capacity, iterator, unk); newCapacity += x18_b->GetInt32POIList(time, listOut, capacity, newCapacity + iterator, unk); - if (newCapacity > capacity) + if (newCapacity > capacity) { newCapacity = capacity; + } std::sort(listOut, listOut + newCapacity); return newCapacity; } -u32 CAnimTreeDoubleChild::VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, - u32 iterator, u32 unk) const { - u32 newCapacity = x14_a->GetParticlePOIList(time, listOut, capacity, iterator, unk); +size_t CAnimTreeDoubleChild::VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { + size_t newCapacity = x14_a->GetParticlePOIList(time, listOut, capacity, iterator, unk); newCapacity += x18_b->GetParticlePOIList(time, listOut, capacity, newCapacity + iterator, unk); - if (newCapacity > capacity) + if (newCapacity > capacity) { newCapacity = capacity; + } std::sort(listOut, listOut + newCapacity); return newCapacity; } -u32 CAnimTreeDoubleChild::VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, - u32 iterator, u32 unk) const { - u32 newCapacity = x14_a->GetSoundPOIList(time, listOut, capacity, iterator, unk); +size_t CAnimTreeDoubleChild::VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { + size_t newCapacity = x14_a->GetSoundPOIList(time, listOut, capacity, iterator, unk); newCapacity += x18_b->GetSoundPOIList(time, listOut, capacity, newCapacity + iterator, unk); - if (newCapacity > capacity) + if (newCapacity > capacity) { newCapacity = capacity; + } std::sort(listOut, listOut + newCapacity); diff --git a/Runtime/Character/CAnimTreeDoubleChild.hpp b/Runtime/Character/CAnimTreeDoubleChild.hpp index aa54957c9..22ddbbb2b 100644 --- a/Runtime/Character/CAnimTreeDoubleChild.hpp +++ b/Runtime/Character/CAnimTreeDoubleChild.hpp @@ -34,13 +34,13 @@ public: CAnimTreeDoubleChild(const std::weak_ptr& a, const std::weak_ptr& b, std::string_view name); SAdvancementResults VAdvanceView(const CCharAnimTime& a) override; - u32 VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, u32) const override; - u32 VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, - u32) const override; - u32 VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, u32 iterator, + size_t VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, size_t iterator, u32) const override; + size_t VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, size_t iterator, + u32) const override; + size_t VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, size_t iterator, + u32) const override; + size_t VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, size_t iterator, u32) const override; - u32 VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, - u32) const override; bool VGetBoolPOIState(std::string_view name) const override; s32 VGetInt32POIState(std::string_view name) const override; CParticleData::EParentedMode VGetParticlePOIState(std::string_view name) const override; diff --git a/Runtime/Character/CAnimTreeLoopIn.cpp b/Runtime/Character/CAnimTreeLoopIn.cpp index c8dff7e74..b3c655cbb 100644 --- a/Runtime/Character/CAnimTreeLoopIn.cpp +++ b/Runtime/Character/CAnimTreeLoopIn.cpp @@ -57,26 +57,26 @@ std::unique_ptr CAnimTreeLoopIn::VClone() const { x20_animCtx, x4_name, x30_fundamentals, x88_curTime); } -u32 CAnimTreeLoopIn::VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, - u32 unk) const { +size_t CAnimTreeLoopIn::VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { return _getPOIList(time, listOut, capacity, iterator, unk, x30_fundamentals.GetBoolPointsOfInterest(), x88_curTime); } -u32 CAnimTreeLoopIn::VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, - u32 unk) const { +size_t CAnimTreeLoopIn::VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { return _getPOIList(time, listOut, capacity, iterator, unk, x30_fundamentals.GetInt32PointsOfInterest(), x88_curTime); } -u32 CAnimTreeLoopIn::VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, - u32 iterator, u32 unk) const { +size_t CAnimTreeLoopIn::VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { return _getPOIList(time, listOut, capacity, iterator, unk, x30_fundamentals.GetParticlePointsOfInterest(), x88_curTime); } -u32 CAnimTreeLoopIn::VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, - u32 unk) const { +size_t CAnimTreeLoopIn::VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { return _getPOIList(time, listOut, capacity, iterator, unk, x30_fundamentals.GetSoundPointsOfInterest(), x88_curTime); } diff --git a/Runtime/Character/CAnimTreeLoopIn.hpp b/Runtime/Character/CAnimTreeLoopIn.hpp index 29dc6202e..f1c30730a 100644 --- a/Runtime/Character/CAnimTreeLoopIn.hpp +++ b/Runtime/Character/CAnimTreeLoopIn.hpp @@ -30,13 +30,13 @@ public: std::optional> VSimplified() override; std::shared_ptr VGetBestUnblendedChild() const override; std::unique_ptr VClone() const override; - u32 VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, u32) const override; - u32 VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, - u32) const override; - u32 VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, u32 iterator, + size_t VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, size_t iterator, u32) const override; + size_t VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, size_t iterator, + u32) const override; + size_t VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, size_t iterator, + u32) const override; + size_t VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, size_t iterator, u32) const override; - u32 VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, - u32) const override; CSteadyStateAnimInfo VGetSteadyStateAnimInfo() const override; CCharAnimTime VGetTimeRemaining() const override; SAdvancementResults VAdvanceView(const CCharAnimTime& dt) override; diff --git a/Runtime/Character/CAnimTreeSequence.cpp b/Runtime/Character/CAnimTreeSequence.cpp index 0308eae34..782401c7b 100644 --- a/Runtime/Character/CAnimTreeSequence.cpp +++ b/Runtime/Character/CAnimTreeSequence.cpp @@ -93,24 +93,24 @@ CSteadyStateAnimInfo CAnimTreeSequence::VGetSteadyStateAnimInfo() const { return x3c_fundamentals.GetSteadyStateAnimInfo(); } -u32 CAnimTreeSequence::VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, - u32 unk) const { +size_t CAnimTreeSequence::VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { return _getPOIList(time, listOut, capacity, iterator, unk, x3c_fundamentals.GetBoolPointsOfInterest(), x94_curTime); } -u32 CAnimTreeSequence::VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, - u32 unk) const { +size_t CAnimTreeSequence::VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { return _getPOIList(time, listOut, capacity, iterator, unk, x3c_fundamentals.GetInt32PointsOfInterest(), x94_curTime); } -u32 CAnimTreeSequence::VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, - u32 iterator, u32 unk) const { +size_t CAnimTreeSequence::VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { return _getPOIList(time, listOut, capacity, iterator, unk, x3c_fundamentals.GetParticlePointsOfInterest(), x94_curTime); } -u32 CAnimTreeSequence::VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, - u32 unk) const { +size_t CAnimTreeSequence::VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { return _getPOIList(time, listOut, capacity, iterator, unk, x3c_fundamentals.GetSoundPointsOfInterest(), x94_curTime); } diff --git a/Runtime/Character/CAnimTreeSequence.hpp b/Runtime/Character/CAnimTreeSequence.hpp index 82e796982..56e038097 100644 --- a/Runtime/Character/CAnimTreeSequence.hpp +++ b/Runtime/Character/CAnimTreeSequence.hpp @@ -32,13 +32,13 @@ public: SAdvancementResults VAdvanceView(const CCharAnimTime& dt) override; CCharAnimTime VGetTimeRemaining() const override; CSteadyStateAnimInfo VGetSteadyStateAnimInfo() const override; - u32 VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, u32) const override; - u32 VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, - u32) const override; - u32 VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, u32 iterator, + size_t VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, size_t iterator, u32) const override; + size_t VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, size_t iterator, + u32) const override; + size_t VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, size_t iterator, + u32) const override; + size_t VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, size_t iterator, u32) const override; - u32 VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, - u32) const override; std::unique_ptr VClone() const override; }; diff --git a/Runtime/Character/CAnimTreeSingleChild.cpp b/Runtime/Character/CAnimTreeSingleChild.cpp index 258225459..0100c0797 100644 --- a/Runtime/Character/CAnimTreeSingleChild.cpp +++ b/Runtime/Character/CAnimTreeSingleChild.cpp @@ -15,23 +15,23 @@ zeus::CVector3f CAnimTreeSingleChild::VGetOffset(const CSegId& seg) const { retu zeus::CQuaternion CAnimTreeSingleChild::VGetRotation(const CSegId& seg) const { return x14_child->VGetRotation(seg); } -u32 CAnimTreeSingleChild::VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, - u32 unk) const { +size_t CAnimTreeSingleChild::VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { return x14_child->GetBoolPOIList(time, listOut, capacity, iterator, unk); } -u32 CAnimTreeSingleChild::VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, - u32 iterator, u32 unk) const { +size_t CAnimTreeSingleChild::VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { return x14_child->GetInt32POIList(time, listOut, capacity, iterator, unk); } -u32 CAnimTreeSingleChild::VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, - u32 iterator, u32 unk) const { +size_t CAnimTreeSingleChild::VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { return x14_child->GetParticlePOIList(time, listOut, capacity, iterator, unk); } -u32 CAnimTreeSingleChild::VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, - u32 iterator, u32 unk) const { +size_t CAnimTreeSingleChild::VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { return x14_child->GetSoundPOIList(time, listOut, capacity, iterator, unk); } diff --git a/Runtime/Character/CAnimTreeSingleChild.hpp b/Runtime/Character/CAnimTreeSingleChild.hpp index 801ef9e97..9ed59f795 100644 --- a/Runtime/Character/CAnimTreeSingleChild.hpp +++ b/Runtime/Character/CAnimTreeSingleChild.hpp @@ -20,13 +20,13 @@ public: bool VHasOffset(const CSegId& seg) const override; zeus::CVector3f VGetOffset(const CSegId& seg) const override; zeus::CQuaternion VGetRotation(const CSegId& seg) const override; - u32 VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, u32) const override; - u32 VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, - u32) const override; - u32 VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, u32 iterator, + size_t VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, size_t iterator, u32) const override; + size_t VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, size_t iterator, + u32) const override; + size_t VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, size_t iterator, + u32) const override; + size_t VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, size_t iterator, u32) const override; - u32 VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, - u32) const override; bool VGetBoolPOIState(std::string_view name) const override; s32 VGetInt32POIState(std::string_view name) const override; CParticleData::EParentedMode VGetParticlePOIState(std::string_view name) const override; diff --git a/Runtime/Character/CAnimTreeTimeScale.cpp b/Runtime/Character/CAnimTreeTimeScale.cpp index c1651e289..a7c2ecba1 100644 --- a/Runtime/Character/CAnimTreeTimeScale.cpp +++ b/Runtime/Character/CAnimTreeTimeScale.cpp @@ -59,43 +59,55 @@ std::optional> CAnimTreeTimeScale::VSimplified() { return std::nullopt; } -u32 CAnimTreeTimeScale::VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, - u32 unk) const { - CCharAnimTime useTime = (time == CCharAnimTime::Infinity()) ? x14_child->VGetTimeRemaining() : GetRealLifeTime(time); - u32 ret = x14_child->GetBoolPOIList(useTime, listOut, capacity, iterator, unk); - if (x28_targetAccelTime > CCharAnimTime()) - for (u32 i = 0; i < ret; ++i) +size_t CAnimTreeTimeScale::VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { + const CCharAnimTime useTime = + time == CCharAnimTime::Infinity() ? x14_child->VGetTimeRemaining() : GetRealLifeTime(time); + const size_t ret = x14_child->GetBoolPOIList(useTime, listOut, capacity, iterator, unk); + if (x28_targetAccelTime > CCharAnimTime()) { + for (size_t i = 0; i < ret; ++i) { listOut[iterator + i].SetTime(GetRealLifeTime(listOut[i].GetTime())); + } + } return ret; } -u32 CAnimTreeTimeScale::VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, - u32 unk) const { - CCharAnimTime useTime = (time == CCharAnimTime::Infinity()) ? x14_child->VGetTimeRemaining() : GetRealLifeTime(time); - u32 ret = x14_child->GetInt32POIList(useTime, listOut, capacity, iterator, unk); - if (x28_targetAccelTime > CCharAnimTime()) - for (u32 i = 0; i < ret; ++i) +size_t CAnimTreeTimeScale::VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { + const CCharAnimTime useTime = + time == CCharAnimTime::Infinity() ? x14_child->VGetTimeRemaining() : GetRealLifeTime(time); + const size_t ret = x14_child->GetInt32POIList(useTime, listOut, capacity, iterator, unk); + if (x28_targetAccelTime > CCharAnimTime()) { + for (size_t i = 0; i < ret; ++i) { listOut[iterator + i].SetTime(GetRealLifeTime(listOut[i].GetTime())); + } + } return ret; } -u32 CAnimTreeTimeScale::VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, - u32 iterator, u32 unk) const { - CCharAnimTime useTime = (time == CCharAnimTime::Infinity()) ? x14_child->VGetTimeRemaining() : GetRealLifeTime(time); - u32 ret = x14_child->GetParticlePOIList(useTime, listOut, capacity, iterator, unk); - if (x28_targetAccelTime > CCharAnimTime()) - for (u32 i = 0; i < ret; ++i) +size_t CAnimTreeTimeScale::VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { + const CCharAnimTime useTime = + time == CCharAnimTime::Infinity() ? x14_child->VGetTimeRemaining() : GetRealLifeTime(time); + const size_t ret = x14_child->GetParticlePOIList(useTime, listOut, capacity, iterator, unk); + if (x28_targetAccelTime > CCharAnimTime()) { + for (size_t i = 0; i < ret; ++i) { listOut[iterator + i].SetTime(GetRealLifeTime(listOut[i].GetTime())); + } + } return ret; } -u32 CAnimTreeTimeScale::VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, - u32 unk) const { - CCharAnimTime useTime = (time == CCharAnimTime::Infinity()) ? x14_child->VGetTimeRemaining() : GetRealLifeTime(time); - u32 ret = x14_child->GetSoundPOIList(useTime, listOut, capacity, iterator, unk); - if (x28_targetAccelTime > CCharAnimTime()) - for (u32 i = 0; i < ret; ++i) +size_t CAnimTreeTimeScale::VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { + const CCharAnimTime useTime = + (time == CCharAnimTime::Infinity()) ? x14_child->VGetTimeRemaining() : GetRealLifeTime(time); + const size_t ret = x14_child->GetSoundPOIList(useTime, listOut, capacity, iterator, unk); + if (x28_targetAccelTime > CCharAnimTime()) { + for (size_t i = 0; i < ret; ++i) { listOut[iterator + i].SetTime(GetRealLifeTime(listOut[i].GetTime())); + } + } return ret; } diff --git a/Runtime/Character/CAnimTreeTimeScale.hpp b/Runtime/Character/CAnimTreeTimeScale.hpp index 7439b55de..f591e10a6 100644 --- a/Runtime/Character/CAnimTreeTimeScale.hpp +++ b/Runtime/Character/CAnimTreeTimeScale.hpp @@ -27,13 +27,13 @@ public: void VSetPhase(float) override; std::optional> VSimplified() override; - u32 VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, u32) const override; - u32 VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, - u32) const override; - u32 VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, u32 iterator, + size_t VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, size_t iterator, u32) const override; + size_t VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, size_t iterator, + u32) const override; + size_t VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, size_t iterator, + u32) const override; + size_t VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, size_t iterator, u32) const override; - u32 VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, - u32) const override; bool VGetBoolPOIState(std::string_view name) const override; s32 VGetInt32POIState(std::string_view name) const override; CParticleData::EParentedMode VGetParticlePOIState(std::string_view name) const override; diff --git a/Runtime/Character/CPOINode.cpp b/Runtime/Character/CPOINode.cpp index cd631ad4e..07beb5ce5 100644 --- a/Runtime/Character/CPOINode.cpp +++ b/Runtime/Character/CPOINode.cpp @@ -36,22 +36,24 @@ bool CPOINode::operator>(const CPOINode& other) const { return x1c_time < other. bool CPOINode::operator<(const CPOINode& other) const { return x1c_time > other.x1c_time; } template -u32 _getPOIList(const CCharAnimTime& time, T* listOut, u32 capacity, u32 iterator, u32 unk1, - const std::vector& stream, const CCharAnimTime& curTime, const IAnimSourceInfo& animInfo, - u32 passedCount) { - u32 ret = 0; +size_t _getPOIList(const CCharAnimTime& time, T* listOut, size_t capacity, size_t iterator, u32 unk1, + const std::vector& stream, const CCharAnimTime& curTime, const IAnimSourceInfo& animInfo, + size_t passedCount) { + size_t ret = 0; if (animInfo.HasPOIData() && stream.size()) { - CCharAnimTime dur = animInfo.GetAnimationDuration(); + const CCharAnimTime dur = animInfo.GetAnimationDuration(); CCharAnimTime targetTime = curTime + time; - if (targetTime >= dur) + if (targetTime >= dur) { targetTime = dur; + } - if (passedCount >= stream.size()) + if (passedCount >= stream.size()) { return ret; + } CCharAnimTime nodeTime = stream[passedCount].GetTime(); while (passedCount < stream.size() && nodeTime <= targetTime) { - u32 idx = iterator + ret; + const size_t idx = iterator + ret; if (idx < capacity) { listOut[idx] = T::CopyNodeMinusStartTime(stream[passedCount], curTime); ++ret; @@ -65,17 +67,18 @@ u32 _getPOIList(const CCharAnimTime& time, T* listOut, u32 capacity, u32 iterato } template -u32 _getPOIList(const CCharAnimTime& time, T* listOut, u32 capacity, u32 iterator, u32 unk1, - const std::vector& stream, const CCharAnimTime& curTime) { - u32 ret = 0; +size_t _getPOIList(const CCharAnimTime& time, T* listOut, size_t capacity, size_t iterator, u32 unk1, + const std::vector& stream, const CCharAnimTime& curTime) { + size_t ret = 0; - CCharAnimTime targetTime = curTime + time; + const CCharAnimTime targetTime = curTime + time; - for (u32 it = iterator; it < stream.size(); ++it) { - CCharAnimTime nodeTime = stream[it].GetTime(); - if (nodeTime > targetTime) + for (size_t it = iterator; it < stream.size(); ++it) { + const CCharAnimTime nodeTime = stream[it].GetTime(); + if (nodeTime > targetTime) { return ret; - u32 idx = iterator + ret; + } + const size_t idx = iterator + ret; if (nodeTime >= curTime && idx < capacity) { listOut[idx] = T::CopyNodeMinusStartTime(stream[it], curTime); ++ret; @@ -85,32 +88,36 @@ u32 _getPOIList(const CCharAnimTime& time, T* listOut, u32 capacity, u32 iterato return ret; } -template u32 _getPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, - u32 unk1, const std::vector& stream, const CCharAnimTime& curTime, - const IAnimSourceInfo& animInfo, u32 passedCount); -template u32 _getPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, - u32 unk1, const std::vector& stream, const CCharAnimTime& curTime); +template size_t _getPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, + size_t iterator, u32 unk1, const std::vector& stream, + const CCharAnimTime& curTime, const IAnimSourceInfo& animInfo, + size_t passedCount); +template size_t _getPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, + size_t iterator, u32 unk1, const std::vector& stream, + const CCharAnimTime& curTime); -template u32 _getPOIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, - u32 unk1, const std::vector& stream, - const CCharAnimTime& curTime, const IAnimSourceInfo& animInfo, u32 passedCount); -template u32 _getPOIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, - u32 unk1, const std::vector& stream, - const CCharAnimTime& curTime); - -template u32 _getPOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, - u32 iterator, u32 unk1, const std::vector& stream, +template size_t _getPOIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, + size_t iterator, u32 unk1, const std::vector& stream, const CCharAnimTime& curTime, const IAnimSourceInfo& animInfo, - u32 passedCount); -template u32 _getPOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, - u32 iterator, u32 unk1, const std::vector& stream, + size_t passedCount); +template size_t _getPOIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, + size_t iterator, u32 unk1, const std::vector& stream, const CCharAnimTime& curTime); -template u32 _getPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, - u32 unk1, const std::vector& stream, - const CCharAnimTime& curTime, const IAnimSourceInfo& animInfo, u32 passedCount); -template u32 _getPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, - u32 unk1, const std::vector& stream, - const CCharAnimTime& curTime); +template size_t _getPOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, + size_t iterator, u32 unk1, const std::vector& stream, + const CCharAnimTime& curTime, const IAnimSourceInfo& animInfo, + size_t passedCount); +template size_t _getPOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, + size_t iterator, u32 unk1, const std::vector& stream, + const CCharAnimTime& curTime); + +template size_t _getPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, + size_t iterator, u32 unk1, const std::vector& stream, + const CCharAnimTime& curTime, const IAnimSourceInfo& animInfo, + size_t passedCount); +template size_t _getPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, + size_t iterator, u32 unk1, const std::vector& stream, + const CCharAnimTime& curTime); } // namespace urde diff --git a/Runtime/Character/CPOINode.hpp b/Runtime/Character/CPOINode.hpp index 3cc4c89b3..8c58fd4f7 100644 --- a/Runtime/Character/CPOINode.hpp +++ b/Runtime/Character/CPOINode.hpp @@ -53,12 +53,12 @@ public: }; template -u32 _getPOIList(const CCharAnimTime& time, T* listOut, u32 capacity, u32 iterator, u32 unk1, - const std::vector& stream, const CCharAnimTime& curTime, const IAnimSourceInfo& animInfo, - u32 passedCount); +size_t _getPOIList(const CCharAnimTime& time, T* listOut, size_t capacity, size_t iterator, u32 unk1, + const std::vector& stream, const CCharAnimTime& curTime, const IAnimSourceInfo& animInfo, + size_t passedCount); template -u32 _getPOIList(const CCharAnimTime& time, T* listOut, u32 capacity, u32 iterator, u32 unk1, - const std::vector& stream, const CCharAnimTime& curTime); +size_t _getPOIList(const CCharAnimTime& time, T* listOut, size_t capacity, size_t iterator, u32 unk1, + const std::vector& stream, const CCharAnimTime& curTime); } // namespace urde diff --git a/Runtime/Character/CSequenceHelper.cpp b/Runtime/Character/CSequenceHelper.cpp index 71325fa09..85adad75e 100644 --- a/Runtime/Character/CSequenceHelper.cpp +++ b/Runtime/Character/CSequenceHelper.cpp @@ -1,5 +1,7 @@ #include "Runtime/Character/CSequenceHelper.hpp" +#include + #include "Runtime/Character/CAnimSysContext.hpp" #include "Runtime/Character/CBoolPOINode.hpp" #include "Runtime/Character/CInt32POINode.hpp" @@ -45,37 +47,41 @@ CSequenceFundamentals CSequenceHelper::ComputeSequenceFundamentals() { if (x10_treeNodes.size() > 0) { std::shared_ptr node = CAnimTreeNode::Cast(x10_treeNodes[0]->Clone()); for (size_t i = 0; i < x10_treeNodes.size(); ++i) { - CBoolPOINode boolNodeArr[64]; - u32 numBools = node->GetBoolPOIList(CCharAnimTime::Infinity(), boolNodeArr, 64, 0, 0); + std::array boolNodeArr; + const size_t numBools = + node->GetBoolPOIList(CCharAnimTime::Infinity(), boolNodeArr.data(), boolNodeArr.size(), 0, 0); boolNodes.reserve(boolNodes.size() + numBools); - for (u32 j = 0; j < numBools; ++j) { + for (size_t j = 0; j < numBools; ++j) { CBoolPOINode& n = boolNodeArr[j]; n.SetTime(n.GetTime() + duration); boolNodes.push_back(n); } - CInt32POINode int32NodeArr[64]; - u32 numInt32s = node->GetInt32POIList(CCharAnimTime::Infinity(), int32NodeArr, 64, 0, 0); + std::array int32NodeArr; + const size_t numInt32s = + node->GetInt32POIList(CCharAnimTime::Infinity(), int32NodeArr.data(), int32NodeArr.size(), 0, 0); int32Nodes.reserve(int32Nodes.size() + numInt32s); - for (u32 j = 0; j < numInt32s; ++j) { + for (size_t j = 0; j < numInt32s; ++j) { CInt32POINode& n = int32NodeArr[j]; n.SetTime(n.GetTime() + duration); int32Nodes.push_back(n); } - CParticlePOINode particleNodeArr[64]; - u32 numParticles = node->GetParticlePOIList(CCharAnimTime::Infinity(), particleNodeArr, 64, 0, 0); + std::array particleNodeArr; + const size_t numParticles = + node->GetParticlePOIList(CCharAnimTime::Infinity(), particleNodeArr.data(), particleNodeArr.size(), 0, 0); particleNodes.reserve(particleNodes.size() + numParticles); - for (u32 j = 0; j < numParticles; ++j) { + for (size_t j = 0; j < numParticles; ++j) { CParticlePOINode& n = particleNodeArr[j]; n.SetTime(n.GetTime() + duration); particleNodes.push_back(n); } - CSoundPOINode soundNodeArr[64]; - u32 numSounds = node->GetSoundPOIList(CCharAnimTime::Infinity(), soundNodeArr, 64, 0, 0); + std::array soundNodeArr; + const size_t numSounds = + node->GetSoundPOIList(CCharAnimTime::Infinity(), soundNodeArr.data(), soundNodeArr.size(), 0, 0); soundNodes.reserve(soundNodes.size() + numSounds); - for (u32 j = 0; j < numSounds; ++j) { + for (size_t j = 0; j < numSounds; ++j) { CSoundPOINode& n = soundNodeArr[j]; n.SetTime(n.GetTime() + duration); soundNodes.push_back(n); diff --git a/Runtime/Character/IAnimReader.cpp b/Runtime/Character/IAnimReader.cpp index 4a4264343..fcb5f8009 100644 --- a/Runtime/Character/IAnimReader.cpp +++ b/Runtime/Character/IAnimReader.cpp @@ -22,31 +22,35 @@ SAdvancementResults IAnimReader::VGetAdvancementResults(const CCharAnimTime& a, return ret; } -u32 IAnimReader::GetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, - u32 unk) const { - if (time.GreaterThanZero()) +size_t IAnimReader::GetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, size_t iterator, + u32 unk) const { + if (time.GreaterThanZero()) { return VGetBoolPOIList(time, listOut, capacity, iterator, unk); + } return 0; } -u32 IAnimReader::GetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, - u32 unk) const { - if (time.GreaterThanZero()) - return VGetInt32POIList(time, listOut, capacity, iterator, unk); - return 0; -} - -u32 IAnimReader::GetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, u32 iterator, +size_t IAnimReader::GetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, size_t iterator, u32 unk) const { - if (time.GreaterThanZero()) - return VGetParticlePOIList(time, listOut, capacity, iterator, unk); + if (time.GreaterThanZero()) { + return VGetInt32POIList(time, listOut, capacity, iterator, unk); + } return 0; } -u32 IAnimReader::GetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, - u32 unk) const { - if (time.GreaterThanZero()) +size_t IAnimReader::GetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, + size_t iterator, u32 unk) const { + if (time.GreaterThanZero()) { + return VGetParticlePOIList(time, listOut, capacity, iterator, unk); + } + return 0; +} + +size_t IAnimReader::GetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, size_t iterator, + u32 unk) const { + if (time.GreaterThanZero()) { return VGetSoundPOIList(time, listOut, capacity, iterator, unk); + } return 0; } diff --git a/Runtime/Character/IAnimReader.hpp b/Runtime/Character/IAnimReader.hpp index 59f7e1df9..eb005e741 100644 --- a/Runtime/Character/IAnimReader.hpp +++ b/Runtime/Character/IAnimReader.hpp @@ -114,14 +114,14 @@ public: virtual bool VHasOffset(const CSegId& seg) const = 0; virtual zeus::CVector3f VGetOffset(const CSegId& seg) const = 0; virtual zeus::CQuaternion VGetRotation(const CSegId& seg) const = 0; - virtual u32 VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, - u32) const = 0; - virtual u32 VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, - u32) const = 0; - virtual u32 VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, u32 iterator, + virtual size_t VGetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, size_t iterator, + u32) const = 0; + virtual size_t VGetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, size_t iterator, + u32) const = 0; + virtual size_t VGetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, size_t iterator, + u32) const = 0; + virtual size_t VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, size_t iterator, u32) const = 0; - virtual u32 VGetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, - u32) const = 0; virtual bool VGetBoolPOIState(std::string_view name) const = 0; virtual s32 VGetInt32POIState(std::string_view name) const = 0; virtual CParticleData::EParentedMode VGetParticlePOIState(std::string_view name) const = 0; @@ -133,10 +133,13 @@ public: virtual void VSetPhase(float) = 0; virtual SAdvancementResults VGetAdvancementResults(const CCharAnimTime& a, const CCharAnimTime& b) const; - u32 GetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, u32 capacity, u32 iterator, u32) const; - u32 GetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, u32 capacity, u32 iterator, u32) const; - u32 GetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, u32 capacity, u32 iterator, u32) const; - u32 GetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, u32 capacity, u32 iterator, u32) const; + size_t GetBoolPOIList(const CCharAnimTime& time, CBoolPOINode* listOut, size_t capacity, size_t iterator, u32) const; + size_t GetInt32POIList(const CCharAnimTime& time, CInt32POINode* listOut, size_t capacity, size_t iterator, + u32) const; + size_t GetParticlePOIList(const CCharAnimTime& time, CParticlePOINode* listOut, size_t capacity, size_t iterator, + u32) const; + size_t GetSoundPOIList(const CCharAnimTime& time, CSoundPOINode* listOut, size_t capacity, size_t iterator, + u32) const; std::optional> Simplified() { return VSimplified(); } diff --git a/Runtime/Character/IMetaAnim.cpp b/Runtime/Character/IMetaAnim.cpp index 22c3715a1..58a350985 100644 --- a/Runtime/Character/IMetaAnim.cpp +++ b/Runtime/Character/IMetaAnim.cpp @@ -1,5 +1,7 @@ #include "Runtime/Character/IMetaAnim.hpp" +#include + #include "Runtime/Character/CAnimTreeNode.hpp" #include "Runtime/Character/CBoolPOINode.hpp" #include "Runtime/Character/CCharAnimTime.hpp" @@ -29,17 +31,19 @@ void IMetaAnim::AdvanceAnim(IAnimReader& anim, const CCharAnimTime& dt) { } CCharAnimTime IMetaAnim::GetTime(const CPreAdvanceIndicator& ind, const IAnimReader& anim) { - if (ind.IsTime()) + if (ind.IsTime()) { return ind.GetTime(); + } - CBoolPOINode nodes[64]; - CCharAnimTime rem = anim.VGetTimeRemaining(); - u32 count = anim.VGetBoolPOIList(rem, nodes, 64, 0, 0); + std::array nodes; + const CCharAnimTime rem = anim.VGetTimeRemaining(); + const size_t count = anim.VGetBoolPOIList(rem, nodes.data(), nodes.size(), 0, 0); const char* cmpStr = ind.GetString(); - for (u32 i = 0; i < count; ++i) { - CBoolPOINode& node = nodes[i]; - if (node.GetString() != cmpStr || !node.GetValue()) + for (size_t i = 0; i < count; ++i) { + const CBoolPOINode& node = nodes[i]; + if (node.GetString() != cmpStr || !node.GetValue()) { continue; + } return node.GetTime(); } From 0414235e765d4169e9cf4b4a0fc4ecb9a36d4c26 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 10 Apr 2020 23:51:16 -0400 Subject: [PATCH 046/224] CTransitionDatabaseGame: Tidy up GetMetaTrans() We can leverage auto here to make the lambda functions significantly less verbose. --- Runtime/Character/CTransitionDatabaseGame.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Runtime/Character/CTransitionDatabaseGame.cpp b/Runtime/Character/CTransitionDatabaseGame.cpp index c29369ce4..37a09bbdc 100644 --- a/Runtime/Character/CTransitionDatabaseGame.cpp +++ b/Runtime/Character/CTransitionDatabaseGame.cpp @@ -27,14 +27,18 @@ CTransitionDatabaseGame::CTransitionDatabaseGame(const std::vector& } const std::shared_ptr& CTransitionDatabaseGame::GetMetaTrans(u32 a, u32 b) const { - auto it = rstl::binary_find(x14_transitions.cbegin(), x14_transitions.cend(), std::make_pair(a, b), - [](const std::pair, std::shared_ptr>& p) { return p.first; }); - if (it != x14_transitions.cend()) + const auto it = rstl::binary_find(x14_transitions.cbegin(), x14_transitions.cend(), std::make_pair(a, b), + [](const auto& p) { return p.first; }); + if (it != x14_transitions.cend()) { return it->second; - auto it2 = rstl::binary_find(x24_halfTransitions.cbegin(), x24_halfTransitions.cend(), b, - [](const std::pair>& p) { return p.first; }); - if (it2 != x24_halfTransitions.cend()) + } + + const auto it2 = rstl::binary_find(x24_halfTransitions.cbegin(), x24_halfTransitions.cend(), b, + [](const auto& p) { return p.first; }); + if (it2 != x24_halfTransitions.cend()) { return it2->second; + } + return x10_defaultTrans; } From c7ca8dc3a746c0f4c7ccbc3ce5c701f35b707cf2 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sat, 11 Apr 2020 00:39:49 -0400 Subject: [PATCH 047/224] Runtime/Particle: Replace bitfield unions with constructor initializers --- Runtime/Particle/CDecal.cpp | 2 +- Runtime/Particle/CDecal.hpp | 22 +++------ Runtime/Particle/CDecalDescription.hpp | 11 ++--- Runtime/Particle/CElementGen.cpp | 19 ++++++-- Runtime/Particle/CElementGen.hpp | 33 +++++-------- Runtime/Particle/CGenDescription.hpp | 63 +++++++++++++++---------- Runtime/Particle/CParticleElectric.cpp | 11 +++-- Runtime/Particle/CParticleElectric.hpp | 18 +++---- Runtime/Particle/CParticleSwoosh.cpp | 12 ++++- Runtime/Particle/CParticleSwoosh.hpp | 24 ++++------ Runtime/Particle/CSwooshDescription.hpp | 40 +++++++++------- 11 files changed, 134 insertions(+), 121 deletions(-) diff --git a/Runtime/Particle/CDecal.cpp b/Runtime/Particle/CDecal.cpp index c18156852..a5c3d41b8 100644 --- a/Runtime/Particle/CDecal.cpp +++ b/Runtime/Particle/CDecal.cpp @@ -9,7 +9,7 @@ CRandom16 CDecal::sDecalRandom; bool CDecal::sMoveRedToAlphaBuffer = false; CDecal::CDecal(const TToken& desc, const zeus::CTransform& xf) -: x0_description(desc), xc_transform(xf) { +: x0_description(desc), xc_transform(xf), x5c_29_modelInvalid(false) { CGlobalRandom gr(sDecalRandom); CDecalDescription& desco = *x0_description; diff --git a/Runtime/Particle/CDecal.hpp b/Runtime/Particle/CDecal.hpp index 224658da1..6417e052e 100644 --- a/Runtime/Particle/CDecal.hpp +++ b/Runtime/Particle/CDecal.hpp @@ -13,17 +13,12 @@ namespace urde { struct SQuadDescr; struct CQuadDecal { - union { - struct { - bool x0_24_invalid : 1; - }; - u32 _dummy = 0; - }; + bool x0_24_invalid : 1; s32 x4_lifetime = 0; float x8_rotation = 0.f; const SQuadDescr* m_desc = nullptr; - CQuadDecal() = default; - CQuadDecal(s32 i, float f) : x4_lifetime(i), x8_rotation(f) { x0_24_invalid = true; } + CQuadDecal() : x0_24_invalid(true) {} + CQuadDecal(s32 i, float f) : x0_24_invalid(true), x4_lifetime(i), x8_rotation(f) {} boo::ObjToken m_instBuf; boo::ObjToken m_uniformBuf; @@ -41,14 +36,9 @@ class CDecal { std::array x3c_decalQuads; s32 x54_modelLifetime = 0; s32 x58_frameIdx = 0; - union { - struct { - bool x5c_31_quad1Invalid : 1; - bool x5c_30_quad2Invalid : 1; - bool x5c_29_modelInvalid : 1; - }; - u32 x5c_dummy = 0; - }; + bool x5c_31_quad1Invalid : 1; + bool x5c_30_quad2Invalid : 1; + bool x5c_29_modelInvalid : 1; zeus::CVector3f x60_rotation; bool InitQuad(CQuadDecal& quad, const SQuadDescr& desc); diff --git a/Runtime/Particle/CDecalDescription.hpp b/Runtime/Particle/CDecalDescription.hpp index ff1d74afa..7d0038a2e 100644 --- a/Runtime/Particle/CDecalDescription.hpp +++ b/Runtime/Particle/CDecalDescription.hpp @@ -23,6 +23,8 @@ struct SQuadDescr { class CDecalDescription { public: + CDecalDescription() : x5c_24_DMAB(false), x5c_25_DMOO(false) {} + SQuadDescr x0_Quads[2]; SParticleModel x38_DMDL; std::unique_ptr x48_DLFT; @@ -30,13 +32,8 @@ public: std::unique_ptr x50_DMRT; std::unique_ptr x54_DMSC; std::unique_ptr x58_DMCL; - union { - struct { - bool x5c_24_DMAB : 1; - bool x5c_25_DMOO : 1; - }; - u32 dummy = 0; - }; + bool x5c_24_DMAB : 1; + bool x5c_25_DMOO : 1; }; } // namespace urde diff --git a/Runtime/Particle/CElementGen.cpp b/Runtime/Particle/CElementGen.cpp index 1353886a9..479d44e56 100644 --- a/Runtime/Particle/CElementGen.cpp +++ b/Runtime/Particle/CElementGen.cpp @@ -54,12 +54,25 @@ void CElementGen::Initialize() { void CElementGen::Shutdown() { CElementGenShaders::Shutdown(); } CElementGen::CElementGen(TToken gen, EModelOrientationType orientType, EOptionalSystemFlags flags) -: x1c_genDesc(std::move(gen)), x2c_orientType(orientType), x27c_randState(x94_randomSeed) { +: x1c_genDesc(std::move(gen)) +, x2c_orientType(orientType) +, x26c_24_translationDirty(false) +, x26c_25_LIT_(false) +, x26c_26_AAPH(false) +, x26c_27_ZBUF(false) +, x26c_28_zTest(false) +, x26c_29_ORNT(false) +, x26c_30_MBLR(false) +, x26c_31_LINE(false) +, x26d_24_FXLL(false) +, x26d_25_warmedUp(false) +, x26d_26_modelsUseLights(false) +, x26d_27_enableOPTS(True(flags & EOptionalSystemFlags::Two)) +, x26d_28_enableADV(false) +, x27c_randState(x94_randomSeed) { CGenDescription* desc = x1c_genDesc.GetObj(); x28_loadedGenDesc = desc; - x26d_27_enableOPTS = True(flags & EOptionalSystemFlags::Two); - if (desc->x54_x40_TEXR) desc->x54_x40_TEXR->GetValueTexture(0).GetObj(); if (desc->x58_x44_TIND) diff --git a/Runtime/Particle/CElementGen.hpp b/Runtime/Particle/CElementGen.hpp index 26ec47598..6e585539a 100644 --- a/Runtime/Particle/CElementGen.hpp +++ b/Runtime/Particle/CElementGen.hpp @@ -87,26 +87,19 @@ private: u32 x260_cumulativeParticles = 0; u32 x264_recursiveParticleCount = 0; int x268_PSLT; - - union { - struct { - bool x26c_24_translationDirty : 1; - bool x26c_25_LIT_ : 1; - bool x26c_26_AAPH : 1; - bool x26c_27_ZBUF : 1; - bool x26c_28_zTest : 1; - bool x26c_29_ORNT : 1; - bool x26c_30_MBLR : 1; - bool x26c_31_LINE : 1; - bool x26d_24_FXLL : 1; - bool x26d_25_warmedUp : 1; - bool x26d_26_modelsUseLights : 1; - bool x26d_27_enableOPTS : 1; - bool x26d_28_enableADV : 1; - }; - u32 _dummy = 0; - }; - + bool x26c_24_translationDirty : 1; + bool x26c_25_LIT_ : 1; + bool x26c_26_AAPH : 1; + bool x26c_27_ZBUF : 1; + bool x26c_28_zTest : 1; + bool x26c_29_ORNT : 1; + bool x26c_30_MBLR : 1; + bool x26c_31_LINE : 1; + bool x26d_24_FXLL : 1; + bool x26d_25_warmedUp : 1; + bool x26d_26_modelsUseLights : 1; + bool x26d_27_enableOPTS : 1; + bool x26d_28_enableADV : 1; int x270_MBSP = 0; int m_maxMBSP = 0; ERglLightBits x274_backupLightActive = ERglLightBits::None; diff --git a/Runtime/Particle/CGenDescription.hpp b/Runtime/Particle/CGenDescription.hpp index bde4b376d..5661d62c4 100644 --- a/Runtime/Particle/CGenDescription.hpp +++ b/Runtime/Particle/CGenDescription.hpp @@ -39,30 +39,25 @@ public: // std::unique_ptr x38_ILOC; // std::unique_ptr x3c_IVEC; std::unique_ptr x40_x2c_EMTR; - union { - struct { - bool x44_28_x30_28_SORT : 1; - bool x44_30_x31_24_MBLR : 1; - bool x44_24_x30_24_LINE : 1; - bool x44_29_x30_29_LIT_ : 1; - bool x44_26_x30_26_AAPH : 1; - bool x44_27_x30_27_ZBUF : 1; - bool x44_25_x30_25_FXLL : 1; - bool x44_31_x31_25_PMAB : 1; - bool x45_29_x31_31_VMD4 : 1; - bool x45_28_x31_30_VMD3 : 1; - bool x45_27_x31_29_VMD2 : 1; - bool x45_26_x31_28_VMD1 : 1; - bool x45_31_x32_25_OPTS : 1; - bool x45_24_x31_26_PMUS : 1; - bool x45_25_x31_27_PMOO : 1; - bool x45_30_x32_24_CIND : 1; - /* 0-00 additions */ - bool x30_30_ORNT : 1; - bool x30_31_RSOP : 1; - }; - u32 dummy1 = 0; - }; + bool x44_28_x30_28_SORT : 1; + bool x44_30_x31_24_MBLR : 1; + bool x44_24_x30_24_LINE : 1; + bool x44_29_x30_29_LIT_ : 1; + bool x44_26_x30_26_AAPH : 1; + bool x44_27_x30_27_ZBUF : 1; + bool x44_25_x30_25_FXLL : 1; + bool x44_31_x31_25_PMAB : 1; + bool x45_29_x31_31_VMD4 : 1; + bool x45_28_x31_30_VMD3 : 1; + bool x45_27_x31_29_VMD2 : 1; + bool x45_26_x31_28_VMD1 : 1; + bool x45_31_x32_25_OPTS : 1; + bool x45_24_x31_26_PMUS : 1; + bool x45_25_x31_27_PMOO : 1; + bool x45_30_x32_24_CIND : 1; + /* 0-00 additions */ + bool x30_30_ORNT : 1; + bool x30_31_RSOP : 1; std::unique_ptr x48_x34_MBSP; std::unique_ptr x4c_x38_SIZE; std::unique_ptr x50_x3c_ROTA; @@ -112,7 +107,25 @@ public: /* Custom additions */ std::unique_ptr m_bevelGradient; /* FourCC BGCL */ - CGenDescription() { x45_25_x31_27_PMOO = true; } + CGenDescription() + : x44_28_x30_28_SORT(false) + , x44_30_x31_24_MBLR(false) + , x44_24_x30_24_LINE(false) + , x44_29_x30_29_LIT_(false) + , x44_26_x30_26_AAPH(false) + , x44_27_x30_27_ZBUF(false) + , x44_25_x30_25_FXLL(false) + , x44_31_x31_25_PMAB(false) + , x45_29_x31_31_VMD4(false) + , x45_28_x31_30_VMD3(false) + , x45_27_x31_29_VMD2(false) + , x45_26_x31_28_VMD1(false) + , x45_31_x32_25_OPTS(false) + , x45_24_x31_26_PMUS(false) + , x45_25_x31_27_PMOO(true) + , x45_30_x32_24_CIND(false) + , x30_30_ORNT(false) + , x30_31_RSOP(false) {} }; } // namespace urde diff --git a/Runtime/Particle/CParticleElectric.cpp b/Runtime/Particle/CParticleElectric.cpp index 355b8aaaa..679f6a773 100644 --- a/Runtime/Particle/CParticleElectric.cpp +++ b/Runtime/Particle/CParticleElectric.cpp @@ -19,11 +19,16 @@ namespace urde { u16 CParticleElectric::g_GlobalSeed = 99; CParticleElectric::CParticleElectric(const TToken& token) -: x1c_elecDesc(token), x14c_randState(g_GlobalSeed++) { +: x1c_elecDesc(token) +, x14c_randState(g_GlobalSeed++) +, x450_24_emitting(true) +, x450_25_haveGPSM(false) +, x450_26_haveEPSM(false) +, x450_27_haveSSWH(false) +, x450_28_haveLWD(false) +, x450_29_transformDirty(true) { x1bc_allocated.resize(32); - x450_24_emitting = true; - x450_29_transformDirty = true; CElectricDescription* desc = x1c_elecDesc.GetObj(); if (CIntElement* sseg = desc->x10_SSEG.get()) diff --git a/Runtime/Particle/CParticleElectric.hpp b/Runtime/Particle/CParticleElectric.hpp index 880ec2be3..d69e66f86 100644 --- a/Runtime/Particle/CParticleElectric.hpp +++ b/Runtime/Particle/CParticleElectric.hpp @@ -85,22 +85,16 @@ private: std::vector x420_calculatedVerts; std::vector x430_fractalMags; std::vector x440_fractalOffsets; + bool x450_24_emitting : 1; + bool x450_25_haveGPSM : 1; + bool x450_26_haveEPSM : 1; + bool x450_27_haveSSWH : 1; + bool x450_28_haveLWD : 1; + bool x450_29_transformDirty : 1; size_t m_nextLineRenderer = 0; std::vector> m_lineRenderers; - union { - struct { - bool x450_24_emitting : 1; - bool x450_25_haveGPSM : 1; - bool x450_26_haveEPSM : 1; - bool x450_27_haveSSWH : 1; - bool x450_28_haveLWD : 1; - bool x450_29_transformDirty : 1; - }; - u32 dummy = 0; - }; - void SetupLineGXMaterial(); void DrawLineStrip(const std::vector& verts, float width, const zeus::CColor& color); void RenderLines(); diff --git a/Runtime/Particle/CParticleSwoosh.cpp b/Runtime/Particle/CParticleSwoosh.cpp index 6ab26b711..2017a328d 100644 --- a/Runtime/Particle/CParticleSwoosh.cpp +++ b/Runtime/Particle/CParticleSwoosh.cpp @@ -16,8 +16,16 @@ CParticleSwoosh::CParticleSwoosh(const TToken& desc, int len , x1c0_rand(x1c_desc->x45_26_CRND ? std::chrono::duration_cast( std::chrono::steady_clock::now().time_since_epoch()) .count() - : 99) { - x1d0_24_emitting = true; + : 99) +, x1d0_24_emitting(true) +, x1d0_25_AALP(false) +, x1d0_26_forceOneUpdate(false) +, x1d0_27_renderGaps(false) +, x1d0_28_LLRD(false) +, x1d0_29_VLS1(false) +, x1d0_30_VLS2(false) +, x1d0_31_constantTex(false) +, x1d1_24_constantUv(false) { ++g_ParticleSystemAliveCount; if (leng > 0) diff --git a/Runtime/Particle/CParticleSwoosh.hpp b/Runtime/Particle/CParticleSwoosh.hpp index ed421eeca..e913e1ec8 100644 --- a/Runtime/Particle/CParticleSwoosh.hpp +++ b/Runtime/Particle/CParticleSwoosh.hpp @@ -83,21 +83,15 @@ class CParticleSwoosh : public CParticleGen { float x1c4_ = 0.f; float x1c8_ = 0.f; float x1cc_TSPN; - - union { - struct { - bool x1d0_24_emitting : 1; - bool x1d0_25_AALP : 1; - bool x1d0_26_forceOneUpdate : 1; - bool x1d0_27_renderGaps : 1; - bool x1d0_28_LLRD : 1; - bool x1d0_29_VLS1 : 1; - bool x1d0_30_VLS2 : 1; - bool x1d0_31_constantTex : 1; - bool x1d1_24_constantUv : 1; - }; - u32 _dummy = 0; - }; + bool x1d0_24_emitting : 1; + bool x1d0_25_AALP : 1; + bool x1d0_26_forceOneUpdate : 1; + bool x1d0_27_renderGaps : 1; + bool x1d0_28_LLRD : 1; + bool x1d0_29_VLS1 : 1; + bool x1d0_30_VLS2 : 1; + bool x1d0_31_constantTex : 1; + bool x1d1_24_constantUv : 1; SUVElementSet x1d4_uvs = {}; CTexture* x1e4_tex = nullptr; diff --git a/Runtime/Particle/CSwooshDescription.hpp b/Runtime/Particle/CSwooshDescription.hpp index 084ac1971..67217d80f 100644 --- a/Runtime/Particle/CSwooshDescription.hpp +++ b/Runtime/Particle/CSwooshDescription.hpp @@ -31,23 +31,29 @@ public: std::unique_ptr x38_SPLN; std::unique_ptr x3c_TEXR; std::unique_ptr x40_TSPN; - union { - struct { - bool x44_24_LLRD : 1; - bool x44_25_CROS : 1; - bool x44_26_VLS1 : 1; - bool x44_27_VLS2 : 1; - bool x44_28_SROT : 1; - bool x44_29_WIRE : 1; - bool x44_30_TEXW : 1; - bool x44_31_AALP : 1; - bool x45_24_ZBUF : 1; - bool x45_25_ORNT : 1; - bool x45_26_CRND : 1; - }; - u32 dummy = 0; - }; + bool x44_24_LLRD : 1; + bool x44_25_CROS : 1; + bool x44_26_VLS1 : 1; + bool x44_27_VLS2 : 1; + bool x44_28_SROT : 1; + bool x44_29_WIRE : 1; + bool x44_30_TEXW : 1; + bool x44_31_AALP : 1; + bool x45_24_ZBUF : 1; + bool x45_25_ORNT : 1; + bool x45_26_CRND : 1; - CSwooshDescription() { x44_25_CROS = true; } + CSwooshDescription() + : x44_24_LLRD(false) + , x44_25_CROS(true) + , x44_26_VLS1(false) + , x44_27_VLS2(false) + , x44_28_SROT(false) + , x44_29_WIRE(false) + , x44_30_TEXW(false) + , x44_31_AALP(false) + , x45_24_ZBUF(false) + , x45_25_ORNT(false) + , x45_26_CRND(false) {} }; } // namespace urde From 22880abb7e706558aa76187a38483998709b9ee4 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sat, 11 Apr 2020 00:49:02 -0400 Subject: [PATCH 048/224] Runtime/Weapon: Replace bitfield unions with constructor initializers --- Runtime/Weapon/CBurstFire.cpp | 3 +- Runtime/Weapon/CBurstFire.hpp | 9 +-- Runtime/Weapon/CEnergyProjectile.cpp | 12 ++-- Runtime/Weapon/CEnergyProjectile.hpp | 13 ++--- Runtime/Weapon/CFlameThrower.cpp | 6 +- Runtime/Weapon/CFlameThrower.hpp | 14 ++--- Runtime/Weapon/CGSComboFire.hpp | 12 ++-- Runtime/Weapon/CGameProjectile.cpp | 21 +++---- Runtime/Weapon/CGameProjectile.hpp | 19 +++---- Runtime/Weapon/CGrappleArm.cpp | 8 ++- Runtime/Weapon/CGrappleArm.hpp | 17 ++---- Runtime/Weapon/CGunWeapon.cpp | 8 ++- Runtime/Weapon/CGunWeapon.hpp | 19 +++---- Runtime/Weapon/CPlasmaProjectile.cpp | 14 +++-- Runtime/Weapon/CPlasmaProjectile.hpp | 17 ++---- Runtime/Weapon/CPlayerGun.cpp | 37 ++++++++++-- Runtime/Weapon/CPlayerGun.hpp | 84 +++++++++++++--------------- Runtime/Weapon/CProjectileWeapon.cpp | 11 +++- Runtime/Weapon/CProjectileWeapon.hpp | 21 +++---- 19 files changed, 174 insertions(+), 171 deletions(-) diff --git a/Runtime/Weapon/CBurstFire.cpp b/Runtime/Weapon/CBurstFire.cpp index fe5af34e8..4d0cc7334 100644 --- a/Runtime/Weapon/CBurstFire.cpp +++ b/Runtime/Weapon/CBurstFire.cpp @@ -9,7 +9,8 @@ #include namespace urde { -CBurstFire::CBurstFire(const SBurst* const* burstDefs, s32 firstBurstCount) : x10_firstBurstCounter(firstBurstCount) { +CBurstFire::CBurstFire(const SBurst* const* burstDefs, s32 firstBurstCount) +: x10_firstBurstCounter(firstBurstCount), x14_24_shouldFire(false), x14_25_avoidAccuracy(false) { while (*burstDefs) { x1c_burstDefs.push_back(*burstDefs); ++burstDefs; diff --git a/Runtime/Weapon/CBurstFire.hpp b/Runtime/Weapon/CBurstFire.hpp index a46bed4fd..3ed99890a 100644 --- a/Runtime/Weapon/CBurstFire.hpp +++ b/Runtime/Weapon/CBurstFire.hpp @@ -23,13 +23,8 @@ class CBurstFire { float x8_timeToNextShot = 0.f; s32 xc_firstBurstIdx = 0; s32 x10_firstBurstCounter; - union { - struct { - bool x14_24_shouldFire : 1; - bool x14_25_avoidAccuracy : 1; - }; - u32 _dummy = 0; - }; + bool x14_24_shouldFire : 1; + bool x14_25_avoidAccuracy : 1; const SBurst* x18_curBursts = nullptr; rstl::reserved_vector x1c_burstDefs; diff --git a/Runtime/Weapon/CEnergyProjectile.cpp b/Runtime/Weapon/CEnergyProjectile.cpp index cfc6e12d0..bd0c83d8f 100644 --- a/Runtime/Weapon/CEnergyProjectile.cpp +++ b/Runtime/Weapon/CEnergyProjectile.cpp @@ -20,13 +20,17 @@ CEnergyProjectile::CEnergyProjectile(bool active, const TToken>& visorParticle, - u16 visorSfx, bool sendCollideMsg) + const std::optional>& visorParticle, u16 visorSfx, + bool sendCollideMsg) : CGameProjectile(active, desc, "GameProjectile", type, xf, excludeMat, damage, uid, aid, owner, homingTarget, attribs, underwater, scale, visorParticle, visorSfx, sendCollideMsg) -, x2ec_dir(xf.basis[1]) +, x2ec_dir(xf.frontVector()) , x2f8_mag(x2ec_dir.magnitude()) -, x2fc_camShake(CCameraShakeData::BuildProjectileCameraShake(0.5f, 0.75f)) { +, x2fc_camShake(CCameraShakeData::BuildProjectileCameraShake(0.5f, 0.75f)) +, x3d0_24_dead(false) +, x3d0_25_(false) +, x3d0_26_(false) +, x3d0_27_camShakeDirty(false) { xe6_27_thermalVisorFlags = 2; } diff --git a/Runtime/Weapon/CEnergyProjectile.hpp b/Runtime/Weapon/CEnergyProjectile.hpp index 6156e0e0f..0413f086a 100644 --- a/Runtime/Weapon/CEnergyProjectile.hpp +++ b/Runtime/Weapon/CEnergyProjectile.hpp @@ -10,15 +10,10 @@ class CEnergyProjectile : public CGameProjectile { zeus::CVector3f x2ec_dir; float x2f8_mag; CCameraShakeData x2fc_camShake; - union { - struct { - bool x3d0_24_dead : 1; - bool x3d0_25_ : 1; - bool x3d0_26_ : 1; - bool x3d0_27_camShakeDirty : 1; - }; - u32 _dummy = 0; - }; + bool x3d0_24_dead : 1; + bool x3d0_25_ : 1; + bool x3d0_26_ : 1; + bool x3d0_27_camShakeDirty : 1; float x3d4_curTime = 0.f; void StopProjectile(CStateManager& mgr); diff --git a/Runtime/Weapon/CFlameThrower.cpp b/Runtime/Weapon/CFlameThrower.cpp index 154c80e31..14d8b799a 100644 --- a/Runtime/Weapon/CFlameThrower.cpp +++ b/Runtime/Weapon/CFlameThrower.cpp @@ -33,10 +33,8 @@ CFlameThrower::CFlameThrower(const TToken& wDesc, std::strin , x3fc_playerIceTxtr(playerIceTxtr) , x400_24_active(false) , x400_25_particlesActive(false) -, x400_26_(!(flameInfo.GetAttributes() & 1)) -, x400_27_coneCollision((flameInfo.GetAttributes() & 0x2) != 0) { - -} +, x400_26_((flameInfo.GetAttributes() & 1) == 0) +, x400_27_coneCollision((flameInfo.GetAttributes() & 0x2) != 0) {} void CFlameThrower::Accept(IVisitor& visitor) { visitor.Visit(this); } diff --git a/Runtime/Weapon/CFlameThrower.hpp b/Runtime/Weapon/CFlameThrower.hpp index 423f8e7d4..2b824cc40 100644 --- a/Runtime/Weapon/CFlameThrower.hpp +++ b/Runtime/Weapon/CFlameThrower.hpp @@ -31,16 +31,10 @@ private: CAssetId x3f4_playerSteamTxtr; s16 x3f8_playerHitSfx; CAssetId x3fc_playerIceTxtr; - - union { - struct { - bool x400_24_active : 1; - bool x400_25_particlesActive : 1; - bool x400_26_ : 1; - bool x400_27_coneCollision : 1; /* Z-sort and finer collision detection */ - }; - u32 _dummy = 0; - }; + bool x400_24_active : 1; + bool x400_25_particlesActive : 1; + bool x400_26_ : 1; + bool x400_27_coneCollision : 1; /* Z-sort and finer collision detection */ void CreateFlameParticles(CStateManager&); void SetFlameLightActive(CStateManager&, bool); diff --git a/Runtime/Weapon/CGSComboFire.hpp b/Runtime/Weapon/CGSComboFire.hpp index bdac15732..2c789475d 100644 --- a/Runtime/Weapon/CGSComboFire.hpp +++ b/Runtime/Weapon/CGSComboFire.hpp @@ -11,16 +11,12 @@ class CGSComboFire { s32 x4_loopState = -1; // In, loop, out s32 x8_cueAnimId = -1; s32 xc_gunId = -1; - - union { - struct { - bool x10_24_over : 1; - bool x10_25_idle : 1; - }; - u8 _dummy = 0; - }; + bool x10_24_over : 1; + bool x10_25_idle : 1; public: + CGSComboFire() : x10_24_over(false), x10_25_idle(false) {} + bool IsComboOver() const { return x10_24_over; } s32 GetLoopState() const { return x4_loopState; } void SetLoopState(s32 l) { x4_loopState = l; } diff --git a/Runtime/Weapon/CGameProjectile.cpp b/Runtime/Weapon/CGameProjectile.cpp index 312c3cb32..83dc6a2ac 100644 --- a/Runtime/Weapon/CGameProjectile.cpp +++ b/Runtime/Weapon/CGameProjectile.cpp @@ -1,5 +1,7 @@ #include "Runtime/Weapon/CGameProjectile.hpp" +#include + #include "Runtime/CStateManager.hpp" #include "Runtime/Collision/CCollisionActor.hpp" #include "Runtime/Collision/CInternalRayCastStructure.hpp" @@ -19,15 +21,15 @@ CGameProjectile::CGameProjectile(bool active, const TToken& const CDamageInfo& dInfo, TUniqueId uid, TAreaId aid, TUniqueId owner, TUniqueId homingTarget, EProjectileAttrib attribs, bool underwater, const zeus::CVector3f& scale, - const std::optional>& visorParticle, - u16 visorSfx, bool sendCollideMsg) + std::optional> visorParticle, u16 visorSfx, + bool sendCollideMsg) : CWeapon(uid, aid, active, owner, wType, name, xf, CMaterialFilter::MakeIncludeExclude( {EMaterialTypes::Solid, EMaterialTypes::NonSolidDamageable}, {EMaterialTypes::Projectile, EMaterialTypes::ProjectilePassthrough, excludeMat}), CMaterialList(EMaterialTypes::Projectile), dInfo, attribs | GetBeamAttribType(wType), CModelData::CModelDataNull()) -, x158_visorParticle(visorParticle) +, x158_visorParticle(std::move(visorParticle)) , x168_visorSfx(visorSfx) , x170_projectile(wDesc, xf.origin, xf.basis, scale, (attribs & EProjectileAttrib::ParticleOPTS) == EProjectileAttrib::ParticleOPTS) @@ -35,13 +37,12 @@ CGameProjectile::CGameProjectile(bool active, const TToken& , x2a4_projExtent((xe8_projectileAttribs & EProjectileAttrib::BigProjectile) == EProjectileAttrib::BigProjectile ? 0.25f : 0.1f) , x2c0_homingTargetId(homingTarget) -, x2cc_wpscId(wDesc.GetObjectTag()->id) { - x2e4_24_active = true; - x2e4_25_startedUnderwater = underwater; - x2e4_26_waterUpdate = underwater; - x2e4_27_inWater = underwater; - x2e4_28_sendProjectileCollideMsg = sendCollideMsg; -} +, x2cc_wpscId(wDesc.GetObjectTag()->id) +, x2e4_24_active(true) +, x2e4_25_startedUnderwater(underwater) +, x2e4_26_waterUpdate(underwater) +, x2e4_27_inWater(underwater) +, x2e4_28_sendProjectileCollideMsg(sendCollideMsg) {} void CGameProjectile::Accept(urde::IVisitor& visitor) { visitor.Visit(this); } diff --git a/Runtime/Weapon/CGameProjectile.hpp b/Runtime/Weapon/CGameProjectile.hpp index c3ea5e75d..06748ee5a 100644 --- a/Runtime/Weapon/CGameProjectile.hpp +++ b/Runtime/Weapon/CGameProjectile.hpp @@ -49,23 +49,18 @@ protected: CAssetId x2cc_wpscId; std::vector x2d0_touchResults; float x2e0_minHomingDist = 0.f; - union { - struct { - bool x2e4_24_active : 1; - bool x2e4_25_startedUnderwater : 1; - bool x2e4_26_waterUpdate : 1; - bool x2e4_27_inWater : 1; - bool x2e4_28_sendProjectileCollideMsg : 1; - }; - }; + bool x2e4_24_active : 1; + bool x2e4_25_startedUnderwater : 1; + bool x2e4_26_waterUpdate : 1; + bool x2e4_27_inWater : 1; + bool x2e4_28_sendProjectileCollideMsg : 1; public: CGameProjectile(bool active, const TToken&, std::string_view name, EWeaponType wType, const zeus::CTransform& xf, EMaterialTypes excludeMat, const CDamageInfo& dInfo, TUniqueId uid, TAreaId aid, TUniqueId owner, TUniqueId homingTarget, EProjectileAttrib attribs, bool underwater, - const zeus::CVector3f& scale, - const std::optional>& visorParticle, u16 visorSfx, - bool sendCollideMsg); + const zeus::CVector3f& scale, std::optional> visorParticle, + u16 visorSfx, bool sendCollideMsg); void Accept(IVisitor& visitor) override; virtual void ResolveCollisionWithActor(const CRayCastResult& res, CActor& act, CStateManager& mgr); diff --git a/Runtime/Weapon/CGrappleArm.cpp b/Runtime/Weapon/CGrappleArm.cpp index 9f6985968..2f1d90efa 100644 --- a/Runtime/Weapon/CGrappleArm.cpp +++ b/Runtime/Weapon/CGrappleArm.cpp @@ -37,7 +37,13 @@ CGrappleArm::CGrappleArm(const zeus::CVector3f& scale) , x398_grappleHitGen(std::make_unique(x36c_grappleHitDesc)) , x39c_grappleMuzzleGen(std::make_unique(x378_grappleMuzzleDesc)) , x3a0_grappleSwooshGen(std::make_unique(x384_grappleSwooshDesc, 0)) -, x3a4_rainSplashGenerator(std::make_unique(scale, 20, 2, 0.f, 0.125f)) { +, x3a4_rainSplashGenerator(std::make_unique(scale, 20, 2, 0.f, 0.125f)) +, x3b2_24_active(false) +, x3b2_25_beamActive(false) +, x3b2_26_grappleHit(false) +, x3b2_27_armMoving(false) +, x3b2_28_isGrappling(false) +, x3b2_29_suitLoading(false) { x0_grappleArmModel->SetSortThermal(true); xa0_grappleGearModel.SetSortThermal(true); xec_grapNoz1Model.SetSortThermal(true); diff --git a/Runtime/Weapon/CGrappleArm.hpp b/Runtime/Weapon/CGrappleArm.hpp index 87873faf5..f3192ee14 100644 --- a/Runtime/Weapon/CGrappleArm.hpp +++ b/Runtime/Weapon/CGrappleArm.hpp @@ -75,17 +75,12 @@ private: CPlayerState::EPlayerSuit x3a8_loadedSuit = CPlayerState::EPlayerSuit::Invalid; float x3ac_pitchBend = 0.f; s16 x3b0_rumbleHandle = -1; - union { - struct { - bool x3b2_24_active : 1; - bool x3b2_25_beamActive : 1; - bool x3b2_26_grappleHit : 1; - bool x3b2_27_armMoving : 1; - bool x3b2_28_isGrappling : 1; - bool x3b2_29_suitLoading : 1; - }; - u32 _dummy = 0; - }; + bool x3b2_24_active : 1; + bool x3b2_25_beamActive : 1; + bool x3b2_26_grappleHit : 1; + bool x3b2_27_armMoving : 1; + bool x3b2_28_isGrappling : 1; + bool x3b2_29_suitLoading : 1; static float g_GrappleBeamAnglePhaseDelta; static float g_GrappleBeamXWaveAmplitude; diff --git a/Runtime/Weapon/CGunWeapon.cpp b/Runtime/Weapon/CGunWeapon.cpp index 5ff1215c1..803d3afb6 100644 --- a/Runtime/Weapon/CGunWeapon.cpp +++ b/Runtime/Weapon/CGunWeapon.cpp @@ -70,7 +70,13 @@ CGunWeapon::CGunWeapon(CAssetId ancsId, EWeaponType type, TUniqueId playerId, EM , x1c8_playerMaterial(playerMaterial) , x200_beamId(GetWeaponIndex(type)) , x20c_shaderIdx(u32(x200_beamId)) -, x214_ancsId(ancsId) { +, x214_ancsId(ancsId) +, x218_24(false) +, x218_25_enableCharge(false) +, x218_26_loaded(false) +, x218_27_subtypeBasePose(false) +, x218_28_suitArmLocked(false) +, x218_29_drawHologram(false) { AllocResPools(x200_beamId); BuildDependencyList(x200_beamId); } diff --git a/Runtime/Weapon/CGunWeapon.hpp b/Runtime/Weapon/CGunWeapon.hpp index 30328d686..a4d099cde 100644 --- a/Runtime/Weapon/CGunWeapon.hpp +++ b/Runtime/Weapon/CGunWeapon.hpp @@ -84,18 +84,13 @@ protected: // 0x1: load request, 0x2: muzzle fx, 0x4: projectile data, 0x8: anims, 0x10: everything else u32 x210_loadFlags = 0; CAssetId x214_ancsId; - union { - struct { - bool x218_24 : 1; - bool x218_25_enableCharge : 1; - bool x218_26_loaded : 1; - // Initialize in selected beam's pose, rather than power beam's pose - bool x218_27_subtypeBasePose : 1; - bool x218_28_suitArmLocked : 1; - bool x218_29_drawHologram : 1; - }; - u32 _dummy = 0; - }; + bool x218_24 : 1; + bool x218_25_enableCharge : 1; + bool x218_26_loaded : 1; + // Initialize in selected beam's pose, rather than power beam's pose + bool x218_27_subtypeBasePose : 1; + bool x218_28_suitArmLocked : 1; + bool x218_29_drawHologram : 1; void AllocResPools(CPlayerState::EBeamId beam); void FreeResPools(); diff --git a/Runtime/Weapon/CPlasmaProjectile.cpp b/Runtime/Weapon/CPlasmaProjectile.cpp index fd999d5bd..dfb559bec 100644 --- a/Runtime/Weapon/CPlasmaProjectile.cpp +++ b/Runtime/Weapon/CPlasmaProjectile.cpp @@ -29,8 +29,8 @@ CPlasmaProjectile::CPlasmaProjectile(const TToken& wDesc, st const CBeamInfo& bInfo, const zeus::CTransform& xf, EMaterialTypes matType, const CDamageInfo& dInfo, TUniqueId uid, TAreaId aid, TUniqueId owner, const PlayerEffectResoures& res, bool growingBeam, EProjectileAttrib attribs) -: CBeamProjectile(wDesc, name, wType, xf, bInfo.GetLength(), bInfo.GetRadius(), bInfo.GetTravelSpeed(), matType, - dInfo, uid, aid, owner, attribs, growingBeam) +: CBeamProjectile(wDesc, name, wType, xf, bInfo.GetLength(), bInfo.GetRadius(), bInfo.GetTravelSpeed(), matType, dInfo, + uid, aid, owner, attribs, growingBeam) , x478_beamAttributes(bInfo.GetBeamAttributes()) , x47c_lifeTime(bInfo.GetLifeTime()) , x480_pulseSpeed(bInfo.GetPulseSpeed()) @@ -38,7 +38,13 @@ CPlasmaProjectile::CPlasmaProjectile(const TToken& wDesc, st , x488_expansionSpeed(bInfo.GetExpansionSpeed()) , x48c_(bInfo.GetLength() / 32.f) , x490_innerColor(bInfo.GetInnerColor()) -, x494_outerColor(bInfo.GetOuterColor()) { +, x494_outerColor(bInfo.GetOuterColor()) +, x548_24_(false) +, x548_25_enableEnergyPulse(true) +, x548_26_firing(false) +, x548_27_texturesLoaded(false) +, x548_28_drawOwnerFirst(growingBeam) +, x548_29_activePlayerPhazon(false) { x4e8_texture = g_SimplePool->GetObj(SObjectTag{FOURCC('TXTR'), bInfo.GetTextureId()}); x4f4_glowTexture = g_SimplePool->GetObj(SObjectTag{FOURCC('TXTR'), bInfo.GetGlowTextureId()}); x500_contactFxDesc = g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), bInfo.GetContactFxId()}); @@ -53,8 +59,6 @@ CPlasmaProjectile::CPlasmaProjectile(const TToken& wDesc, st x538_visorParticle = g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), res[3]}); x544_freezeSfx = CSfxManager::TranslateSFXID(res[4]); x546_electricSfx = CSfxManager::TranslateSFXID(res[5]); - x548_25_enableEnergyPulse = true; - x548_28_drawOwnerFirst = growingBeam; x518_contactGen->SetGlobalScale(zeus::CVector3f(bInfo.GetContactFxScale())); x51c_pulseGen->SetGlobalScale(zeus::CVector3f(bInfo.GetPulseFxScale())); x518_contactGen->SetParticleEmission(false); diff --git a/Runtime/Weapon/CPlasmaProjectile.hpp b/Runtime/Weapon/CPlasmaProjectile.hpp index 6634ca849..a0a0747ee 100644 --- a/Runtime/Weapon/CPlasmaProjectile.hpp +++ b/Runtime/Weapon/CPlasmaProjectile.hpp @@ -67,17 +67,12 @@ private: TToken x538_visorParticle; // Used to be optional u16 x544_freezeSfx; u16 x546_electricSfx; - union { - struct { - bool x548_24_ : 1; - bool x548_25_enableEnergyPulse : 1; - bool x548_26_firing : 1; - bool x548_27_texturesLoaded : 1; - bool x548_28_drawOwnerFirst : 1; - bool x548_29_activePlayerPhazon : 1; - }; - u32 _dummy3 = 0; - }; + bool x548_24_ : 1; + bool x548_25_enableEnergyPulse : 1; + bool x548_26_firing : 1; + bool x548_27_texturesLoaded : 1; + bool x548_28_drawOwnerFirst : 1; + bool x548_29_activePlayerPhazon : 1; struct RenderObjects { CColoredStripShader m_beamStrip1; diff --git a/Runtime/Weapon/CPlayerGun.cpp b/Runtime/Weapon/CPlayerGun.cpp index 8a279abc3..b0159965d 100644 --- a/Runtime/Weapon/CPlayerGun.cpp +++ b/Runtime/Weapon/CPlayerGun.cpp @@ -131,7 +131,39 @@ CPlayerGun::CPlayerGun(TUniqueId playerId) , x678_morph(g_tweakPlayerGun->GetGunTransformTime(), g_tweakPlayerGun->GetHoloHoldTime()) , x6c8_hologramClipCube(zeus::CVector3f(-0.29329199f, 0.f, -0.2481945f), zeus::CVector3f(0.29329199f, 1.292392f, 0.2481945f)) -, x6e0_rightHandModel(CAnimRes(g_tweakGunRes->xc_rightHand, 0, zeus::CVector3f(3.f), 0, true)) { +, x6e0_rightHandModel(CAnimRes(g_tweakGunRes->xc_rightHand, 0, zeus::CVector3f(3.f), 0, true)) +, x832_24_coolingCharge(false) +, x832_25_chargeEffectVisible(false) +, x832_26_comboFiring(false) +, x832_27_chargeAnimStarted(false) +, x832_28_readyForShot(false) +, x832_29_lockedOn(false) +, x832_30_requestReturnToDefault(false) +, x832_31_inRestPose(true) +, x833_24_notFidgeting(true) +, x833_25_(false) +, x833_26_(false) +, x833_27_(false) +, x833_28_phazonBeamActive(false) +, x833_29_pointBlankWorldSurface(false) +, x833_30_canShowAuxMuzzleEffect(true) +, x833_31_inFreeLook(false) +, x834_24_charging(false) +, x834_25_gunMotionFidgeting(false) +, x834_26_animPlaying(false) +, x834_27_underwater(false) +, x834_28_requestImmediateRecharge(false) +, x834_29_frozen(false) +, x834_30_inBigStrike(false) +, x834_31_gunMotionInFidgetBasePosition(false) +, x835_24_canFirePhazon(false) +, x835_25_inPhazonBeam(false) +, x835_26_phazonBeamMorphing(false) +, x835_27_intoPhazonBeam(false) +, x835_28_bombReady(false) +, x835_29_powerBombReady(false) +, x835_30_inPhazonPool(false) +, x835_31_actorAttached(false) { x354_bombFuseTime = g_tweakPlayerGun->GetBombFuseTime(); x358_bombDropDelayTime = g_tweakPlayerGun->GetBombDropDelayTime(); x668_aimVerticalSpeed = g_tweakPlayerGun->GetAimVerticalSpeed(); @@ -155,9 +187,6 @@ CPlayerGun::CPlayerGun(TUniqueId playerId) g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), g_tweakGunRes->x24_holoTransition})); x82c_shadow = std::make_unique(256, 256, true); - x832_31_inRestPose = true; - x833_24_notFidgeting = true; - x833_30_canShowAuxMuzzleEffect = true; x6e0_rightHandModel.SetSortThermal(true); kVerticalAngleTable[2] = g_tweakPlayerGun->GetUpLookAngle(); diff --git a/Runtime/Weapon/CPlayerGun.hpp b/Runtime/Weapon/CPlayerGun.hpp index 8140fbb99..fb88549cb 100644 --- a/Runtime/Weapon/CPlayerGun.hpp +++ b/Runtime/Weapon/CPlayerGun.hpp @@ -82,18 +82,15 @@ private: float x18_transitionFactor = 1.f; EDir x1c_dir = EDir::Done; EGunState x20_gunState = EGunState::OutWipeDone; - - union { - struct { - bool x24_24_morphing : 1; - bool x24_25_weaponChanged : 1; - }; - u32 _dummy = 0; - }; + bool x24_24_morphing : 1; + bool x24_25_weaponChanged : 1; public: CGunMorph(float gunTransformTime, float holoHoldTime) - : x4_gunTransformTime(gunTransformTime), x10_holoHoldTime(std::fabs(holoHoldTime)) {} + : x4_gunTransformTime(gunTransformTime) + , x10_holoHoldTime(std::fabs(holoHoldTime)) + , x24_24_morphing(false) + , x24_25_weaponChanged(false) {} float GetYLerp() const { return x0_yLerp; } float GetTransitionFactor() const { return x18_transitionFactor; } EGunState GetGunState() const { return x20_gunState; } @@ -225,46 +222,41 @@ private: std::unique_ptr x82c_shadow; s16 x830_chargeRumbleHandle = -1; - union { - struct { - bool x832_24_coolingCharge : 1; - bool x832_25_chargeEffectVisible : 1; - bool x832_26_comboFiring : 1; - bool x832_27_chargeAnimStarted : 1; - bool x832_28_readyForShot : 1; - bool x832_29_lockedOn : 1; - bool x832_30_requestReturnToDefault : 1; - bool x832_31_inRestPose : 1; + bool x832_24_coolingCharge : 1; + bool x832_25_chargeEffectVisible : 1; + bool x832_26_comboFiring : 1; + bool x832_27_chargeAnimStarted : 1; + bool x832_28_readyForShot : 1; + bool x832_29_lockedOn : 1; + bool x832_30_requestReturnToDefault : 1; + bool x832_31_inRestPose : 1; - bool x833_24_notFidgeting : 1; - bool x833_25_ : 1; - bool x833_26_ : 1; - bool x833_27_ : 1; - bool x833_28_phazonBeamActive : 1; - bool x833_29_pointBlankWorldSurface : 1; - bool x833_30_canShowAuxMuzzleEffect : 1; - bool x833_31_inFreeLook : 1; + bool x833_24_notFidgeting : 1; + bool x833_25_ : 1; + bool x833_26_ : 1; + bool x833_27_ : 1; + bool x833_28_phazonBeamActive : 1; + bool x833_29_pointBlankWorldSurface : 1; + bool x833_30_canShowAuxMuzzleEffect : 1; + bool x833_31_inFreeLook : 1; - bool x834_24_charging : 1; - bool x834_25_gunMotionFidgeting : 1; - bool x834_26_animPlaying : 1; - bool x834_27_underwater : 1; - bool x834_28_requestImmediateRecharge : 1; - bool x834_29_frozen : 1; - bool x834_30_inBigStrike : 1; - bool x834_31_gunMotionInFidgetBasePosition : 1; + bool x834_24_charging : 1; + bool x834_25_gunMotionFidgeting : 1; + bool x834_26_animPlaying : 1; + bool x834_27_underwater : 1; + bool x834_28_requestImmediateRecharge : 1; + bool x834_29_frozen : 1; + bool x834_30_inBigStrike : 1; + bool x834_31_gunMotionInFidgetBasePosition : 1; - bool x835_24_canFirePhazon : 1; - bool x835_25_inPhazonBeam : 1; - bool x835_26_phazonBeamMorphing : 1; - bool x835_27_intoPhazonBeam : 1; - bool x835_28_bombReady : 1; - bool x835_29_powerBombReady : 1; - bool x835_30_inPhazonPool : 1; - bool x835_31_actorAttached : 1; - }; - u32 _dummy = 0; - }; + bool x835_24_canFirePhazon : 1; + bool x835_25_inPhazonBeam : 1; + bool x835_26_phazonBeamMorphing : 1; + bool x835_27_intoPhazonBeam : 1; + bool x835_28_bombReady : 1; + bool x835_29_powerBombReady : 1; + bool x835_30_inPhazonPool : 1; + bool x835_31_actorAttached : 1; CTexturedQuadFilter m_screenQuad{EFilterType::Blend, CGraphics::g_SpareTexture.get(), CTexturedQuadFilter::ZTest::GEqualZWrite}; diff --git a/Runtime/Weapon/CProjectileWeapon.cpp b/Runtime/Weapon/CProjectileWeapon.cpp index f3b816c04..f73090744 100644 --- a/Runtime/Weapon/CProjectileWeapon.cpp +++ b/Runtime/Weapon/CProjectileWeapon.cpp @@ -15,8 +15,15 @@ CProjectileWeapon::CProjectileWeapon(const TToken& wDesc, co , x10_random(g_GlobalSeed) , x14_localToWorldXf(localToWorld) , x74_worldOffset(worldOffset) -, xe4_flags(flags) { - x124_24_active = true; +, xe4_flags(flags) +, x124_24_active(true) +, x124_25_APSO(false) +, x124_26_AP11(false) +, x124_27_AP21(false) +, x124_28_AS11(false) +, x124_29_AS12(false) +, x124_30_AS13(false) +, x124_31_VMD2(false) { CGlobalRandom gr(x10_random); x124_31_VMD2 = x4_weaponDesc->x10_VMD2; x124_25_APSO = x4_weaponDesc->x28_APSO; diff --git a/Runtime/Weapon/CProjectileWeapon.hpp b/Runtime/Weapon/CProjectileWeapon.hpp index 1b83e1816..6ff083fde 100644 --- a/Runtime/Weapon/CProjectileWeapon.hpp +++ b/Runtime/Weapon/CProjectileWeapon.hpp @@ -53,19 +53,14 @@ class CProjectileWeapon { std::unique_ptr x118_swoosh1; std::unique_ptr x11c_swoosh2; std::unique_ptr x120_swoosh3; - union { - struct { - bool x124_24_active : 1; - bool x124_25_APSO : 1; - bool x124_26_AP11 : 1; - bool x124_27_AP21 : 1; - bool x124_28_AS11 : 1; - bool x124_29_AS12 : 1; - bool x124_30_AS13 : 1; - bool x124_31_VMD2 : 1; - }; - u32 _dummy = 0; - }; + bool x124_24_active : 1; + bool x124_25_APSO : 1; + bool x124_26_AP11 : 1; + bool x124_27_AP21 : 1; + bool x124_28_AS11 : 1; + bool x124_29_AS12 : 1; + bool x124_30_AS13 : 1; + bool x124_31_VMD2 : 1; public: CProjectileWeapon(const TToken& wDesc, const zeus::CVector3f& worldOffset, From 26f272735dc981a31abe9ab237b7536993c1e95a Mon Sep 17 00:00:00 2001 From: Jack Andersen Date: Fri, 10 Apr 2020 19:05:55 -1000 Subject: [PATCH 049/224] Set compiler flags for building with C++20 --- CMakeLists.txt | 59 +++++++++++++++++++++---------------- DataSpec/DNACommon/CMDL.cpp | 26 ++++++++-------- amuse | 2 +- hecl | 2 +- jbus | 2 +- kabufuda | 2 +- nod | 2 +- specter | 2 +- visigen/CMakeLists.txt | 6 ++-- 9 files changed, 57 insertions(+), 46 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ba71b695e..5f39083d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,8 +40,8 @@ project(urde VERSION 0.1.0) # when available. GCC and Clang posess no such flag, and must be # manually enforced. CMake, curiously, also doesn't have a "latest" # standard flag either. -if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") - set(CMAKE_CXX_STANDARD 17) +if (NOT MSVC) + set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) endif() @@ -86,30 +86,41 @@ if(MSVC) add_compile_options(/IGNORE:4221 /wd4018 /wd4800 /wd4005 /wd4311 /wd4068 /wd4267 /wd4244 /wd4200 /wd4305 /wd4067 /wd4146 /wd4309 /wd4805 ${VS_OPTIONS}) - if(WINDOWS_STORE) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /AI\"$ENV{PROGRAMFILES\(X86\)}/Microsoft Visual Studio/2017/Community/Common7/IDE/VC/vcpackages\" /AI\"$ENV{PROGRAMFILES\(X86\)}/Windows Kits/10/UnionMetadata\"") - set(HAVE_WORDS_BIGENDIAN_EXITCODE 0) - endif() + add_compile_options( + # Disable exceptions + $<$:/EHsc> - add_compile_options(/EHsc) + # Enforce various standards compliant behavior. + $<$:/permissive-> + + # Enable standard volatile semantics. + $<$:/volatile:iso> + + # Reports the proper value for the __cplusplus preprocessor macro. + $<$:/Zc:__cplusplus> + + # Use latest C++ standard. + $<$:/std:c++latest> + ) if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + # Flags for MSVC (not clang-cl) add_compile_options( - /std:c++latest # Use latest C++ standard. - /permissive- # Enforce various standards compliance features. - /Zc:externConstexpr # Allow extern constexpr variables according to the standard. - /Zc:throwingNew # Assume new throws, allowing for better code generation. + # Allow constexpr variables to have explicit external linkage. + $<$:/Zc:externConstexpr> + + # Assume that new throws exceptions, allowing better code generation. + $<$:/Zc:throwingNew> + + # Link-time Code Generation for Release builds + $<$,$>:/GL> ) - # Link-time Code Generation for Release builds (excluding clang-cl) - set(CMAKE_C_FLAGS_RELEASE "/DNDEBUG /O2 /Oy /GL /Gy /MD") - set(CMAKE_C_FLAGS_RELWITHDEBINFO "/DNDEBUG /Zi /O2 /Oy- /GL /Gy /MD") + # Link-time Code Generation for Release builds set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "/LTCG") set(CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO "/LTCG") set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/RELEASE /LTCG /OPT:REF /OPT:ICF /INCREMENTAL:NO") set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "/DEBUG /RELEASE /LTCG /OPT:REF /OPT:ICF /INCREMENTAL:NO /DEBUGTYPE:cv,fixup") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") endif() else() @@ -144,21 +155,19 @@ else() endif() if(URDE_MSAN) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") - add_compile_options(-fsanitize=memory -fsanitize-memory-track-origins -fsanitize-recover=all) + add_compile_options($<$:-stdlib=libc++> -fsanitize=memory + -fsanitize-memory-track-origins -fsanitize-recover=all) endif() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fno-exceptions") - add_compile_options(-Wall -Wno-multichar -Werror=implicit-fallthrough -Wno-unknown-warning-option + add_compile_options($<$:-fno-rtti> + $<$:-fno-exceptions> + -Wall -Wno-multichar -Werror=implicit-fallthrough -Wno-unknown-warning-option -Wno-lto-type-mismatch -Wno-unused-variable -Wno-unused-private-field -Wno-unused-function -Wno-sign-compare -Wno-unknown-pragmas -Werror) add_compile_definitions(FMT_EXCEPTIONS=0) if(APPLE) - add_compile_options(-Wno-error=deprecated-declarations) - set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -flto=thin") - set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -flto=thin") - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto=thin") - set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -flto=thin") + add_compile_options(-Wno-error=deprecated-declarations + $<$,$>:-flto=thin>) endif() endif() diff --git a/DataSpec/DNACommon/CMDL.cpp b/DataSpec/DNACommon/CMDL.cpp index b20cc4067..487a113b3 100644 --- a/DataSpec/DNACommon/CMDL.cpp +++ b/DataSpec/DNACommon/CMDL.cpp @@ -601,7 +601,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I DLReader::DLPrimVert maxIdxs; std::vector skinIndices; DLReader::ExtraVertTracker extraTracker; - for (size_t s = 0; s < lastDlSec; ++s) { + for (atUint32 s = 0; s < lastDlSec; ++s) { atUint64 secStart = reader.position(); if (s < matSecCount) { if (!s) { @@ -683,7 +683,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I unsigned createdUVLayers = 0; unsigned surfIdx = 0; - for (size_t s = 0; s < lastDlSec; ++s) { + for (atUint32 s = 0; s < lastDlSec; ++s) { atUint64 secStart = reader.position(); if (s < matSecCount) { MaterialSet matSet; @@ -698,7 +698,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I atUint32 vertCount = maxIdxs.pos + 1; std::vector positions; positions.reserve(vertCount); - for (size_t i = 0; i <= maxIdxs.pos; ++i) { + for (atUint16 i = 0; i <= maxIdxs.pos; ++i) { positions.push_back(reader.readVec3fBig()); const atVec3f& pos = positions.back(); os.format(fmt("vert = bm.verts.new(({},{},{}))\n"), pos.simd[0], pos.simd[1], pos.simd[2]); @@ -712,7 +712,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I if (rp.first.second && SurfaceHeader::UseMatrixSkinning() && !skinIndices.empty()) vertCount += extraTracker.sendAdditionalVertsToBlender(os, rp, 0); os.format(fmt("two_face_vert = {}\n"), vertCount); - for (size_t i = 0; i <= maxIdxs.pos; ++i) { + for (atUint16 i = 0; i <= maxIdxs.pos; ++i) { const atVec3f& pos = positions[i]; os.format(fmt("vert = bm.verts.new(({},{},{}))\n"), pos.simd[0], pos.simd[1], pos.simd[2]); if (rp.first.second) { @@ -730,16 +730,16 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I /* Normals */ os << "norm_list = []\n"; if (shortNormals) { - size_t normCount = secSizes[s] / 6; - for (size_t i = 0; i < normCount; ++i) { + atUint32 normCount = secSizes[s] / 6; + for (atUint32 i = 0; i < normCount; ++i) { float x = reader.readInt16Big() / 16384.0f; float y = reader.readInt16Big() / 16384.0f; float z = reader.readInt16Big() / 16384.0f; os.format(fmt("norm_list.append(({},{},{}))\n"), x, y, z); } } else { - size_t normCount = secSizes[s] / 12; - for (size_t i = 0; i < normCount; ++i) { + atUint32 normCount = secSizes[s] / 12; + for (atUint32 i = 0; i < normCount; ++i) { const atVec3f norm = reader.readVec3fBig(); os.format(fmt("norm_list.append(({},{},{}))\n"), norm.simd[0], norm.simd[1], norm.simd[2]); } @@ -753,8 +753,8 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I case 3: { /* Float UVs */ os << "uv_list = []\n"; - size_t uvCount = secSizes[s] / 8; - for (size_t i = 0; i < uvCount; ++i) { + atUint32 uvCount = secSizes[s] / 8; + for (atUint32 i = 0; i < uvCount; ++i) { const atVec2f uv = reader.readVec2fBig(); os.format(fmt("uv_list.append(({},{}))\n"), uv.simd[0], uv.simd[1]); } @@ -768,8 +768,8 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I /* Short UVs */ os << "suv_list = []\n"; if (shortUVs) { - size_t uvCount = secSizes[s] / 4; - for (size_t i = 0; i < uvCount; ++i) { + atUint32 uvCount = secSizes[s] / 4; + for (atUint32 i = 0; i < uvCount; ++i) { float x = reader.readInt16Big() / 32768.0f; float y = reader.readInt16Big() / 32768.0f; os.format(fmt("suv_list.append(({},{}))\n"), x, y); @@ -1085,7 +1085,7 @@ void NameCMDL(athena::io::IStreamReader& reader, PAKRouter& pakRouter, typename if (head.matSetCount) matSecCount = MaterialSet::OneSection() ? 1 : head.matSetCount; atUint32 lastDlSec = head.secCount; - for (size_t s = 0; s < lastDlSec; ++s) { + for (atUint32 s = 0; s < lastDlSec; ++s) { atUint64 secStart = reader.position(); if (s < matSecCount) { MaterialSet matSet; diff --git a/amuse b/amuse index 9c75aeccb..40efdcc38 160000 --- a/amuse +++ b/amuse @@ -1 +1 @@ -Subproject commit 9c75aeccbec4d344b9481bc3c312a50241f5ecb1 +Subproject commit 40efdcc38cc59dbb66a8c12d96583f2133d534f7 diff --git a/hecl b/hecl index 87ad5cbc8..8f31e8bb7 160000 --- a/hecl +++ b/hecl @@ -1 +1 @@ -Subproject commit 87ad5cbc81dad92d54c60d388157ca6300475c19 +Subproject commit 8f31e8bb7d5f3d0fde26e17824456d1b88fb084d diff --git a/jbus b/jbus index d72163ad2..b8e1e4673 160000 --- a/jbus +++ b/jbus @@ -1 +1 @@ -Subproject commit d72163ad27c4a8b4d993e1a29d758a3548d92bed +Subproject commit b8e1e4673e66d45876d87439faf463a7301ee05c diff --git a/kabufuda b/kabufuda index 35e5c7c90..6d8d38945 160000 --- a/kabufuda +++ b/kabufuda @@ -1 +1 @@ -Subproject commit 35e5c7c90f9d368f29ab191a005d30f91774e50e +Subproject commit 6d8d389459243a38efc585dc03b877b4697cdcf2 diff --git a/nod b/nod index f147e1235..dffcac50c 160000 --- a/nod +++ b/nod @@ -1 +1 @@ -Subproject commit f147e1235646b849f78a8574a6d554214b70792d +Subproject commit dffcac50c5fe3eb67fdee222553fc508cd241579 diff --git a/specter b/specter index 27eb476b0..a2c154db8 160000 --- a/specter +++ b/specter @@ -1 +1 @@ -Subproject commit 27eb476b05efeb1b94329eb85f36a1fd83858870 +Subproject commit a2c154db8fde276206ae87628d6baa40f1e399a9 diff --git a/visigen/CMakeLists.txt b/visigen/CMakeLists.txt index da13fffd9..f38393310 100644 --- a/visigen/CMakeLists.txt +++ b/visigen/CMakeLists.txt @@ -2,8 +2,10 @@ if(NOT WINDOWS_STORE) cmake_minimum_required(VERSION 3.10 FATAL_ERROR) # because of c++17 project(visigen) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) +if (NOT MSVC) + set(CMAKE_CXX_STANDARD 20) + set(CMAKE_CXX_STANDARD_REQUIRED ON) +endif() add_executable(visigen From 3dd485e0ebced5f5cde983e13d4992fa2577266c Mon Sep 17 00:00:00 2001 From: Jack Andersen Date: Fri, 10 Apr 2020 19:42:14 -1000 Subject: [PATCH 050/224] Fix MP3 PASS extract with null textures --- DataSpec/DNAMP3/CMDLMaterials.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/DataSpec/DNAMP3/CMDLMaterials.cpp b/DataSpec/DNAMP3/CMDLMaterials.cpp index e2ff1c8ae..f12848b14 100644 --- a/DataSpec/DNAMP3/CMDLMaterials.cpp +++ b/DataSpec/DNAMP3/CMDLMaterials.cpp @@ -46,6 +46,10 @@ void MaterialSet::RegisterMaterialProps(Stream& out) { static void LoadTexture(Stream& out, const UniqueID64& tex, const PAKRouter& pakRouter, const PAK::Entry& entry) { + if (!tex.isValid()) { + out << "image = None\n"; + return; + } std::string texName = pakRouter.getBestEntryName(tex); const nod::Node* node; const typename PAKRouter::EntryType* texEntry = pakRouter.lookupEntry(tex, &node); From bb7e94f30487b09dc0185d36e89f0a4a96d02519 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sat, 11 Apr 2020 01:50:10 -0400 Subject: [PATCH 051/224] Runtime/World: Replace bitfield unions with constructor initializers --- Runtime/World/CActor.cpp | 42 ++++++----- Runtime/World/CActor.hpp | 53 +++++++------- Runtime/World/CActorModelParticles.cpp | 7 +- Runtime/World/CActorModelParticles.hpp | 9 +-- Runtime/World/CActorParameters.hpp | 13 ++-- Runtime/World/CAmbientAI.cpp | 4 +- Runtime/World/CAmbientAI.hpp | 10 +-- Runtime/World/CEntity.cpp | 9 +-- Runtime/World/CEntity.hpp | 14 ++-- Runtime/World/CFishCloud.cpp | 13 ++-- Runtime/World/CFishCloud.hpp | 21 +++--- Runtime/World/CGameArea.hpp | 28 ++++---- Runtime/World/CKnockBackController.cpp | 22 +++--- Runtime/World/CKnockBackController.hpp | 37 +++++----- Runtime/World/CPatterned.cpp | 46 +++++++++--- Runtime/World/CPatterned.hpp | 83 +++++++++------------- Runtime/World/CPlayer.cpp | 32 +++++++-- Runtime/World/CPlayer.hpp | 59 +++++++-------- Runtime/World/CScriptActorKeyframe.cpp | 15 ++-- Runtime/World/CScriptActorKeyframe.hpp | 17 ++--- Runtime/World/CScriptActorRotate.hpp | 14 ++-- Runtime/World/CScriptAiJumpPoint.cpp | 3 +- Runtime/World/CScriptAiJumpPoint.hpp | 7 +- Runtime/World/CScriptCameraHintTrigger.cpp | 9 +-- Runtime/World/CScriptCameraHintTrigger.hpp | 13 ++-- Runtime/World/CScriptCameraPitchVolume.cpp | 4 +- Runtime/World/CScriptCameraPitchVolume.hpp | 10 +-- Runtime/World/CScriptColorModulate.cpp | 21 +++--- Runtime/World/CScriptColorModulate.hpp | 23 +++--- Runtime/World/CScriptControllerAction.cpp | 10 +-- Runtime/World/CScriptControllerAction.hpp | 11 +-- Runtime/World/CScriptCoverPoint.cpp | 9 ++- Runtime/World/CScriptCoverPoint.hpp | 21 ++---- Runtime/World/CScriptDamageableTrigger.cpp | 8 ++- Runtime/World/CScriptDamageableTrigger.hpp | 16 ++--- Runtime/World/CScriptDebris.cpp | 26 ++++--- Runtime/World/CScriptDebris.hpp | 23 +++--- Runtime/World/CScriptDock.cpp | 13 ++-- Runtime/World/CScriptDock.hpp | 11 +-- Runtime/World/CScriptEffect.cpp | 23 +++--- Runtime/World/CScriptEffect.hpp | 27 +++---- Runtime/World/CScriptGenerator.hpp | 9 +-- Runtime/World/CScriptGunTurret.cpp | 18 ++--- Runtime/World/CScriptGunTurret.hpp | 21 +++--- Runtime/World/CScriptMazeNode.cpp | 7 +- Runtime/World/CScriptMazeNode.hpp | 11 +-- Runtime/World/CScriptMemoryRelay.hpp | 11 +-- Runtime/World/CScriptPlayerActor.cpp | 14 ++-- Runtime/World/CScriptPlayerActor.hpp | 23 +++--- Runtime/World/CScriptShadowProjector.cpp | 8 +-- Runtime/World/CScriptShadowProjector.hpp | 10 +-- Runtime/World/CScriptSound.cpp | 19 ++--- Runtime/World/CScriptSound.hpp | 25 +++---- Runtime/World/CScriptSpawnPoint.hpp | 9 +-- Runtime/World/CScriptSpecialFunction.cpp | 14 +++- Runtime/World/CScriptSpecialFunction.hpp | 27 +++---- Runtime/World/CScriptTargetingPoint.cpp | 3 +- Runtime/World/CScriptTargetingPoint.hpp | 7 +- Runtime/World/CScriptTrigger.cpp | 14 ++-- Runtime/World/CScriptTrigger.hpp | 18 ++--- Runtime/World/CScriptWater.cpp | 12 ++-- Runtime/World/CScriptWater.hpp | 20 +++--- Runtime/World/CScriptWorldTeleporter.hpp | 12 +--- Runtime/World/CStateMachine.hpp | 9 +-- Runtime/World/CWallCrawlerSwarm.cpp | 8 +-- Runtime/World/CWallCrawlerSwarm.hpp | 30 ++++---- Runtime/World/CWorld.cpp | 9 ++- Runtime/World/CWorld.hpp | 14 ++-- Runtime/World/CWorldTransManager.hpp | 22 +++--- 69 files changed, 583 insertions(+), 657 deletions(-) diff --git a/Runtime/World/CActor.cpp b/Runtime/World/CActor.cpp index 37fa2b6d4..1d538dfc8 100644 --- a/Runtime/World/CActor.cpp +++ b/Runtime/World/CActor.cpp @@ -34,27 +34,37 @@ CActor::CActor(TUniqueId uid, bool active, std::string_view name, const CEntityI , x34_transform(xf) , x68_material(MakeActorMaterialList(list, params)) , x70_materialFilter(CMaterialFilter::MakeIncludeExclude({EMaterialTypes::Solid}, {0ull})) -, xc6_nextDrawNode(otherUid) { +, xc6_nextDrawNode(otherUid) +, xe4_24_nextNonLoopingSfxHandle(0) +, xe4_27_notInSortedLists(true) +, xe4_28_transformDirty(true) +, xe4_29_actorLightsDirty(true) +, xe4_30_outOfFrustum(false) +, xe4_31_calculateLighting(true) +, xe5_24_shadowEnabled(false) +, xe5_25_shadowDirty(false) +, xe5_26_muted(false) +, xe5_27_useInSortedLists(true) +, xe5_28_callTouch(true) +, xe5_29_globalTimeProvider(params.x58_24_globalTimeProvider) +, xe5_30_renderUnsorted(params.x58_26_renderUnsorted) +, xe5_31_pointGeneratorParticles(false) +, xe6_24_fluidCounter(0) +, xe6_27_thermalVisorFlags(u8(params.x58_25_thermalHeat ? 2 : 1)) +, xe6_29_renderParticleDBInside(true) +, xe6_30_enablePitchBend(false) +, xe6_31_targetableVisorFlags(params.GetVisorParameters().GetMask()) +, xe7_27_enableRender(true) +, xe7_28_worldLightingDirty(false) +, xe7_29_drawEnabled(active) +, xe7_30_doTargetDistanceTest(true) +, xe7_31_targetable(true) { x90_actorLights = mData.IsNull() ? nullptr : params.x0_lightParms.MakeActorLights(); if (mData.x10_animData || mData.x1c_normalModel) x64_modelData = std::make_unique(std::move(mData)); xd0_damageMag = params.x64_thermalMag; xd8_nonLoopingSfxHandles.resize(2); - xe4_27_notInSortedLists = true; - xe4_28_transformDirty = true; - xe4_29_actorLightsDirty = true; - xe4_31_calculateLighting = true; - xe5_27_useInSortedLists = true; - xe5_28_callTouch = true; - xe5_29_globalTimeProvider = params.x58_24_globalTimeProvider; - xe5_30_renderUnsorted = params.x58_26_renderUnsorted; - xe6_27_thermalVisorFlags = u8(params.x58_25_thermalHeat ? 2 : 1); - xe6_29_renderParticleDBInside = true; - xe6_31_targetableVisorFlags = params.GetVisorParameters().GetMask(); - xe7_27_enableRender = true; - xe7_29_drawEnabled = active; - xe7_30_doTargetDistanceTest = true; - xe7_31_targetable = true; + if (x64_modelData) { if (params.x44_xrayAssets.first.IsValid()) x64_modelData->SetXRayModel(params.x44_xrayAssets); diff --git a/Runtime/World/CActor.hpp b/Runtime/World/CActor.hpp index 69e0abbd4..5913d3279 100644 --- a/Runtime/World/CActor.hpp +++ b/Runtime/World/CActor.hpp @@ -48,35 +48,30 @@ protected: float xd0_damageMag; float xd4_maxVol = 1.f; rstl::reserved_vector xd8_nonLoopingSfxHandles; - union { - struct { - u8 xe4_24_nextNonLoopingSfxHandle : 3; - bool xe4_27_notInSortedLists : 1; - bool xe4_28_transformDirty : 1; - bool xe4_29_actorLightsDirty : 1; - bool xe4_30_outOfFrustum : 1; - bool xe4_31_calculateLighting : 1; - bool xe5_24_shadowEnabled : 1; - bool xe5_25_shadowDirty : 1; - bool xe5_26_muted : 1; - bool xe5_27_useInSortedLists : 1; - bool xe5_28_callTouch : 1; - bool xe5_29_globalTimeProvider : 1; - bool xe5_30_renderUnsorted : 1; - bool xe5_31_pointGeneratorParticles : 1; - u8 xe6_24_fluidCounter : 3; - u8 xe6_27_thermalVisorFlags : 2; // 1: thermal cold, 2: thermal hot - bool xe6_29_renderParticleDBInside : 1; - bool xe6_30_enablePitchBend : 1; - u8 xe6_31_targetableVisorFlags : 4; - bool xe7_27_enableRender : 1; - bool xe7_28_worldLightingDirty : 1; - bool xe7_29_drawEnabled : 1; - bool xe7_30_doTargetDistanceTest : 1; - bool xe7_31_targetable : 1; - }; - u32 dummy = 0; - }; + u8 xe4_24_nextNonLoopingSfxHandle : 3; + bool xe4_27_notInSortedLists : 1; + bool xe4_28_transformDirty : 1; + bool xe4_29_actorLightsDirty : 1; + bool xe4_30_outOfFrustum : 1; + bool xe4_31_calculateLighting : 1; + bool xe5_24_shadowEnabled : 1; + bool xe5_25_shadowDirty : 1; + bool xe5_26_muted : 1; + bool xe5_27_useInSortedLists : 1; + bool xe5_28_callTouch : 1; + bool xe5_29_globalTimeProvider : 1; + bool xe5_30_renderUnsorted : 1; + bool xe5_31_pointGeneratorParticles : 1; + u8 xe6_24_fluidCounter : 3; + u8 xe6_27_thermalVisorFlags : 2; // 1: thermal cold, 2: thermal hot + bool xe6_29_renderParticleDBInside : 1; + bool xe6_30_enablePitchBend : 1; + u8 xe6_31_targetableVisorFlags : 4; + bool xe7_27_enableRender : 1; + bool xe7_28_worldLightingDirty : 1; + bool xe7_29_drawEnabled : 1; + bool xe7_30_doTargetDistanceTest : 1; + bool xe7_31_targetable : 1; boo::ObjToken m_reflectionCube; diff --git a/Runtime/World/CActorModelParticles.cpp b/Runtime/World/CActorModelParticles.cpp index ceb99f7d5..d531b7670 100644 --- a/Runtime/World/CActorModelParticles.cpp +++ b/Runtime/World/CActorModelParticles.cpp @@ -25,7 +25,12 @@ static bool IsMediumOrLarge(CActor& act) { } CActorModelParticles::CItem::CItem(const CEntity& ent, CActorModelParticles& parent) -: x0_id(ent.GetUniqueId()), x4_areaId(ent.GetAreaIdAlways()), xdc_ashy(parent.x48_ashy), x128_parent(parent) { +: x0_id(ent.GetUniqueId()) +, x4_areaId(ent.GetAreaIdAlways()) +, xdc_ashy(parent.x48_ashy) +, x128_parent(parent) +, x12c_24_thermalCold(false) +, x12c_25_thermalHot(false) { x8_onFireGens.resize(8); } diff --git a/Runtime/World/CActorModelParticles.hpp b/Runtime/World/CActorModelParticles.hpp index df191ab5d..bb27fa909 100644 --- a/Runtime/World/CActorModelParticles.hpp +++ b/Runtime/World/CActorModelParticles.hpp @@ -56,13 +56,8 @@ public: zeus::CVector3f xec_particleOffsetScale = zeus::skOne3f; zeus::CTransform xf8_iceXf; CActorModelParticles& x128_parent; - union { - struct { - bool x12c_24_thermalCold : 1; - bool x12c_25_thermalHot : 1; - }; - u16 _dummy = 0; - }; + bool x12c_24_thermalCold : 1; + bool x12c_25_thermalHot : 1; float x130_remTime = 10.f; mutable u8 x134_lockDeps = 0; bool UpdateOnFire(float dt, CActor* actor, CStateManager& mgr); diff --git a/Runtime/World/CActorParameters.hpp b/Runtime/World/CActorParameters.hpp index b7b395b43..8ab6be70f 100644 --- a/Runtime/World/CActorParameters.hpp +++ b/Runtime/World/CActorParameters.hpp @@ -18,15 +18,10 @@ class CActorParameters { std::pair x44_xrayAssets = {}; std::pair x4c_thermalAssets = {}; CVisorParameters x54_visorParms; - union { - struct { - bool x58_24_globalTimeProvider : 1; - bool x58_25_thermalHeat : 1; - bool x58_26_renderUnsorted : 1; - bool x58_27_noSortThermal : 1; - }; - u32 _dummy = 0; - }; + bool x58_24_globalTimeProvider : 1; + bool x58_25_thermalHeat : 1; + bool x58_26_renderUnsorted : 1; + bool x58_27_noSortThermal : 1; float x5c_fadeInTime = 0.f; float x60_fadeOutTime = 0.f; float x64_thermalMag = 0.f; diff --git a/Runtime/World/CAmbientAI.cpp b/Runtime/World/CAmbientAI.cpp index 4fc4ae2e9..462854a0b 100644 --- a/Runtime/World/CAmbientAI.cpp +++ b/Runtime/World/CAmbientAI.cpp @@ -19,7 +19,9 @@ CAmbientAI::CAmbientAI(TUniqueId uid, std::string_view name, const CEntityInfo& , x2d8_impactRange(impactRange) , x2dc_defaultAnim(GetModelData()->GetAnimationData()->GetDefaultAnimation()) , x2e0_alertAnim(alertAnim) -, x2e4_impactAnim(impactAnim) { +, x2e4_impactAnim(impactAnim) +, x2e8_24_dead(false) +, x2e8_25_animating(false) { GetModelData()->GetAnimationData()->EnableLooping(true); } diff --git a/Runtime/World/CAmbientAI.hpp b/Runtime/World/CAmbientAI.hpp index 8ba3dbb03..37c979955 100644 --- a/Runtime/World/CAmbientAI.hpp +++ b/Runtime/World/CAmbientAI.hpp @@ -26,14 +26,8 @@ class CAmbientAI : public CPhysicsActor { s32 x2dc_defaultAnim; s32 x2e0_alertAnim; s32 x2e4_impactAnim; - - union { - struct { - bool x2e8_24_dead : 1; - bool x2e8_25_animating : 1; - }; - u32 _dummy = 0; - }; + bool x2e8_24_dead : 1; + bool x2e8_25_animating : 1; public: CAmbientAI(TUniqueId, std::string_view, const CEntityInfo&, const zeus::CTransform&, CModelData&&, diff --git a/Runtime/World/CEntity.cpp b/Runtime/World/CEntity.cpp index 850b3ec5e..0194ca907 100644 --- a/Runtime/World/CEntity.cpp +++ b/Runtime/World/CEntity.cpp @@ -10,10 +10,11 @@ CEntity::CEntity(TUniqueId uniqueId, const CEntityInfo& info, bool active, std:: , x8_uid(uniqueId) , xc_editorId(info.GetEditorId()) , x10_name(name) -, x20_conns(info.GetConnectionList()) { - x30_24_active = active; - x30_27_inUse = x4_areaId != kInvalidAreaId; -} +, x20_conns(info.GetConnectionList()) +, x30_24_active(active) +, x30_25_inGraveyard(false) +, x30_26_scriptingBlocked(false) +, x30_27_inUse(x4_areaId != kInvalidAreaId) {} void CEntity::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateManager& stateMgr) { switch (msg) { diff --git a/Runtime/World/CEntity.hpp b/Runtime/World/CEntity.hpp index fd8dd406a..debd13f68 100644 --- a/Runtime/World/CEntity.hpp +++ b/Runtime/World/CEntity.hpp @@ -21,16 +21,10 @@ protected: TEditorId xc_editorId; std::string x10_name; std::vector x20_conns; - - union { - struct { - bool x30_24_active : 1; - bool x30_25_inGraveyard : 1; - bool x30_26_scriptingBlocked : 1; - bool x30_27_inUse : 1; - }; - u8 _dummy = 0; - }; + bool x30_24_active : 1; + bool x30_25_inGraveyard : 1; + bool x30_26_scriptingBlocked : 1; + bool x30_27_inUse : 1; public: static const std::vector NullConnectionList; diff --git a/Runtime/World/CFishCloud.cpp b/Runtime/World/CFishCloud.cpp index 16f86f27d..80d16c219 100644 --- a/Runtime/World/CFishCloud.cpp +++ b/Runtime/World/CFishCloud.cpp @@ -46,11 +46,16 @@ CFishCloud::CFishCloud(TUniqueId uid, bool active, std::string_view name, const , x16c_color(color) , x170_weaponKillRadius(weaponKillRadius) , x174_containmentRadius(containmentRadius) -, x234_deathSfx(deathSfx != 0xffffffff ? CSfxManager::TranslateSFXID(u16(deathSfx & 0xffff)) : u16(0xffff)) { - x250_28_killable = killable; - x250_29_repelFromThreats = repelFromThreats; +, x234_deathSfx(deathSfx != 0xffffffff ? CSfxManager::TranslateSFXID(u16(deathSfx & 0xffff)) : u16(0xffff)) +, x250_24_randomMovement(false) +, x250_25_worldSpace(true) // The result of a close_enough paradox (weird inlined test?) +, x250_26_enableWeaponRepelDamping(false) +, x250_27_validModel(false) +, x250_28_killable(killable) +, x250_29_repelFromThreats(repelFromThreats) +, x250_30_enablePlayerRepelDamping(false) +, x250_31_updateWithoutPartitions(false) { x108_modifierSources.reserve(10); - x250_25_worldSpace = true; // The result of a close_enough paradox (weird inlined test?) if (aRes.GetId().IsValid()) { x1b0_models.emplace_back(std::make_unique(aRes)); x1b0_models.emplace_back(std::make_unique(aRes)); diff --git a/Runtime/World/CFishCloud.hpp b/Runtime/World/CFishCloud.hpp index f6c13f3bf..a26eaef6f 100644 --- a/Runtime/World/CFishCloud.hpp +++ b/Runtime/World/CFishCloud.hpp @@ -84,19 +84,14 @@ class CFishCloud : public CActor { u16 x234_deathSfx; zeus::CVector3f x238_partitionPitch; zeus::CVector3f x244_ooPartitionPitch; - union { - struct { - bool x250_24_randomMovement : 1; - bool x250_25_worldSpace : 1; - bool x250_26_enableWeaponRepelDamping : 1; - bool x250_27_validModel : 1; - bool x250_28_killable : 1; - bool x250_29_repelFromThreats : 1; - bool x250_30_enablePlayerRepelDamping : 1; - bool x250_31_updateWithoutPartitions : 1; - }; - u32 _dummy = 0; - }; + bool x250_24_randomMovement : 1; + bool x250_25_worldSpace : 1; + bool x250_26_enableWeaponRepelDamping : 1; + bool x250_27_validModel : 1; + bool x250_28_killable : 1; + bool x250_29_repelFromThreats : 1; + bool x250_30_enablePlayerRepelDamping : 1; + bool x250_31_updateWithoutPartitions : 1; void UpdateParticles(float dt); void UpdatePartitionList(); diff --git a/Runtime/World/CGameArea.hpp b/Runtime/World/CGameArea.hpp index ea0ae48c0..b8571699c 100644 --- a/Runtime/World/CGameArea.hpp +++ b/Runtime/World/CGameArea.hpp @@ -229,18 +229,13 @@ public: // std::vector x10f0_tokens; u32 x1100_ = 0; u32 x1104_ = 0; - union { - struct { - bool x1108_24_ : 1; - bool x1108_25_modelsConstructed : 1; - bool x1108_26_ : 1; - bool x1108_27_ : 1; - bool x1108_28_occlusionPinged : 1; - bool x1108_29_pvsHasActors : 1; - bool x1108_30_ : 1; - }; - u32 _dummy = 0; - }; + bool x1108_24_ : 1; + bool x1108_25_modelsConstructed : 1; + bool x1108_26_ : 1; + bool x1108_27_ : 1; + bool x1108_28_occlusionPinged : 1; + bool x1108_29_pvsHasActors : 1; + bool x1108_30_ : 1; std::vector> x110c_layerPtrs; float x111c_thermalCurrent = 0.f; float x1120_thermalSpeed = 0.f; @@ -251,6 +246,15 @@ public: float x1134_weaponWorldLightingSpeed = 0.f; float x1138_weaponWorldLightingTarget = 1.f; u32 x113c_playerActorsLoading = 0; + + CPostConstructed() + : x1108_24_(false) + , x1108_25_modelsConstructed(false) + , x1108_26_(false) + , x1108_27_(false) + , x1108_28_occlusionPinged(false) + , x1108_29_pvsHasActors(false) + , x1108_30_(false) {} }; private: diff --git a/Runtime/World/CKnockBackController.cpp b/Runtime/World/CKnockBackController.cpp index 9c56b6042..4815c56d7 100644 --- a/Runtime/World/CKnockBackController.cpp +++ b/Runtime/World/CKnockBackController.cpp @@ -357,15 +357,19 @@ static const CKnockBackController::KnockBackParms KnockBackParmsTable[3][19][4] }, }; -CKnockBackController::CKnockBackController(EKnockBackVariant variant) : x0_variant(variant) { - x81_24_autoResetImpulse = true; - x81_25_enableFreeze = true; - x81_27_enableBurn = true; - x81_28_enableBurnDeath = true; - x81_29_enableExplodeDeath = true; - x81_30_enableLaggedBurnDeath = true; - x81_31_ = true; - x82_24_ = true; +CKnockBackController::CKnockBackController(EKnockBackVariant variant) +: x0_variant(variant) +, x81_24_autoResetImpulse(true) +, x81_25_enableFreeze(true) +, x81_26_enableShock(false) +, x81_27_enableBurn(true) +, x81_28_enableBurnDeath(true) +, x81_29_enableExplodeDeath(true) +, x81_30_enableLaggedBurnDeath(true) +, x81_31_(true) +, x82_24_(true) +, x82_25_inDeferredKnockBack(false) +, x82_26_locomotionDuringElectrocution(false) { for (int i = 0; i < 5; ++i) { x24_.push_back(std::make_pair(0.f, FLT_MAX)); x80_availableStates.set(i); diff --git a/Runtime/World/CKnockBackController.hpp b/Runtime/World/CKnockBackController.hpp index e3f4339ac..b4a9601e9 100644 --- a/Runtime/World/CKnockBackController.hpp +++ b/Runtime/World/CKnockBackController.hpp @@ -61,16 +61,16 @@ enum class EKnockBackAnimationFollowUp { class CKnockBackController { public: struct KnockBackParms { - EKnockBackAnimationState x0_animState; - EKnockBackAnimationFollowUp x4_animFollowup; - float x8_followupDuration; - float xc_intoFreezeDur; + EKnockBackAnimationState x0_animState = EKnockBackAnimationState::None; + EKnockBackAnimationFollowUp x4_animFollowup = EKnockBackAnimationFollowUp::None; + float x8_followupDuration = 0.f; + float xc_intoFreezeDur = 0.f; }; private: friend class CPatterned; EKnockBackVariant x0_variant; - KnockBackParms x4_activeParms; + KnockBackParms x4_activeParms{}; EWeaponType x14_deferWeaponType = EWeaponType::None; EKnockBackAnimationState x18_minAnimState = EKnockBackAnimationState::None; EKnockBackAnimationState x1c_maxAnimState = EKnockBackAnimationState::Fall; @@ -86,22 +86,17 @@ private: u32 x74_ = 0; pas::ESeverity x7c_severity = pas::ESeverity::One; std::bitset<5> x80_availableStates; - union { - struct { - bool x81_24_autoResetImpulse : 1; // t - bool x81_25_enableFreeze : 1; // t - bool x81_26_enableShock : 1; - bool x81_27_enableBurn : 1; // t - bool x81_28_enableBurnDeath : 1; // t - bool x81_29_enableExplodeDeath : 1; // t - bool x81_30_enableLaggedBurnDeath : 1; // t - bool x81_31_ : 1; // t - bool x82_24_ : 1; // t - bool x82_25_inDeferredKnockBack : 1; - bool x82_26_locomotionDuringElectrocution : 1; - }; - u32 dummy = 0; - }; + bool x81_24_autoResetImpulse : 1; // t + bool x81_25_enableFreeze : 1; // t + bool x81_26_enableShock : 1; + bool x81_27_enableBurn : 1; // t + bool x81_28_enableBurnDeath : 1; // t + bool x81_29_enableExplodeDeath : 1; // t + bool x81_30_enableLaggedBurnDeath : 1; // t + bool x81_31_ : 1; // t + bool x82_24_ : 1; // t + bool x82_25_inDeferredKnockBack : 1; + bool x82_26_locomotionDuringElectrocution : 1; void ApplyImpulse(float dt, CPatterned& parent); bool TickDeferredTimer(float dt); EKnockBackCharacterState GetKnockBackCharacterState(CPatterned& parent); diff --git a/Runtime/World/CPatterned.cpp b/Runtime/World/CPatterned.cpp index 1360075e3..d1f502c2c 100644 --- a/Runtime/World/CPatterned.cpp +++ b/Runtime/World/CPatterned.cpp @@ -47,6 +47,15 @@ CPatterned::CPatterned(ECharacter character, TUniqueId uid, std::string_view nam , x300_maxAttackRange(pInfo.x1c_maxAttackRange) , x304_averageAttackTime(pInfo.x20_averageAttackTime) , x308_attackTimeVariation(pInfo.x24_attackTimeVariation) +, x328_24_inPosition(false) +, x328_25_verticalMovement(moveType == EMovementType::Flyer) +, x328_26_solidCollision(false) +, x328_27_onGround(moveType != EMovementType::Flyer) +, x328_28_prevOnGround(true) +, x328_29_noPatternShagging(false) +, x328_30_lookAtDeathDir(true) +, x328_31_energyAttractor(false) +, x329_24_(true) , x34c_character(character) , x388_anim(pInfo.GetAnimationParameters().GetInitialAnimation()) , x3b4_speed(pInfo.x4_speed) @@ -61,18 +70,33 @@ CPatterned::CPatterned(ECharacter character, TUniqueId uid, std::string_view nam , x3dc_frozenXDamageThreshold(pInfo.xe0_frozenXDamage) , x3e0_xDamageDelay(pInfo.xe4_xDamageDelay) , x3fc_flavor(flavor) +, x400_24_hitByPlayerProjectile(false) +, x400_25_alive(true) +, x400_26_(false) +, x400_27_fadeToDeath(false) +, x400_28_pendingMassiveDeath(false) +, x400_29_pendingMassiveFrozenDeath(false) +, x400_30_patternShagged(false) +, x400_31_isFlyer(moveType == CPatterned::EMovementType::Flyer) +, x401_24_pathOverCount(0) +, x401_26_disableMove(false) +, x401_27_phazingOut(false) +, x401_28_burning(false) +, x401_29_laggedBurnDeath(false) +, x401_30_pendingDeath(false) +, x401_31_nextPendingShock(false) +, x402_24_pendingShock(false) +, x402_25_lostMassiveFrozenHP(false) +, x402_26_dieIf80PercFrozen(false) +, x402_27_noXrayModel(false) +, x402_28_isMakingBigStrike(false) +, x402_29_drawParticles(true) +, x402_30_updateThermalFrozenState(x402_31_thawed = actorParms.HasThermalHeat()) +, x402_31_thawed(false) +, x403_24_keepThermalVisorState(false) +, x403_25_enableStateMachine(true) // t +, x403_26_stateControlledMassiveDeath(true) , x460_knockBackController(kbVariant) { - x328_25_verticalMovement = moveType == EMovementType::Flyer; - x328_27_onGround = moveType != EMovementType::Flyer; - x328_28_prevOnGround = true; - x328_30_lookAtDeathDir = true; - x329_24_ = true; - x400_25_alive = true; - x400_31_isFlyer = moveType == CPatterned::EMovementType::Flyer; - x402_29_drawParticles = true; - x402_30_updateThermalFrozenState = x402_31_thawed = actorParms.HasThermalHeat(); - x403_25_enableStateMachine = true; - x403_26_stateControlledMassiveDeath = true; x404_contactDamage = pInfo.x34_contactDamageInfo; x424_damageWaitTime = pInfo.x50_damageWaitTime; x454_deathSfx = pInfo.xe8_deathSfx; diff --git a/Runtime/World/CPatterned.hpp b/Runtime/World/CPatterned.hpp index 812675b6e..e008cfdd1 100644 --- a/Runtime/World/CPatterned.hpp +++ b/Runtime/World/CPatterned.hpp @@ -125,21 +125,15 @@ protected: EBehaviourOrient x30c_behaviourOrient = EBehaviourOrient::MoveDir; zeus::CVector3f x310_moveVec; zeus::CVector3f x31c_faceVec; - union { - struct { - bool x328_24_inPosition : 1; - bool x328_25_verticalMovement : 1; - bool x328_26_solidCollision : 1; - bool x328_27_onGround : 1; - bool x328_28_prevOnGround : 1; - bool x328_29_noPatternShagging : 1; - bool x328_30_lookAtDeathDir : 1; - bool x328_31_energyAttractor : 1; - bool x329_24_ : 1; - }; - u32 _dummy = 0; - }; - + bool x328_24_inPosition : 1; + bool x328_25_verticalMovement : 1; + bool x328_26_solidCollision : 1; + bool x328_27_onGround : 1; + bool x328_28_prevOnGround : 1; + bool x328_29_noPatternShagging : 1; + bool x328_30_lookAtDeathDir : 1; + bool x328_31_energyAttractor : 1; + bool x329_24_ : 1; EAnimState x32c_animState = EAnimState::NotReady; CStateMachineState x330_stateMachineState; ECharacter x34c_character; @@ -176,39 +170,32 @@ protected: float x3f4_burnThinkRateTimer = 0.f; EMoveState x3f8_moveState = EMoveState::Zero; EFlavorType x3fc_flavor; - - union { - struct { - bool x400_24_hitByPlayerProjectile : 1; - bool x400_25_alive : 1; // t - bool x400_26_ : 1; - bool x400_27_fadeToDeath : 1; - bool x400_28_pendingMassiveDeath : 1; - bool x400_29_pendingMassiveFrozenDeath : 1; - bool x400_30_patternShagged : 1; - bool x400_31_isFlyer : 1; - uint32_t x401_24_pathOverCount : 2; - bool x401_26_disableMove : 1; - bool x401_27_phazingOut : 1; - bool x401_28_burning : 1; - bool x401_29_laggedBurnDeath : 1; - bool x401_30_pendingDeath : 1; - bool x401_31_nextPendingShock : 1; - bool x402_24_pendingShock : 1; - bool x402_25_lostMassiveFrozenHP : 1; - bool x402_26_dieIf80PercFrozen : 1; - bool x402_27_noXrayModel : 1; - bool x402_28_isMakingBigStrike : 1; - bool x402_29_drawParticles : 1; // t - bool x402_30_updateThermalFrozenState : 1; - bool x402_31_thawed : 1; - bool x403_24_keepThermalVisorState : 1; - bool x403_25_enableStateMachine : 1; // t - bool x403_26_stateControlledMassiveDeath : 1; // t - }; - u32 _dummy2 = 0; - }; - + bool x400_24_hitByPlayerProjectile : 1; + bool x400_25_alive : 1; // t + bool x400_26_ : 1; + bool x400_27_fadeToDeath : 1; + bool x400_28_pendingMassiveDeath : 1; + bool x400_29_pendingMassiveFrozenDeath : 1; + bool x400_30_patternShagged : 1; + bool x400_31_isFlyer : 1; + uint32_t x401_24_pathOverCount : 2; + bool x401_26_disableMove : 1; + bool x401_27_phazingOut : 1; + bool x401_28_burning : 1; + bool x401_29_laggedBurnDeath : 1; + bool x401_30_pendingDeath : 1; + bool x401_31_nextPendingShock : 1; + bool x402_24_pendingShock : 1; + bool x402_25_lostMassiveFrozenHP : 1; + bool x402_26_dieIf80PercFrozen : 1; + bool x402_27_noXrayModel : 1; + bool x402_28_isMakingBigStrike : 1; + bool x402_29_drawParticles : 1; // t + bool x402_30_updateThermalFrozenState : 1; + bool x402_31_thawed : 1; + bool x403_24_keepThermalVisorState : 1; + bool x403_25_enableStateMachine : 1; // t + bool x403_26_stateControlledMassiveDeath : 1; // t CDamageInfo x404_contactDamage; float x420_curDamageRemTime = 0.f; float x424_damageWaitTime; diff --git a/Runtime/World/CPlayer.cpp b/Runtime/World/CPlayer.cpp index 812085fe1..ea281b5e8 100644 --- a/Runtime/World/CPlayer.cpp +++ b/Runtime/World/CPlayer.cpp @@ -221,17 +221,39 @@ CPlayer::CPlayer(TUniqueId uid, const zeus::CTransform& xf, const zeus::CAABox& stepDown) , x2d8_fpBounds(aabb) , x7d0_animRes(resId, 0, playerScale, 0, true) -, x7d8_beamScale(playerScale) { +, x7d8_beamScale(playerScale) +, x9c4_24_visorChangeRequested(false) +, x9c4_25_showCrosshairs(false) +, x9c4_26_(true) +, x9c4_27_canEnterMorphBall(true) +, x9c4_28_canLeaveMorphBall(true) +, x9c4_29_spiderBallControlXY(false) +, x9c4_30_controlDirOverride(false) +, x9c4_31_inWaterMovement(false) +, x9c5_24_(false) +, x9c5_25_splashUpdated(false) +, x9c5_26_(false) +, x9c5_27_camSubmerged(false) +, x9c5_28_slidingOnWall(false) +, x9c5_29_hitWall(false) +, x9c5_30_selectFluidBallSound(false) +, x9c5_31_stepCameraZBiasDirty(true) +, x9c6_24_extendTargetDistance(false) +, x9c6_25_interpolatingControlDir(false) +, x9c6_26_outOfBallLookAtHint(false) +, x9c6_27_aimingAtProjectile(false) +, x9c6_28_aligningGrappleSwingTurn(false) +, x9c6_29_disableInput(false) +, x9c6_30_newScanScanning(false) +, x9c6_31_overrideRadarRadius(false) +, x9c7_24_noDamageLoopSfx(false) +, x9c7_25_outOfBallLookAtHintActor(false) { x490_gun = std::make_unique(uid); x49c_gunHolsterRemTime = g_tweakPlayerGun->GetGunNotFiringTime(); x4a0_failsafeTest = std::make_unique(); x76c_cameraBob = std::make_unique(CPlayerCameraBob::ECameraBobType::One, CPlayerCameraBob::GetCameraBobExtent(), CPlayerCameraBob::GetCameraBobPeriod()); - x9c4_26_ = true; - x9c4_27_canEnterMorphBall = true; - x9c4_28_canLeaveMorphBall = true; - x9c5_31_stepCameraZBiasDirty = true; const CAssetId beamId = g_tweakPlayerRes->GetBeamBallTransitionModel(x7ec_beam); x7f0_ballTransitionBeamModel = std::make_unique(CStaticRes(beamId, playerScale)); x730_transitionModels.reserve(3); diff --git a/Runtime/World/CPlayer.hpp b/Runtime/World/CPlayer.hpp index bbe098bd5..b36616ea7 100644 --- a/Runtime/World/CPlayer.hpp +++ b/Runtime/World/CPlayer.hpp @@ -285,39 +285,32 @@ private: rstl::reserved_vector, 32> x838_playerHints; rstl::reserved_vector x93c_playerHintsToRemove; rstl::reserved_vector x980_playerHintsToAdd; - - union { - struct { - bool x9c4_24_visorChangeRequested : 1; - bool x9c4_25_showCrosshairs : 1; - bool x9c4_26_ : 1; - bool x9c4_27_canEnterMorphBall : 1; - bool x9c4_28_canLeaveMorphBall : 1; - bool x9c4_29_spiderBallControlXY : 1; - bool x9c4_30_controlDirOverride : 1; - bool x9c4_31_inWaterMovement : 1; - bool x9c5_24_ : 1; - bool x9c5_25_splashUpdated : 1; - bool x9c5_26_ : 1; - bool x9c5_27_camSubmerged : 1; - bool x9c5_28_slidingOnWall : 1; - bool x9c5_29_hitWall : 1; - bool x9c5_30_selectFluidBallSound : 1; - bool x9c5_31_stepCameraZBiasDirty : 1; - bool x9c6_24_extendTargetDistance : 1; - bool x9c6_25_interpolatingControlDir : 1; - bool x9c6_26_outOfBallLookAtHint : 1; - bool x9c6_27_aimingAtProjectile : 1; - bool x9c6_28_aligningGrappleSwingTurn : 1; - bool x9c6_29_disableInput : 1; - bool x9c6_30_newScanScanning : 1; - bool x9c6_31_overrideRadarRadius : 1; - bool x9c7_24_noDamageLoopSfx : 1; - bool x9c7_25_outOfBallLookAtHintActor : 1; - }; - u32 _dummy = 0; - }; - + bool x9c4_24_visorChangeRequested : 1; + bool x9c4_25_showCrosshairs : 1; + bool x9c4_26_ : 1; + bool x9c4_27_canEnterMorphBall : 1; + bool x9c4_28_canLeaveMorphBall : 1; + bool x9c4_29_spiderBallControlXY : 1; + bool x9c4_30_controlDirOverride : 1; + bool x9c4_31_inWaterMovement : 1; + bool x9c5_24_ : 1; + bool x9c5_25_splashUpdated : 1; + bool x9c5_26_ : 1; + bool x9c5_27_camSubmerged : 1; + bool x9c5_28_slidingOnWall : 1; + bool x9c5_29_hitWall : 1; + bool x9c5_30_selectFluidBallSound : 1; + bool x9c5_31_stepCameraZBiasDirty : 1; + bool x9c6_24_extendTargetDistance : 1; + bool x9c6_25_interpolatingControlDir : 1; + bool x9c6_26_outOfBallLookAtHint : 1; + bool x9c6_27_aimingAtProjectile : 1; + bool x9c6_28_aligningGrappleSwingTurn : 1; + bool x9c6_29_disableInput : 1; + bool x9c6_30_newScanScanning : 1; + bool x9c6_31_overrideRadarRadius : 1; + bool x9c7_24_noDamageLoopSfx : 1; + bool x9c7_25_outOfBallLookAtHintActor : 1; float x9c8_eyeZBias = 0.f; float x9cc_stepCameraZBias = 0.f; u32 x9d0_bombJumpCount = 0; diff --git a/Runtime/World/CScriptActorKeyframe.cpp b/Runtime/World/CScriptActorKeyframe.cpp index ef5237923..4da536cfd 100644 --- a/Runtime/World/CScriptActorKeyframe.cpp +++ b/Runtime/World/CScriptActorKeyframe.cpp @@ -15,14 +15,13 @@ CScriptActorKeyframe::CScriptActorKeyframe(TUniqueId uid, std::string_view name, , x34_animationId(animId) , x38_initialLifetime(lifetime) , x3c_playbackRate(totalPlayback) -, x40_lifetime(lifetime) { - x44_24_looping = looping; - x44_25_isPassive = isPassive; - x44_26_fadeOut = fadeOut; - x44_27_timedLoop = fadeOut; - x44_28_playing = false; - x44_29_ = false; -} +, x40_lifetime(lifetime) +, x44_24_looping(looping) +, x44_25_isPassive(isPassive) +, x44_26_fadeOut(fadeOut != 0u) +, x44_27_timedLoop(fadeOut != 0u) +, x44_28_playing(false) +, x44_29_(false) {} void CScriptActorKeyframe::Accept(IVisitor& visitor) { visitor.Visit(this); } diff --git a/Runtime/World/CScriptActorKeyframe.hpp b/Runtime/World/CScriptActorKeyframe.hpp index 659ff4f36..ac6b78aed 100644 --- a/Runtime/World/CScriptActorKeyframe.hpp +++ b/Runtime/World/CScriptActorKeyframe.hpp @@ -12,17 +12,12 @@ private: float x38_initialLifetime; float x3c_playbackRate; float x40_lifetime; - union { - struct { - bool x44_24_looping : 1; - bool x44_25_isPassive : 1; - bool x44_26_fadeOut : 1; - bool x44_27_timedLoop : 1; - bool x44_28_playing : 1; - bool x44_29_ : 1; - }; - u8 _dummy = 0; - }; + bool x44_24_looping : 1; + bool x44_25_isPassive : 1; + bool x44_26_fadeOut : 1; + bool x44_27_timedLoop : 1; + bool x44_28_playing : 1; + bool x44_29_ : 1; public: CScriptActorKeyframe(TUniqueId uid, std::string_view name, const CEntityInfo& info, s32 animId, bool looping, diff --git a/Runtime/World/CScriptActorRotate.hpp b/Runtime/World/CScriptActorRotate.hpp index 8f1893679..89c03d50d 100644 --- a/Runtime/World/CScriptActorRotate.hpp +++ b/Runtime/World/CScriptActorRotate.hpp @@ -18,16 +18,10 @@ class CScriptActorRotate : public CEntity { float x40_maxTime; float x44_currentTime = 0.f; std::map x48_actors; - - union { - struct { - bool x58_24_updateRotation : 1; - bool x58_25_skipSpiderBallWaypoints : 1; - bool x58_26_updateActors : 1; - bool x58_27_updateOnCreation : 1; - }; - u32 dummy = 0; - }; + bool x58_24_updateRotation : 1; + bool x58_25_skipSpiderBallWaypoints : 1; + bool x58_26_updateActors : 1; + bool x58_27_updateOnCreation : 1; void UpdateActors(bool, CStateManager&); void UpdateSpiderBallWaypoints(CStateManager&); diff --git a/Runtime/World/CScriptAiJumpPoint.cpp b/Runtime/World/CScriptAiJumpPoint.cpp index 934e7371c..f49f08566 100644 --- a/Runtime/World/CScriptAiJumpPoint.cpp +++ b/Runtime/World/CScriptAiJumpPoint.cpp @@ -12,7 +12,8 @@ CScriptAiJumpPoint::CScriptAiJumpPoint(TUniqueId uid, std::string_view name, con : CActor(uid, active, name, info, xf, CModelData::CModelDataNull(), CMaterialList(EMaterialTypes::NoStepLogic), CActorParameters::None(), kInvalidUniqueId) , xe8_apex(apex) -, xec_touchBounds(xf.origin, xf.origin) {} +, xec_touchBounds(xf.origin, xf.origin) +, x108_24(false) {} void CScriptAiJumpPoint::Accept(IVisitor& visitor) { visitor.Visit(this); } diff --git a/Runtime/World/CScriptAiJumpPoint.hpp b/Runtime/World/CScriptAiJumpPoint.hpp index 1f62259a8..74a8224fd 100644 --- a/Runtime/World/CScriptAiJumpPoint.hpp +++ b/Runtime/World/CScriptAiJumpPoint.hpp @@ -12,12 +12,7 @@ class CScriptAiJumpPoint : public CActor { private: float xe8_apex; zeus::CAABox xec_touchBounds; - union { - struct { - bool x108_24 : 1; - }; - u8 dummy = 0; - }; + bool x108_24 : 1; TUniqueId x10a_occupant = kInvalidUniqueId; TUniqueId x10c_currentWaypoint = kInvalidUniqueId; TUniqueId x10e_nextWaypoint = kInvalidUniqueId; diff --git a/Runtime/World/CScriptCameraHintTrigger.cpp b/Runtime/World/CScriptCameraHintTrigger.cpp index 0498fb39d..d52ed6b0f 100644 --- a/Runtime/World/CScriptCameraHintTrigger.cpp +++ b/Runtime/World/CScriptCameraHintTrigger.cpp @@ -14,10 +14,11 @@ CScriptCameraHintTrigger::CScriptCameraHintTrigger(TUniqueId uid, bool active, s : CActor(uid, active, name, info, xf, CModelData::CModelDataNull(), CMaterialList(EMaterialTypes::Trigger), CActorParameters::None(), kInvalidUniqueId) , xe8_obb(xf, scale) -, x124_scale(scale) { - x130_24_deactivateOnEnter = deactivateOnEnter; - x130_25_deactivateOnExit = deactivateOnExit; -} +, x124_scale(scale) +, x130_24_deactivateOnEnter(deactivateOnEnter) +, x130_25_deactivateOnExit(deactivateOnExit) +, x130_26_playerInside(false) +, x130_27_playerWasInside(false) {} void CScriptCameraHintTrigger::Accept(IVisitor& visitor) { visitor.Visit(this); } diff --git a/Runtime/World/CScriptCameraHintTrigger.hpp b/Runtime/World/CScriptCameraHintTrigger.hpp index 68497d278..b1a0067f2 100644 --- a/Runtime/World/CScriptCameraHintTrigger.hpp +++ b/Runtime/World/CScriptCameraHintTrigger.hpp @@ -12,15 +12,10 @@ namespace urde { class CScriptCameraHintTrigger : public CActor { zeus::COBBox xe8_obb; zeus::CVector3f x124_scale; - union { - struct { - bool x130_24_deactivateOnEnter : 1; - bool x130_25_deactivateOnExit : 1; - bool x130_26_playerInside : 1; - bool x130_27_playerWasInside : 1; - }; - u32 _dummy = 0; - }; + bool x130_24_deactivateOnEnter : 1; + bool x130_25_deactivateOnExit : 1; + bool x130_26_playerInside : 1; + bool x130_27_playerWasInside : 1; public: CScriptCameraHintTrigger(TUniqueId uid, bool active, std::string_view name, diff --git a/Runtime/World/CScriptCameraPitchVolume.cpp b/Runtime/World/CScriptCameraPitchVolume.cpp index 7bbbc76a9..ac19a0e77 100644 --- a/Runtime/World/CScriptCameraPitchVolume.cpp +++ b/Runtime/World/CScriptCameraPitchVolume.cpp @@ -22,7 +22,9 @@ CScriptCameraPitchVolume::CScriptCameraPitchVolume(TUniqueId uid, bool active, s , x124_upPitch(upPitch) , x128_downPitch(downPitch) , x12c_scale(scale * skScaleFactor) -, x138_maxInterpDistance(maxInterpDistance) {} +, x138_maxInterpDistance(maxInterpDistance) +, x13c_24_entered(false) +, x13c_25_occupied(false) {} void CScriptCameraPitchVolume::Accept(IVisitor& visitor) { visitor.Visit(this); } diff --git a/Runtime/World/CScriptCameraPitchVolume.hpp b/Runtime/World/CScriptCameraPitchVolume.hpp index 2b84d2816..b50dfa3ad 100644 --- a/Runtime/World/CScriptCameraPitchVolume.hpp +++ b/Runtime/World/CScriptCameraPitchVolume.hpp @@ -17,14 +17,8 @@ class CScriptCameraPitchVolume : public CActor { zeus::CRelAngle x128_downPitch; zeus::CVector3f x12c_scale; float x138_maxInterpDistance; - - union { - struct { - bool x13c_24_entered : 1; - bool x13c_25_occupied : 1; - }; - u32 _dummy = 0; - }; + bool x13c_24_entered : 1; + bool x13c_25_occupied : 1; public: CScriptCameraPitchVolume(TUniqueId, bool, std::string_view, const CEntityInfo&, const zeus::CVector3f&, diff --git a/Runtime/World/CScriptColorModulate.cpp b/Runtime/World/CScriptColorModulate.cpp index b194417ba..7c9226dd6 100644 --- a/Runtime/World/CScriptColorModulate.cpp +++ b/Runtime/World/CScriptColorModulate.cpp @@ -15,17 +15,16 @@ CScriptColorModulate::CScriptColorModulate(TUniqueId uid, std::string_view name, , x44_colorB(colorB) , x48_blendMode(blendMode) , x4c_timeA2B(timeA2B) -, x50_timeB2A(timeB2A) { - x54_24_doReverse = doReverse; - x54_25_resetTargetWhenDone = resetTargetWhenDone; - x54_26_depthCompare = depthCompare; - x54_27_depthUpdate = depthUpdate; - x54_28_depthBackwards = depthBackwards; - x54_29_reversing = false; - x54_30_enable = false; - x54_31_dieOnEnd = false; - x55_24_isFadeOutHelper = false; -} +, x50_timeB2A(timeB2A) +, x54_24_doReverse(doReverse) +, x54_25_resetTargetWhenDone(resetTargetWhenDone) +, x54_26_depthCompare(depthCompare) +, x54_27_depthUpdate(depthUpdate) +, x54_28_depthBackwards(depthBackwards) +, x54_29_reversing(false) +, x54_30_enable(false) +, x54_31_dieOnEnd(false) +, x55_24_isFadeOutHelper(false) {} void CScriptColorModulate::Accept(IVisitor& visitor) { visitor.Visit(this); } diff --git a/Runtime/World/CScriptColorModulate.hpp b/Runtime/World/CScriptColorModulate.hpp index bd60316f9..750fbb46a 100644 --- a/Runtime/World/CScriptColorModulate.hpp +++ b/Runtime/World/CScriptColorModulate.hpp @@ -30,20 +30,15 @@ private: EBlendMode x48_blendMode; float x4c_timeA2B; float x50_timeB2A; - union { - struct { - bool x54_24_doReverse : 1; - bool x54_25_resetTargetWhenDone : 1; - bool x54_26_depthCompare : 1; - bool x54_27_depthUpdate : 1; - bool x54_28_depthBackwards : 1; - bool x54_29_reversing : 1; - bool x54_30_enable : 1; - bool x54_31_dieOnEnd : 1; - bool x55_24_isFadeOutHelper : 1; - }; - u32 _dummy = 0; - }; + bool x54_24_doReverse : 1; + bool x54_25_resetTargetWhenDone : 1; + bool x54_26_depthCompare : 1; + bool x54_27_depthUpdate : 1; + bool x54_28_depthBackwards : 1; + bool x54_29_reversing : 1; + bool x54_30_enable : 1; + bool x54_31_dieOnEnd : 1; + bool x55_24_isFadeOutHelper : 1; public: CScriptColorModulate(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CColor& colorA, diff --git a/Runtime/World/CScriptControllerAction.cpp b/Runtime/World/CScriptControllerAction.cpp index c1f5b4fa0..57c89676b 100644 --- a/Runtime/World/CScriptControllerAction.cpp +++ b/Runtime/World/CScriptControllerAction.cpp @@ -10,10 +10,12 @@ namespace urde { CScriptControllerAction::CScriptControllerAction(TUniqueId uid, std::string_view name, const CEntityInfo& info, bool active, ControlMapper::ECommands command, bool mapScreenResponse, u32 w1, bool deactivateOnClose) -: CEntity(uid, info, active, name), x34_command(command), x38_mapScreenSubaction(w1) { - x3c_24_mapScreenResponse = mapScreenResponse; - x3c_25_deactivateOnClose = deactivateOnClose; -} +: CEntity(uid, info, active, name) +, x34_command(command) +, x38_mapScreenSubaction(w1) +, x3c_24_mapScreenResponse(mapScreenResponse) +, x3c_25_deactivateOnClose(deactivateOnClose) +, x3c_26_pressed(false) {} void CScriptControllerAction::Accept(IVisitor& visitor) { visitor.Visit(this); } diff --git a/Runtime/World/CScriptControllerAction.hpp b/Runtime/World/CScriptControllerAction.hpp index a18dd5838..e7e0c2486 100644 --- a/Runtime/World/CScriptControllerAction.hpp +++ b/Runtime/World/CScriptControllerAction.hpp @@ -11,14 +11,9 @@ namespace urde { class CScriptControllerAction : public CEntity { ControlMapper::ECommands x34_command; u32 x38_mapScreenSubaction; - union { - struct { - bool x3c_24_mapScreenResponse : 1; - bool x3c_25_deactivateOnClose : 1; - bool x3c_26_pressed : 1; - }; - u8 _dummy = 0; - }; + bool x3c_24_mapScreenResponse : 1; + bool x3c_25_deactivateOnClose : 1; + bool x3c_26_pressed : 1; public: CScriptControllerAction(TUniqueId uid, std::string_view name, const CEntityInfo& info, bool active, diff --git a/Runtime/World/CScriptCoverPoint.cpp b/Runtime/World/CScriptCoverPoint.cpp index 44af6ac16..f55cc93b1 100644 --- a/Runtime/World/CScriptCoverPoint.cpp +++ b/Runtime/World/CScriptCoverPoint.cpp @@ -11,9 +11,12 @@ CScriptCoverPoint::CScriptCoverPoint(TUniqueId uid, std::string_view name, const float coverTime) : CActor(uid, active, name, info, xf, CModelData::CModelDataNull(), CMaterialList(EMaterialTypes::NoStepLogic), CActorParameters::None(), kInvalidUniqueId) -, xe8_flags(flags) -, xf4_coverTime(coverTime) { - xf8_24_crouch = crouch; +, xe8_26_landHere((flags & 0x20) != 0u) +, xe8_27_wallHang((flags & 0x10) != 0u) +, xe8_28_stay((flags & 0x8) != 0u) +, xf4_coverTime(coverTime) +, xf8_24_crouch(crouch) +, xf8_25_inUse(false) { xec_cosHorizontalAngle = std::cos(zeus::degToRad(horizontalAngle) * 0.5f); xf0_sinVerticalAngle = std::sin(zeus::degToRad(verticalAngle) * 0.5f); x100_touchBounds.emplace(xf.origin, xf.origin); diff --git a/Runtime/World/CScriptCoverPoint.hpp b/Runtime/World/CScriptCoverPoint.hpp index 176636db9..98f938c29 100644 --- a/Runtime/World/CScriptCoverPoint.hpp +++ b/Runtime/World/CScriptCoverPoint.hpp @@ -10,25 +10,14 @@ namespace urde { class CScriptCoverPoint : public CActor { - union { - struct { - bool xe8_26_landHere : 1; - bool xe8_27_wallHang : 1; - bool xe8_28_stay : 1; - }; - u32 xe8_flags; - }; - + bool xe8_26_landHere : 1; + bool xe8_27_wallHang : 1; + bool xe8_28_stay : 1; float xec_cosHorizontalAngle; float xf0_sinVerticalAngle; float xf4_coverTime; - union { - struct { - bool xf8_24_crouch : 1; - bool xf8_25_inUse : 1; - }; - u32 xf8_flags = 0; - }; + bool xf8_24_crouch : 1; + bool xf8_25_inUse : 1; TUniqueId xfa_occupant = kInvalidUniqueId; TUniqueId xfc_retreating = kInvalidUniqueId; std::optional x100_touchBounds; diff --git a/Runtime/World/CScriptDamageableTrigger.cpp b/Runtime/World/CScriptDamageableTrigger.cpp index 3b0a6040b..71fd94ef8 100644 --- a/Runtime/World/CScriptDamageableTrigger.cpp +++ b/Runtime/World/CScriptDamageableTrigger.cpp @@ -36,8 +36,12 @@ CScriptDamageableTrigger::CScriptDamageableTrigger(TUniqueId uid, std::string_vi , x16c_hInfo(hInfo) , x174_dVuln(dVuln) , x1dc_faceFlag(faceFlag) -, x254_fluidPlane(patternTex1, patternTex2, colorTex, 1.f, 2, EFluidType::NormalWater, 1.f, CFluidUVMotion(6.f, 0.f)) { - x300_28_canOrbit = canOrbit == ECanOrbit::Orbit; +, x254_fluidPlane(patternTex1, patternTex2, colorTex, 1.f, 2, EFluidType::NormalWater, 1.f, CFluidUVMotion(6.f, 0.f)) +, x300_24_notOccluded(false) +, x300_25_alphaOut(false) +, x300_26_outOfFrustum(false) +, x300_27_invulnerable(false) +, x300_28_canOrbit(canOrbit == ECanOrbit::Orbit) { if (x1dc_faceFlag & 0x1) { x244_faceTranslate = zeus::CVector3f(0.f, x14c_bounds.max.y(), 0.f); x1e4_faceDir = zeus::CTransform::RotateX(-M_PIF / 2.f); diff --git a/Runtime/World/CScriptDamageableTrigger.hpp b/Runtime/World/CScriptDamageableTrigger.hpp index 991bbdb0b..378385231 100644 --- a/Runtime/World/CScriptDamageableTrigger.hpp +++ b/Runtime/World/CScriptDamageableTrigger.hpp @@ -30,16 +30,12 @@ private: zeus::CVector3f x244_faceTranslate; float x250_alphaTimer = 0.f; CFluidPlaneDoor x254_fluidPlane; - union { - struct { - bool x300_24_notOccluded : 1; - bool x300_25_alphaOut : 1; - bool x300_26_outOfFrustum : 1; - bool x300_27_invulnerable : 1; - bool x300_28_canOrbit : 1; - }; - u32 _dummy = 0; - }; + bool x300_24_notOccluded : 1; + bool x300_25_alphaOut : 1; + bool x300_26_outOfFrustum : 1; + bool x300_27_invulnerable : 1; + bool x300_28_canOrbit : 1; + void SetLinkedObjectAlpha(float a, CStateManager& mgr); float GetPuddleAlphaScale() const; diff --git a/Runtime/World/CScriptDebris.cpp b/Runtime/World/CScriptDebris.cpp index 740c2bda1..7cdc46d56 100644 --- a/Runtime/World/CScriptDebris.cpp +++ b/Runtime/World/CScriptDebris.cpp @@ -27,9 +27,17 @@ CScriptDebris::CScriptDebris(TUniqueId uid, std::string_view name, const CEntity , x278_ooDuration(1.f / x274_duration) , x27c_restitution(restitution) , x280_scaleType(scaleType) +, x281_24_randomAngImpulse(randomAngImpulse) +, x281_25_particle1GlobalTranslation(false) +, x281_26_deferDeleteTillParticle1Done(false) +, x281_27_particle2GlobalTranslation(false) +, x281_28_deferDeleteTillParticle2Done(false) +, x281_29_particle3Active(false) +, x281_30_debrisExtended(false) +, x281_31_dieOnProjectile(false) +, x282_24_noBounce(false) , x2b0_scale(mData.GetScale()) , x2e0_speedAvg(2.f) { - x281_24_randomAngImpulse = randomAngImpulse; if (scaleType == EScaleType::NoScale) x2bc_endScale = mData.GetScale(); else if (scaleType == EScaleType::EndsToZero) @@ -80,6 +88,15 @@ CScriptDebris::CScriptDebris(TUniqueId uid, std::string_view name, const CEntity , x264_color(color) , x268_endsColor(endsColor) , x27c_restitution(restitution) +, x281_24_randomAngImpulse(false) +, x281_25_particle1GlobalTranslation(particle1GlobalTranslation) +, x281_26_deferDeleteTillParticle1Done(deferDeleteTillParticle1Done) +, x281_27_particle2GlobalTranslation(particle2GlobalTranslation) +, x281_28_deferDeleteTillParticle2Done(deferDeleteTillParticle2Done) +, x281_29_particle3Active(false) +, x281_30_debrisExtended(true) +, x281_31_dieOnProjectile(false) +, x282_24_noBounce(noBounce) , x288_linConeAngle(linConeAngle) , x28c_linMinMag(linMinMag) , x290_linMaxMag(linMaxMag) @@ -93,13 +110,6 @@ CScriptDebris::CScriptDebris(TUniqueId uid, std::string_view name, const CEntity , x2b0_scale(scale) , x2bc_endScale(scale * endScale) , x2e0_speedAvg(2.f) { - x281_25_particle1GlobalTranslation = particle1GlobalTranslation; - x281_26_deferDeleteTillParticle1Done = deferDeleteTillParticle1Done; - x281_27_particle2GlobalTranslation = particle2GlobalTranslation; - x281_28_deferDeleteTillParticle2Done = deferDeleteTillParticle2Done; - x281_30_debrisExtended = true; - x281_31_dieOnProjectile = dieOnProjectile; - x282_24_noBounce = noBounce; x283_particleOrs[0] = particle1Or; x283_particleOrs[1] = particle2Or; x283_particleOrs[2] = particle3Or; diff --git a/Runtime/World/CScriptDebris.hpp b/Runtime/World/CScriptDebris.hpp index bf7ca8cfa..3fe94ac1a 100644 --- a/Runtime/World/CScriptDebris.hpp +++ b/Runtime/World/CScriptDebris.hpp @@ -27,20 +27,15 @@ private: float x278_ooDuration = 0.f; float x27c_restitution; CScriptDebris::EScaleType x280_scaleType = CScriptDebris::EScaleType::NoScale; - union { - struct { - bool x281_24_randomAngImpulse : 1; - bool x281_25_particle1GlobalTranslation : 1; - bool x281_26_deferDeleteTillParticle1Done : 1; - bool x281_27_particle2GlobalTranslation : 1; - bool x281_28_deferDeleteTillParticle2Done : 1; - bool x281_29_particle3Active : 1; - bool x281_30_debrisExtended : 1; - bool x281_31_dieOnProjectile : 1; - bool x282_24_noBounce : 1; - }; - u32 _dummy = 0; - }; + bool x281_24_randomAngImpulse : 1; + bool x281_25_particle1GlobalTranslation : 1; + bool x281_26_deferDeleteTillParticle1Done : 1; + bool x281_27_particle2GlobalTranslation : 1; + bool x281_28_deferDeleteTillParticle2Done : 1; + bool x281_29_particle3Active : 1; + bool x281_30_debrisExtended : 1; + bool x281_31_dieOnProjectile : 1; + bool x282_24_noBounce : 1; EOrientationType x283_particleOrs[3] = {}; float x288_linConeAngle = 0.f; float x28c_linMinMag = 0.f; diff --git a/Runtime/World/CScriptDock.cpp b/Runtime/World/CScriptDock.cpp index 9440242a9..8b5707568 100644 --- a/Runtime/World/CScriptDock.cpp +++ b/Runtime/World/CScriptDock.cpp @@ -23,14 +23,15 @@ CMaterialList MakeDockMaterialList() { CScriptDock::CScriptDock(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CVector3f& position, const zeus::CVector3f& extents, s32 dock, TAreaId area, bool active, s32 dockReferenceCount, bool loadConnected) -: CPhysicsActor(uid, active, name, info, zeus::CTransform(zeus::CMatrix3f(), position), - CModelData::CModelDataNull(), MakeDockMaterialList(), zeus::CAABox(-extents * 0.5f, extents * 0.5f), - SMoverData(1.f), CActorParameters::None(), 0.3f, 0.1f) +: CPhysicsActor(uid, active, name, info, zeus::CTransform(zeus::CMatrix3f(), position), CModelData::CModelDataNull(), + MakeDockMaterialList(), zeus::CAABox(-extents * 0.5f, extents * 0.5f), SMoverData(1.f), + CActorParameters::None(), 0.3f, 0.1f) , x258_dockReferenceCount(dockReferenceCount) , x25c_dock(dock) -, x260_area(area) { - x268_25_loadConnected = loadConnected; -} +, x260_area(area) +, x268_24_dockReferenced(false) +, x268_25_loadConnected(loadConnected) +, x268_26_areaPostConstructed(false) {} void CScriptDock::Accept(IVisitor& visitor) { visitor.Visit(this); } diff --git a/Runtime/World/CScriptDock.hpp b/Runtime/World/CScriptDock.hpp index 42d7605e8..f34d71a73 100644 --- a/Runtime/World/CScriptDock.hpp +++ b/Runtime/World/CScriptDock.hpp @@ -15,14 +15,9 @@ class CScriptDock : public CPhysicsActor { s32 x25c_dock; TAreaId x260_area; EDockState x264_dockState = EDockState::Three; - union { - struct { - bool x268_24_dockReferenced : 1; - bool x268_25_loadConnected : 1; - bool x268_26_areaPostConstructed : 1; - }; - u8 dummy = 0; - }; + bool x268_24_dockReferenced : 1; + bool x268_25_loadConnected : 1; + bool x268_26_areaPostConstructed : 1; public: CScriptDock(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CVector3f& position, diff --git a/Runtime/World/CScriptEffect.cpp b/Runtime/World/CScriptEffect.cpp index 523ae2ace..f5a84c874 100644 --- a/Runtime/World/CScriptEffect.cpp +++ b/Runtime/World/CScriptEffect.cpp @@ -32,6 +32,17 @@ CScriptEffect::CScriptEffect(TUniqueId uid, std::string_view name, const CEntity : CActor(uid, active, name, info, xf, CModelData::CModelDataNull(), CMaterialList(), CActorParameters::None().HotInThermal(hotInThermal), kInvalidUniqueId) , x10c_partId(partId) +, x110_24_enable(active) +, x110_25_noTimerUnlessAreaOccluded(noTimerUnlessAreaOccluded) +, x110_26_rebuildSystemsOnActivate(rebuildSystemsOnActivate) +, x110_27_useRateInverseCamDist(useRateInverseCamDist) +, x110_28_combatVisorVisible(combatVisorVisible) +, x110_29_thermalVisorVisible(thermalVisorVisible) +, x110_30_xrayVisorVisible(xrayVisorVisible) +, x110_31_anyVisorVisible(xrayVisorVisible && thermalVisorVisible && combatVisorVisible) +, x111_24_useRateCamDistRange(useRateCamDistRange) +, x111_25_dieWhenSystemsDone(dieWhenSystemsDone) +, x111_26_canRender(false) , x114_rateInverseCamDist(rateInverseCamDist) , x118_rateInverseCamDistSq(rateInverseCamDist * rateInverseCamDist) , x11c_rateInverseCamDistRate(rateInverseCamDistRate) @@ -42,18 +53,6 @@ CScriptEffect::CScriptEffect(TUniqueId uid, std::string_view name, const CEntity , x130_duration(duration) , x134_durationResetWhileVisible(durationResetWhileVisible) , x138_actorLights(lParms.MakeActorLights()) { - x110_24_enable = active; - x110_25_noTimerUnlessAreaOccluded = noTimerUnlessAreaOccluded; - x110_26_rebuildSystemsOnActivate = rebuildSystemsOnActivate; - x110_27_useRateInverseCamDist = useRateInverseCamDist; - x110_28_combatVisorVisible = combatVisorVisible; - x110_29_thermalVisorVisible = thermalVisorVisible; - x110_30_xrayVisorVisible = xrayVisorVisible; - x110_31_anyVisorVisible = xrayVisorVisible && thermalVisorVisible && combatVisorVisible; - x111_24_useRateCamDistRange = useRateCamDistRange; - x111_25_dieWhenSystemsDone = dieWhenSystemsDone; - x111_26_canRender = false; - if (partId.IsValid()) { xf8_particleSystemToken = g_SimplePool->GetObj({FOURCC('PART'), partId}); x104_particleSystem = std::make_unique(xf8_particleSystemToken); diff --git a/Runtime/World/CScriptEffect.hpp b/Runtime/World/CScriptEffect.hpp index 384b62130..261486754 100644 --- a/Runtime/World/CScriptEffect.hpp +++ b/Runtime/World/CScriptEffect.hpp @@ -19,22 +19,17 @@ class CScriptEffect : public CActor { std::unique_ptr x104_particleSystem; TUniqueId x108_lightId = kInvalidUniqueId; CAssetId x10c_partId; - union { - struct { - bool x110_24_enable : 1; - bool x110_25_noTimerUnlessAreaOccluded : 1; - bool x110_26_rebuildSystemsOnActivate : 1; - bool x110_27_useRateInverseCamDist : 1; - bool x110_28_combatVisorVisible : 1; - bool x110_29_thermalVisorVisible : 1; - bool x110_30_xrayVisorVisible : 1; - bool x110_31_anyVisorVisible : 1; - bool x111_24_useRateCamDistRange : 1; - bool x111_25_dieWhenSystemsDone : 1; - bool x111_26_canRender : 1; - }; - u32 _dummy = 0; - }; + bool x110_24_enable : 1; + bool x110_25_noTimerUnlessAreaOccluded : 1; + bool x110_26_rebuildSystemsOnActivate : 1; + bool x110_27_useRateInverseCamDist : 1; + bool x110_28_combatVisorVisible : 1; + bool x110_29_thermalVisorVisible : 1; + bool x110_30_xrayVisorVisible : 1; + bool x110_31_anyVisorVisible : 1; + bool x111_24_useRateCamDistRange : 1; + bool x111_25_dieWhenSystemsDone : 1; + bool x111_26_canRender : 1; float x114_rateInverseCamDist; float x118_rateInverseCamDistSq; float x11c_rateInverseCamDistRate; diff --git a/Runtime/World/CScriptGenerator.hpp b/Runtime/World/CScriptGenerator.hpp index 3b98b7101..76b154b20 100644 --- a/Runtime/World/CScriptGenerator.hpp +++ b/Runtime/World/CScriptGenerator.hpp @@ -11,13 +11,8 @@ namespace urde { class CScriptGenerator : public CEntity { u32 x34_spawnCount; - union { - struct { - bool x38_24_noReuseFollowers : 1; - bool x38_25_noInheritTransform : 1; - }; - u8 dummy1 = 0; - }; + bool x38_24_noReuseFollowers : 1; + bool x38_25_noInheritTransform : 1; zeus::CVector3f x3c_offset; float x48_minScale; float x4c_maxScale; diff --git a/Runtime/World/CScriptGunTurret.cpp b/Runtime/World/CScriptGunTurret.cpp index 774a4319e..dde720de5 100644 --- a/Runtime/World/CScriptGunTurret.cpp +++ b/Runtime/World/CScriptGunTurret.cpp @@ -158,7 +158,15 @@ CScriptGunTurret::CScriptGunTurret(TUniqueId uid, std::string_view name, ETurret , x428_targettingLightDesc(g_SimplePool->GetObj({SBIG('PART'), turretData.GetTargettingLightRes()})) , x434_frozenEffectDesc(g_SimplePool->GetObj({SBIG('PART'), turretData.GetFrozenEffectRes()})) , x440_chargingEffectDesc(g_SimplePool->GetObj({SBIG('PART'), turretData.GetChargingEffectRes()})) -, x44c_panningEffectDesc(g_SimplePool->GetObj({SBIG('PART'), turretData.GetPanningEffectRes()})) { +, x44c_panningEffectDesc(g_SimplePool->GetObj({SBIG('PART'), turretData.GetPanningEffectRes()})) +, x560_24_dead(false) +, x560_25_frozen(false) +, x560_26_firedWithSetBurst(false) +, x560_27_burstSet(false) +, x560_28_hasBeenActivated(false) +, x560_29_scriptedStart(false) +, x560_30_needsStopClankSound(true) +, x560_31_frenzyReverse(false) { if (turretData.GetVisorEffectRes().IsValid()) x458_visorEffectDesc = g_SimplePool->GetObj({SBIG('PART'), turretData.GetVisorEffectRes()}); x468_idleLight = std::make_unique(x410_idleLightDesc); @@ -171,14 +179,6 @@ CScriptGunTurret::CScriptGunTurret(TUniqueId uid, std::string_view name, ETurret x514_lastFrontVector = xf.frontVector(); x544_originalFrontVec = xf.frontVector(); x550_originalRightVec = xf.rightVector(); - x560_24_dead = false; - x560_25_frozen = false; - x560_26_firedWithSetBurst = false; - x560_27_burstSet = false; - x560_28_hasBeenActivated = false; - x560_29_scriptedStart = false; - x560_30_needsStopClankSound = true; - x560_31_frenzyReverse = false; if (comp == ETurretComponent::Base && HasModelData() && GetModelData()->HasAnimData()) GetModelData()->EnableLooping(true); diff --git a/Runtime/World/CScriptGunTurret.hpp b/Runtime/World/CScriptGunTurret.hpp index 779005a86..47935993a 100644 --- a/Runtime/World/CScriptGunTurret.hpp +++ b/Runtime/World/CScriptGunTurret.hpp @@ -170,19 +170,14 @@ private: zeus::CVector3f x544_originalFrontVec; zeus::CVector3f x550_originalRightVec; s32 x55c_additiveChargeAnim = -1; - union { - struct { - bool x560_24_dead : 1; - bool x560_25_frozen : 1; - bool x560_26_firedWithSetBurst : 1; - bool x560_27_burstSet : 1; - bool x560_28_hasBeenActivated : 1; - bool x560_29_scriptedStart : 1; - bool x560_30_needsStopClankSound : 1; - bool x560_31_frenzyReverse : 1; - }; - u32 _dummy = 0; - }; + bool x560_24_dead : 1; + bool x560_25_frozen : 1; + bool x560_26_firedWithSetBurst : 1; + bool x560_27_burstSet : 1; + bool x560_28_hasBeenActivated : 1; + bool x560_29_scriptedStart : 1; + bool x560_30_needsStopClankSound : 1; + bool x560_31_frenzyReverse : 1; private: void SetupCollisionManager(CStateManager&); diff --git a/Runtime/World/CScriptMazeNode.cpp b/Runtime/World/CScriptMazeNode.cpp index 2ed75e9b7..198a1f7fe 100644 --- a/Runtime/World/CScriptMazeNode.cpp +++ b/Runtime/World/CScriptMazeNode.cpp @@ -20,9 +20,10 @@ CScriptMazeNode::CScriptMazeNode(TUniqueId uid, std::string_view name, const CEn , xf0_(w2) , x100_(vec1) , x110_(vec2) -, x120_(vec3) { - x13c_24_ = true; -} +, x120_(vec3) +, x13c_24_(true) +, x13c_25_(false) +, x13c_26_(false) {} void CScriptMazeNode::Accept(IVisitor& visitor) { visitor.Visit(this); } diff --git a/Runtime/World/CScriptMazeNode.hpp b/Runtime/World/CScriptMazeNode.hpp index f9e147d5a..18072f7d0 100644 --- a/Runtime/World/CScriptMazeNode.hpp +++ b/Runtime/World/CScriptMazeNode.hpp @@ -24,14 +24,9 @@ class CScriptMazeNode : public CActor { s32 x130_ = 0; s32 x134_ = 0; s32 x138_ = 0; - union { - struct { - bool x13c_24_ : 1; - bool x13c_25_ : 1; - bool x13c_26_ : 1; - }; - u8 dummy = 0; - }; + bool x13c_24_ : 1; + bool x13c_25_ : 1; + bool x13c_26_ : 1; public: CScriptMazeNode(TUniqueId, std::string_view, const CEntityInfo&, const zeus::CTransform&, bool, s32, s32, s32, diff --git a/Runtime/World/CScriptMemoryRelay.hpp b/Runtime/World/CScriptMemoryRelay.hpp index 594b6da71..2f0b31c64 100644 --- a/Runtime/World/CScriptMemoryRelay.hpp +++ b/Runtime/World/CScriptMemoryRelay.hpp @@ -7,14 +7,9 @@ namespace urde { class CScriptMemoryRelay : public CEntity { - union { - struct { - bool x34_24_defaultActive; - bool x34_25_skipSendActive; - bool x34_26_ignoreMessages; - }; - u8 dummy = 0; - }; + bool x34_24_defaultActive; + bool x34_25_skipSendActive; + bool x34_26_ignoreMessages; public: CScriptMemoryRelay(TUniqueId, std::string_view name, const CEntityInfo&, bool, bool, bool); diff --git a/Runtime/World/CScriptPlayerActor.cpp b/Runtime/World/CScriptPlayerActor.cpp index 781d72767..d99824f1e 100644 --- a/Runtime/World/CScriptPlayerActor.cpp +++ b/Runtime/World/CScriptPlayerActor.cpp @@ -25,10 +25,16 @@ CScriptPlayerActor::CScriptPlayerActor(TUniqueId uid, std::string_view name, con 0, 1.f, false, false, false, false) , x2e8_suitRes(animRes) , x304_beam(beam) -, x350_flags(flags) { - x354_24_setBoundingBox = setBoundingBox; - x354_29_loading = true; - x354_30_enableLoading = true; +, x350_flags(flags) +, x354_24_setBoundingBox(setBoundingBox) +, x354_25_deferOnlineModelData(false) +, x354_26_deferOfflineModelData(false) +, x354_27_beamModelLoading(false) +, x354_28_suitModelLoading(false) +, x354_29_loading(true) +, x354_30_enableLoading(true) +, x354_31_deferOnlineLoad(false) +, x355_24_areaTrackingLoad(false) { CMaterialList exclude = GetMaterialFilter().GetExcludeList(); CMaterialList include = GetMaterialFilter().GetIncludeList(); include.Add(EMaterialTypes::Player); diff --git a/Runtime/World/CScriptPlayerActor.hpp b/Runtime/World/CScriptPlayerActor.hpp index 041f1a05a..bdbd13890 100644 --- a/Runtime/World/CScriptPlayerActor.hpp +++ b/Runtime/World/CScriptPlayerActor.hpp @@ -25,20 +25,15 @@ class CScriptPlayerActor : public CScriptActor { float x34c_phazonOffsetAngle = 0.f; u32 x350_flags; /* 0x1: suit transition, 0x2: previous suit, 0x4: force reset * 0x8: track in area data, 0x10: keep in state manager */ - union { - struct { - bool x354_24_setBoundingBox : 1; - bool x354_25_deferOnlineModelData : 1; - bool x354_26_deferOfflineModelData : 1; - bool x354_27_beamModelLoading : 1; - bool x354_28_suitModelLoading : 1; - bool x354_29_loading : 1; - bool x354_30_enableLoading : 1; - bool x354_31_deferOnlineLoad : 1; - bool x355_24_areaTrackingLoad : 1; - }; - u32 _dummy = 0; - }; + bool x354_24_setBoundingBox : 1; + bool x354_25_deferOnlineModelData : 1; + bool x354_26_deferOfflineModelData : 1; + bool x354_27_beamModelLoading : 1; + bool x354_28_suitModelLoading : 1; + bool x354_29_loading : 1; + bool x354_30_enableLoading : 1; + bool x354_31_deferOnlineLoad : 1; + bool x355_24_areaTrackingLoad : 1; TUniqueId x356_nextPlayerActor = kInvalidUniqueId; u32 GetSuitCharIdx(const CStateManager& mgr, CPlayerState::EPlayerSuit suit) const; diff --git a/Runtime/World/CScriptShadowProjector.cpp b/Runtime/World/CScriptShadowProjector.cpp index 63831af1c..652d47e76 100644 --- a/Runtime/World/CScriptShadowProjector.cpp +++ b/Runtime/World/CScriptShadowProjector.cpp @@ -10,7 +10,7 @@ namespace urde { CScriptShadowProjector::CScriptShadowProjector(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf, bool active, const zeus::CVector3f& offset, - bool b2, float scale, float f2, float opacity, float opacityQ, + bool persistent, float scale, float f2, float opacity, float opacityQ, s32 textureSize) : CActor(uid, active, name, info, xf, CModelData::CModelDataNull(), CMaterialList(), CActorParameters::None(), kInvalidUniqueId) @@ -19,9 +19,9 @@ CScriptShadowProjector::CScriptShadowProjector(TUniqueId uid, std::string_view n , xf8_zOffsetAdjust(f2) , xfc_opacity(opacity) , x100_opacityRecip(opacity < 0.00001 ? 1.f : opacityQ / opacity) -, x10c_textureSize(textureSize) { - x110_24_persistent = b2; -} +, x10c_textureSize(textureSize) +, x110_24_persistent(persistent) +, x110_25_shadowInvalidated(false) {} void CScriptShadowProjector::Accept(IVisitor& visitor) { visitor.Visit(this); } diff --git a/Runtime/World/CScriptShadowProjector.hpp b/Runtime/World/CScriptShadowProjector.hpp index 54a521def..2480ca17e 100644 --- a/Runtime/World/CScriptShadowProjector.hpp +++ b/Runtime/World/CScriptShadowProjector.hpp @@ -20,14 +20,8 @@ class CScriptShadowProjector : public CActor { TUniqueId x104_target; std::unique_ptr x108_projectedShadow; u32 x10c_textureSize; - - union { - struct { - bool x110_24_persistent : 1; - bool x110_25_shadowInvalidated : 1; - }; - u8 x110_dummy = 0; - }; + bool x110_24_persistent : 1; + bool x110_25_shadowInvalidated : 1; public: CScriptShadowProjector(TUniqueId, std::string_view, const CEntityInfo&, const zeus::CTransform&, bool, diff --git a/Runtime/World/CScriptSound.cpp b/Runtime/World/CScriptSound.cpp index 8fcc6504f..39247989a 100644 --- a/Runtime/World/CScriptSound.cpp +++ b/Runtime/World/CScriptSound.cpp @@ -27,14 +27,17 @@ CScriptSound::CScriptSound(TUniqueId uid, std::string_view name, const CEntityIn , x112_prio(s16(prio)) , x114_pan(pan / 64.f - 1.f) , x116_(w6) -, x118_pitch(pitch / 8192.f) { - x11c_25_looped = looped; - x11c_26_nonEmitter = nonEmitter; - x11c_27_autoStart = autoStart; - x11c_28_occlusionTest = occlusionTest; - x11c_29_acoustics = acoustics; - x11c_30_worldSfx = worldSfx; - x11d_24_allowDuplicates = allowDuplicates; +, x118_pitch(pitch / 8192.f) +, x11c_24_playRequested(false) +, x11c_25_looped(looped) +, x11c_26_nonEmitter(nonEmitter) +, x11c_27_autoStart(autoStart) +, x11c_28_occlusionTest(occlusionTest) +, x11c_29_acoustics(acoustics) +, x11c_30_worldSfx(worldSfx) +, x11c_31_selfFree(false) +, x11d_24_allowDuplicates(allowDuplicates) +, x11d_25_processedThisFrame(false) { if (x11c_30_worldSfx && (!x11c_26_nonEmitter || !x11c_25_looped)) x11c_30_worldSfx = false; } diff --git a/Runtime/World/CScriptSound.hpp b/Runtime/World/CScriptSound.hpp index 63e33e989..70addc700 100644 --- a/Runtime/World/CScriptSound.hpp +++ b/Runtime/World/CScriptSound.hpp @@ -28,21 +28,16 @@ class CScriptSound : public CActor { float x114_pan; bool x116_; float x118_pitch; - union { - struct { - bool x11c_24_playRequested : 1; - bool x11c_25_looped : 1; - bool x11c_26_nonEmitter : 1; - bool x11c_27_autoStart : 1; - bool x11c_28_occlusionTest : 1; - bool x11c_29_acoustics : 1; - bool x11c_30_worldSfx : 1; - bool x11c_31_selfFree : 1; - bool x11d_24_allowDuplicates : 1; - bool x11d_25_processedThisFrame : 1; - }; - u32 x11c_dummy = 0; - }; + bool x11c_24_playRequested : 1; + bool x11c_25_looped : 1; + bool x11c_26_nonEmitter : 1; + bool x11c_27_autoStart : 1; + bool x11c_28_occlusionTest : 1; + bool x11c_29_acoustics : 1; + bool x11c_30_worldSfx : 1; + bool x11c_31_selfFree : 1; + bool x11d_24_allowDuplicates : 1; + bool x11d_25_processedThisFrame : 1; static float GetOccludedVolumeAmount(const zeus::CVector3f& pos, const CStateManager& mgr); diff --git a/Runtime/World/CScriptSpawnPoint.hpp b/Runtime/World/CScriptSpawnPoint.hpp index ab867ec6c..20a488de5 100644 --- a/Runtime/World/CScriptSpawnPoint.hpp +++ b/Runtime/World/CScriptSpawnPoint.hpp @@ -14,13 +14,8 @@ namespace urde { class CScriptSpawnPoint : public CEntity { zeus::CTransform x34_xf; rstl::reserved_vector x64_itemCounts; - union { - struct { - bool x10c_24_firstSpawn : 1; - bool x10c_25_morphed : 1; - }; - u8 _dummy = 0; - }; + bool x10c_24_firstSpawn : 1; + bool x10c_25_morphed : 1; public: CScriptSpawnPoint(TUniqueId, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf, diff --git a/Runtime/World/CScriptSpecialFunction.cpp b/Runtime/World/CScriptSpecialFunction.cpp index 460612f5a..dacc04370 100644 --- a/Runtime/World/CScriptSpecialFunction.cpp +++ b/Runtime/World/CScriptSpecialFunction.cpp @@ -45,8 +45,18 @@ CScriptSpecialFunction::CScriptSpecialFunction(TUniqueId uid, std::string_view n , x184_(0.f) , x1bc_areaSaveId(aId1) , x1c0_layerIdx(aId2) -, x1c4_item(itemType) { - x1e4_26_sfx2Played = true; +, x1c4_item(itemType) +, x1e4_24_(false) +, x1e4_25_spinnerCanMove(false) +, x1e4_26_sfx2Played(true) +, x1e4_27_sfx3Played(false) +, x1e4_28_frustumEntered(false) +, x1e4_29_frustumExited(false) +, x1e4_30_(false) +, x1e4_31_inAreaDamage(false) +, x1e5_24_doSave(false) +, x1e5_25_playerInArea(false) +, x1e5_26_displayBillboard(false) { if (xe8_function == ESpecialFunction::HUDTarget) x1c8_touchBounds = {-1.f, 1.f}; } diff --git a/Runtime/World/CScriptSpecialFunction.hpp b/Runtime/World/CScriptSpecialFunction.hpp index 0d5dc7935..f001d8abe 100644 --- a/Runtime/World/CScriptSpecialFunction.hpp +++ b/Runtime/World/CScriptSpecialFunction.hpp @@ -99,22 +99,17 @@ private: s32 x1c0_layerIdx; CPlayerState::EItemType x1c4_item; std::optional x1c8_touchBounds; - union { - struct { - bool x1e4_24_ : 1; - bool x1e4_25_spinnerCanMove : 1; - bool x1e4_26_sfx2Played : 1; - bool x1e4_27_sfx3Played : 1; - bool x1e4_28_frustumEntered : 1; - bool x1e4_29_frustumExited : 1; - bool x1e4_30_ : 1; - bool x1e4_31_inAreaDamage : 1; - bool x1e5_24_doSave : 1; - bool x1e5_25_playerInArea : 1; - bool x1e5_26_displayBillboard : 1; - }; - u32 x1e4_dummy = 0; - }; + bool x1e4_24_ : 1; + bool x1e4_25_spinnerCanMove : 1; + bool x1e4_26_sfx2Played : 1; + bool x1e4_27_sfx3Played : 1; + bool x1e4_28_frustumEntered : 1; + bool x1e4_29_frustumExited : 1; + bool x1e4_30_ : 1; + bool x1e4_31_inAreaDamage : 1; + bool x1e5_24_doSave : 1; + bool x1e5_25_playerInArea : 1; + bool x1e5_26_displayBillboard : 1; TLockedToken x1e8_; // Used to be optional public: CScriptSpecialFunction(TUniqueId, std::string_view, const CEntityInfo&, const zeus::CTransform&, ESpecialFunction, diff --git a/Runtime/World/CScriptTargetingPoint.cpp b/Runtime/World/CScriptTargetingPoint.cpp index bc7e59b6f..3924b0cc3 100644 --- a/Runtime/World/CScriptTargetingPoint.cpp +++ b/Runtime/World/CScriptTargetingPoint.cpp @@ -9,7 +9,8 @@ namespace urde { CScriptTargetingPoint::CScriptTargetingPoint(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf, bool active) : CActor(uid, active, name, info, xf, CModelData::CModelDataNull(), CMaterialList(EMaterialTypes::NoStepLogic), - CActorParameters::None(), kInvalidUniqueId) {} + CActorParameters::None(), kInvalidUniqueId) +, xe8_e4_(false) {} void CScriptTargetingPoint::Accept(IVisitor& visitor) { visitor.Visit(this); } diff --git a/Runtime/World/CScriptTargetingPoint.hpp b/Runtime/World/CScriptTargetingPoint.hpp index 672f7366e..0cbf6132e 100644 --- a/Runtime/World/CScriptTargetingPoint.hpp +++ b/Runtime/World/CScriptTargetingPoint.hpp @@ -8,12 +8,7 @@ namespace urde { class CScriptTargetingPoint : public CActor { private: - union { - struct { - bool xe8_e4_ : 1; - }; - u8 xe8_dummy = 0; - }; + bool xe8_e4_ : 1; TUniqueId xea_; float xec_time = 0.f; diff --git a/Runtime/World/CScriptTrigger.cpp b/Runtime/World/CScriptTrigger.cpp index 666c990ec..5c0dd3f12 100644 --- a/Runtime/World/CScriptTrigger.cpp +++ b/Runtime/World/CScriptTrigger.cpp @@ -20,13 +20,13 @@ CScriptTrigger::CScriptTrigger(TUniqueId uid, std::string_view name, const CEnti , x11c_forceField(forceField) , x128_forceMagnitude(forceField.magnitude()) , x12c_flags(triggerFlags) -, x130_bounds(bounds) { - x148_24_detectCamera = false; - x148_25_camSubmerged = false; - x148_26_deactivateOnEntered = deactivateOnEntered; - x148_27_deactivateOnExited = deactivateOnExited; - x148_28_playerTriggerProc = false; - x148_29_didPhazonDamage = false; +, x130_bounds(bounds) +, x148_24_detectCamera(false) +, x148_25_camSubmerged(false) +, x148_26_deactivateOnEntered(deactivateOnEntered) +, x148_27_deactivateOnExited(deactivateOnExited) +, x148_28_playerTriggerProc(false) +, x148_29_didPhazonDamage(false) { SetCallTouch(false); } diff --git a/Runtime/World/CScriptTrigger.hpp b/Runtime/World/CScriptTrigger.hpp index 038ab41f0..f399d6b28 100644 --- a/Runtime/World/CScriptTrigger.hpp +++ b/Runtime/World/CScriptTrigger.hpp @@ -54,18 +54,12 @@ protected: float x128_forceMagnitude; ETriggerFlags x12c_flags; zeus::CAABox x130_bounds; - - union { - struct { - bool x148_24_detectCamera : 1; - bool x148_25_camSubmerged : 1; - bool x148_26_deactivateOnEntered : 1; - bool x148_27_deactivateOnExited : 1; - bool x148_28_playerTriggerProc : 1; - bool x148_29_didPhazonDamage : 1; - }; - u8 dummy = 0; - }; + bool x148_24_detectCamera : 1; + bool x148_25_camSubmerged : 1; + bool x148_26_deactivateOnEntered : 1; + bool x148_27_deactivateOnExited : 1; + bool x148_28_playerTriggerProc : 1; + bool x148_29_didPhazonDamage : 1; public: CScriptTrigger(TUniqueId, std::string_view name, const CEntityInfo& info, const zeus::CVector3f& pos, diff --git a/Runtime/World/CScriptWater.cpp b/Runtime/World/CScriptWater.cpp index 92e1ba2d0..af24d5d80 100644 --- a/Runtime/World/CScriptWater.cpp +++ b/Runtime/World/CScriptWater.cpp @@ -61,14 +61,18 @@ CScriptWater::CScriptWater( , x2b4_alphaInRecip((alphaInTime != 0.f) ? 1.f / alphaInTime : 0.f) , x2b8_alphaOutRecip((alphaOutTime != 0.f) ? 1.f / alphaOutTime : 0.f) , x2bc_alpha(alpha) -, x2c0_tileSize(tileSize) { +, x2c0_tileSize(tileSize) +, x2e8_24_b4(b4) +, x2e8_25_morphIn(false) +, x2e8_26_morphing(false) +, x2e8_27_allowRender(allowRender) +, x2e8_28_recomputeClipping(true) +, x2e8_29_alphaIn(false) +, x2e8_30_alphaOut(false) { zeus::CAABox triggerAABB = GetTriggerBoundsWR(); x2c4_gridDimX = u32((x2c0_tileSize + triggerAABB.max.x() - triggerAABB.min.x() - 0.01f) / x2c0_tileSize); x2c8_gridDimY = u32((x2c0_tileSize + triggerAABB.max.y() - triggerAABB.min.y() - 0.01f) / x2c0_tileSize); x2cc_gridCellCount = (x2c4_gridDimX + 1) * (x2c8_gridDimY + 1); - x2e8_24_b4 = b4; - x2e8_27_allowRender = allowRender; - x2e8_28_recomputeClipping = true; uint32_t maxPatchSize; if (CGraphics::g_BooFactory->isTessellationSupported(maxPatchSize)) diff --git a/Runtime/World/CScriptWater.hpp b/Runtime/World/CScriptWater.hpp index 3751aef0a..0bbe7785e 100644 --- a/Runtime/World/CScriptWater.hpp +++ b/Runtime/World/CScriptWater.hpp @@ -66,18 +66,14 @@ class CScriptWater : public CScriptTrigger { std::unique_ptr x2dc_vertIntersects; std::unique_ptr x2e0_patchIntersects; // 0: all clear, 1: all intersect, 2: partial intersect int x2e4_computedGridCellCount = 0; - union { - struct { - bool x2e8_24_b4 : 1; - bool x2e8_25_morphIn : 1; - bool x2e8_26_morphing : 1; - bool x2e8_27_allowRender : 1; - bool x2e8_28_recomputeClipping : 1; - bool x2e8_29_alphaIn : 1; - bool x2e8_30_alphaOut : 1; - }; - u32 _dummy = 0; - }; + bool x2e8_24_b4 : 1; + bool x2e8_25_morphIn : 1; + bool x2e8_26_morphing : 1; + bool x2e8_27_allowRender : 1; + bool x2e8_28_recomputeClipping : 1; + bool x2e8_29_alphaIn : 1; + bool x2e8_30_alphaOut : 1; + void SetupGrid(bool recomputeClipping); void SetupGridClipping(CStateManager& mgr, int computeVerts); void UpdateSplashInhabitants(CStateManager& mgr); diff --git a/Runtime/World/CScriptWorldTeleporter.hpp b/Runtime/World/CScriptWorldTeleporter.hpp index f76a21763..dc66d9f63 100644 --- a/Runtime/World/CScriptWorldTeleporter.hpp +++ b/Runtime/World/CScriptWorldTeleporter.hpp @@ -16,15 +16,9 @@ class CScriptWorldTeleporter : public CEntity { CAssetId x34_worldId; CAssetId x38_areaId; ETeleporterType x3c_type = ETeleporterType::NoTransition; - union { - struct { - bool x40_24_upElevator : 1; - bool x40_25_inTransition : 1; - bool x40_27_fadeWhite : 1; - }; - u8 _dummy = 0; - }; - + bool x40_24_upElevator : 1; + bool x40_25_inTransition : 1; + bool x40_27_fadeWhite : 1; float x44_charFadeIn = 0.1f; float x48_charsPerSecond = 8.0f; float x4c_showDelay = 0.0f; diff --git a/Runtime/World/CStateMachine.hpp b/Runtime/World/CStateMachine.hpp index 0ddecca84..5de15655a 100644 --- a/Runtime/World/CStateMachine.hpp +++ b/Runtime/World/CStateMachine.hpp @@ -89,15 +89,10 @@ class CStateMachineState { float xc_random = 0.f; float x10_delay = 0.f; float x14_; - union { - struct { - bool x18_24_codeTrigger : 1; - }; - u32 dummy = 0; - }; + bool x18_24_codeTrigger : 1; public: - CStateMachineState() = default; + CStateMachineState() : x18_24_codeTrigger(false) {} CAiState* GetActorState() const { return x4_state; } diff --git a/Runtime/World/CWallCrawlerSwarm.cpp b/Runtime/World/CWallCrawlerSwarm.cpp index 57f9658bb..5faec5c3f 100644 --- a/Runtime/World/CWallCrawlerSwarm.cpp +++ b/Runtime/World/CWallCrawlerSwarm.cpp @@ -69,13 +69,13 @@ CWallCrawlerSwarm::CWallCrawlerSwarm(TUniqueId uid, bool active, std::string_vie , x548_numBoids(numBoids) , x54c_maxCreatedBoids(maxCreatedBoids) , x554_maxLaunches(maxLaunches) -, x558_flavor(flavor) { +, x558_flavor(flavor) +, x560_24_enableLighting(true) +, x560_25_useSoftwareLight(true) +, x560_26_modelAssetDirty(false) { x168_partitionedBoidLists.resize(125); x55c_launchSfx = CSfxManager::TranslateSFXID(launchSfx != -1 ? u16(launchSfx) : u16(0xffff)); x55e_scatterSfx = CSfxManager::TranslateSFXID(scatterSfx != -1 ? u16(scatterSfx) : u16(0xffff)); - x560_24_enableLighting = true; - x560_25_useSoftwareLight = true; - x560_26_modelAssetDirty = false; CAnimRes attractAnimRes(animRes); attractAnimRes.SetCanLoop(true); attractAnimRes.SetDefaultAnim(attractAnim != -1 ? attractAnim : 0); diff --git a/Runtime/World/CWallCrawlerSwarm.hpp b/Runtime/World/CWallCrawlerSwarm.hpp index a7c934f2a..8bc77ee5e 100644 --- a/Runtime/World/CWallCrawlerSwarm.hpp +++ b/Runtime/World/CWallCrawlerSwarm.hpp @@ -42,23 +42,23 @@ public: int x7c_framesNotOnSurface : 8; int x7c_idx : 10; int x7c_remainingLaunchNotOnSurfaceFrames : 8; - - union { - struct { - bool x80_24_active : 1; - bool x80_25_inFrustum : 1; - bool x80_26_launched : 1; - bool x80_27_scarabExplodeTimerEnabled : 1; - bool x80_28_nearPlayer : 1; - }; - u32 x80_ = 0; - }; + bool x80_24_active : 1; + bool x80_25_inFrustum : 1; + bool x80_26_launched : 1; + bool x80_27_scarabExplodeTimerEnabled : 1; + bool x80_28_nearPlayer : 1; public: - CBoid(const zeus::CTransform& xf, int idx) : x0_xf(xf) { - x7c_framesNotOnSurface = 0; - x7c_idx = idx; - } + CBoid(const zeus::CTransform& xf, int idx) + : x0_xf(xf) + , x7c_framesNotOnSurface(0) + , x7c_idx(idx) + , x80_24_active(false) + , x80_25_inFrustum(false) + , x80_26_launched(false) + , x80_27_scarabExplodeTimerEnabled(false) + , x80_28_nearPlayer(false) {} + zeus::CTransform& Transform() { return x0_xf; } zeus::CVector3f& Translation() { return x0_xf.origin; } const zeus::CTransform& GetTransform() const { return x0_xf; } diff --git a/Runtime/World/CWorld.cpp b/Runtime/World/CWorld.cpp index f2499f3ca..3566ac5d7 100644 --- a/Runtime/World/CWorld.cpp +++ b/Runtime/World/CWorld.cpp @@ -184,8 +184,13 @@ std::string CDummyWorld::IGetDefaultAudioTrack() const { return {}; } int CDummyWorld::IGetAreaCount() const { return x18_areas.size(); } CWorld::CWorld(IObjectStore& objStore, IFactory& resFactory, CAssetId mlvlId) -: x8_mlvlId(mlvlId), x60_objectStore(objStore), x64_resFactory(resFactory) { - x70_24_currentAreaNeedsAllocation = true; +: x8_mlvlId(mlvlId) +, x60_objectStore(objStore) +, x64_resFactory(resFactory) +, x70_24_currentAreaNeedsAllocation(true) +, x70_25_loadPaused(false) +, x70_26_skyboxActive(false) +, x70_27_skyboxVisible(false) { SObjectTag tag{FOURCC('MLVL'), mlvlId}; x44_bufSz = resFactory.ResourceSize(tag); x40_loadBuf.reset(new u8[x44_bufSz]); diff --git a/Runtime/World/CWorld.hpp b/Runtime/World/CWorld.hpp index 2b662179d..17e815ff4 100644 --- a/Runtime/World/CWorld.hpp +++ b/Runtime/World/CWorld.hpp @@ -130,16 +130,10 @@ private: IFactory& x64_resFactory; TAreaId x68_curAreaId = kInvalidAreaId; u32 x6c_loadedAudioGrpCount = 0; - - union { - struct { - bool x70_24_currentAreaNeedsAllocation : 1; - bool x70_25_loadPaused : 1; - bool x70_26_skyboxActive : 1; - bool x70_27_skyboxVisible : 1; - }; - u32 dummy = 0; - }; + bool x70_24_currentAreaNeedsAllocation : 1; + bool x70_25_loadPaused : 1; + bool x70_26_skyboxActive : 1; + bool x70_27_skyboxVisible : 1; std::vector x74_soundGroupData; std::string x84_defAudioTrack; std::optional> x94_skyboxWorld; diff --git a/Runtime/World/CWorldTransManager.hpp b/Runtime/World/CWorldTransManager.hpp index 978d0f447..92f09bed9 100644 --- a/Runtime/World/CWorldTransManager.hpp +++ b/Runtime/World/CWorldTransManager.hpp @@ -69,16 +69,11 @@ private: float x38_textStartTime = 0.f; float x3c_sfxInterval; bool x40_strIdx; - union { - struct { - bool x44_24_transFinished : 1; - bool x44_25_stopSoon : 1; - bool x44_26_goingUp : 1; - bool x44_27_fadeWhite : 1; - bool x44_28_textDirty : 1; - }; - u8 dummy = 0; - }; + bool x44_24_transFinished : 1; + bool x44_25_stopSoon : 1; + bool x44_26_goingUp : 1; + bool x44_27_fadeWhite : 1; + bool x44_28_textDirty : 1; CColoredQuadFilter m_fadeToBlack{EFilterType::Blend}; CTexturedQuadFilter m_dissolve{EFilterType::Blend, CGraphics::g_SpareTexture.get()}; @@ -101,7 +96,12 @@ private: void DrawText(); public: - CWorldTransManager() { x44_24_transFinished = true; } + CWorldTransManager() + : x44_24_transFinished(true) + , x44_25_stopSoon(false) + , x44_26_goingUp(false) + , x44_27_fadeWhite(false) + , x44_28_textDirty(false) {} void Update(float); void Draw(); From 0339c16e201dca3d0183e55fe232dd385af43c7e Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sat, 11 Apr 2020 02:02:28 -0400 Subject: [PATCH 052/224] CScriptCoverPoint: Fix GetAttackDirection --- Runtime/MP1/World/CSpacePirate.cpp | 2 +- Runtime/World/CActor.cpp | 2 +- Runtime/World/CScriptCoverPoint.cpp | 2 ++ Runtime/World/CScriptCoverPoint.hpp | 7 ++++++- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Runtime/MP1/World/CSpacePirate.cpp b/Runtime/MP1/World/CSpacePirate.cpp index f95beba06..5fe62cdf7 100644 --- a/Runtime/MP1/World/CSpacePirate.cpp +++ b/Runtime/MP1/World/CSpacePirate.cpp @@ -2082,7 +2082,7 @@ void CSpacePirate::Cover(CStateManager& mgr, EStateMsg msg, float dt) { case EStateMsg::Activate: if (x450_bodyController->GetCurrentStateId() != pas::EAnimationState::Cover) { if (CScriptCoverPoint* cp = GetCoverPoint(mgr, x640_coverPoint)) { - x79c_coverDir = (cp->GetAttackDirection() & 0x2) ? pas::ECoverDirection::Left : pas::ECoverDirection::Right; + x79c_coverDir = cp->GetAttackDirection(); x32c_animState = EAnimState::Ready; x2e0_destPos = cp->GetTranslation(); TryCommand(mgr, pas::EAnimationState::Cover, &CPatterned::TryCover, int(x79c_coverDir)); diff --git a/Runtime/World/CActor.cpp b/Runtime/World/CActor.cpp index 1d538dfc8..cf6b100e5 100644 --- a/Runtime/World/CActor.cpp +++ b/Runtime/World/CActor.cpp @@ -104,7 +104,7 @@ void CActor::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateMana else RemoveMaterial(EMaterialTypes::Scannable, mgr); - if (HasModelData() && x64_modelData->GetAnimationData()) { + if (HasModelData() && x64_modelData->HasAnimData()) { TAreaId aid = GetAreaId(); x64_modelData->GetAnimationData()->InitializeEffects(mgr, aid, x64_modelData->GetScale()); } diff --git a/Runtime/World/CScriptCoverPoint.cpp b/Runtime/World/CScriptCoverPoint.cpp index f55cc93b1..479a1318f 100644 --- a/Runtime/World/CScriptCoverPoint.cpp +++ b/Runtime/World/CScriptCoverPoint.cpp @@ -14,6 +14,8 @@ CScriptCoverPoint::CScriptCoverPoint(TUniqueId uid, std::string_view name, const , xe8_26_landHere((flags & 0x20) != 0u) , xe8_27_wallHang((flags & 0x10) != 0u) , xe8_28_stay((flags & 0x8) != 0u) +, xe8_29_((flags & 0x4) != 0u) +, xe8_30_attackDirection((flags & 0x2) != 0u) , xf4_coverTime(coverTime) , xf8_24_crouch(crouch) , xf8_25_inUse(false) { diff --git a/Runtime/World/CScriptCoverPoint.hpp b/Runtime/World/CScriptCoverPoint.hpp index 98f938c29..5b55aeb5b 100644 --- a/Runtime/World/CScriptCoverPoint.hpp +++ b/Runtime/World/CScriptCoverPoint.hpp @@ -4,6 +4,7 @@ #include #include "Runtime/GCNTypes.hpp" +#include "Runtime/Character/CharacterCommon.hpp" #include "Runtime/World/CActor.hpp" #include @@ -13,6 +14,8 @@ class CScriptCoverPoint : public CActor { bool xe8_26_landHere : 1; bool xe8_27_wallHang : 1; bool xe8_28_stay : 1; + bool xe8_29_ : 1; + bool xe8_30_attackDirection : 1; float xec_cosHorizontalAngle; float xf0_sinVerticalAngle; float xf4_coverTime; @@ -42,7 +45,9 @@ public: bool Blown(const zeus::CVector3f& pos) const; float GetSinSqVerticalAngle() const; float GetCosHorizontalAngle() const { return xec_cosHorizontalAngle; } - u32 GetAttackDirection() const { return xe8_flags; } + pas::ECoverDirection GetAttackDirection() const { + return xe8_30_attackDirection ? pas::ECoverDirection::Left : pas::ECoverDirection::Right; + } void Reserve(TUniqueId id) { xfa_occupant = id; } }; } // namespace urde From 22ac7d809973cb40ee6c546b4bfe491b8d388aa0 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sat, 11 Apr 2020 02:09:58 -0400 Subject: [PATCH 053/224] CScriptCoverPoint: Fix GetAttackDirection return value --- Runtime/World/CScriptCoverPoint.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/World/CScriptCoverPoint.hpp b/Runtime/World/CScriptCoverPoint.hpp index 5b55aeb5b..2a62a12ca 100644 --- a/Runtime/World/CScriptCoverPoint.hpp +++ b/Runtime/World/CScriptCoverPoint.hpp @@ -46,7 +46,7 @@ public: float GetSinSqVerticalAngle() const; float GetCosHorizontalAngle() const { return xec_cosHorizontalAngle; } pas::ECoverDirection GetAttackDirection() const { - return xe8_30_attackDirection ? pas::ECoverDirection::Left : pas::ECoverDirection::Right; + return xe8_30_attackDirection ? pas::ECoverDirection::Right : pas::ECoverDirection::Left; } void Reserve(TUniqueId id) { xfa_occupant = id; } }; From e23c3d3705529bc80819592d9196ffefdab755f5 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sat, 11 Apr 2020 02:25:41 -0400 Subject: [PATCH 054/224] Runtime: Wrap fmt::print calls in #ifndef NDEBUG --- Runtime/CStopwatch.hpp | 4 ++++ Runtime/World/CScriptGunTurret.cpp | 2 ++ Runtime/World/CStateMachine.cpp | 4 ++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Runtime/CStopwatch.hpp b/Runtime/CStopwatch.hpp index 8d1d5fa30..7f376d21d 100644 --- a/Runtime/CStopwatch.hpp +++ b/Runtime/CStopwatch.hpp @@ -12,13 +12,17 @@ public: double report(const char* name) const { double t = std::chrono::duration_cast( std::chrono::steady_clock::now() - m_start).count() / 1000000.0; +#ifndef NDEBUG fmt::print(fmt("{} {}\n"), name, t); +#endif return t; } double reportReset(const char* name) { std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now(); double t = std::chrono::duration_cast(now - m_start).count() / 1000000.0; +#ifndef NDEBUG fmt::print(fmt("{} {}\n"), name, t); +#endif m_start = now; return t; } diff --git a/Runtime/World/CScriptGunTurret.cpp b/Runtime/World/CScriptGunTurret.cpp index dde720de5..596a52c27 100644 --- a/Runtime/World/CScriptGunTurret.cpp +++ b/Runtime/World/CScriptGunTurret.cpp @@ -394,7 +394,9 @@ void CScriptGunTurret::SetTurretState(ETurretState state, CStateManager& mgr) { } if (state != ETurretState::Invalid && x520_state != state) { +#ifndef NDEBUG fmt::print(fmt("{} {} {} - {}\n"), GetUniqueId(), GetEditorId(), GetName(), StateNames[size_t(state)]); +#endif } x520_state = state; diff --git a/Runtime/World/CStateMachine.cpp b/Runtime/World/CStateMachine.cpp index f8979a42d..14ddf2e4e 100644 --- a/Runtime/World/CStateMachine.cpp +++ b/Runtime/World/CStateMachine.cpp @@ -78,10 +78,10 @@ void CStateMachineState::Update(CStateManager& mgr, CAi& ai, float delta) { if (andPassed && state) { x4_state->CallFunc(mgr, ai, EStateMsg::Deactivate, 0.f); x4_state = state; -//#ifndef NDEBUG +#ifndef NDEBUG fmt::print(fmt("{} {} {} - {} {}\n"), ai.GetUniqueId(), ai.GetEditorId(), ai.GetName(), state->xc_name, int(state - x0_machine->GetStateVector().data())); -//#endif +#endif x8_time = 0.f; x18_24_codeTrigger = false; xc_random = mgr.GetActiveRandom()->Float(); From 072ac0df163bff529930eafb7a1ab0a9be42bfb7 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sat, 11 Apr 2020 02:35:55 -0400 Subject: [PATCH 055/224] Runtime: Wrap printf calls in #ifndef NDEBUG --- Runtime/MP1/World/CFlaahgra.cpp | 2 ++ Runtime/World/CVisorFlare.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Runtime/MP1/World/CFlaahgra.cpp b/Runtime/MP1/World/CFlaahgra.cpp index a32767471..9d0ece782 100644 --- a/Runtime/MP1/World/CFlaahgra.cpp +++ b/Runtime/MP1/World/CFlaahgra.cpp @@ -282,7 +282,9 @@ void CFlaahgra::DoUserAnimEvent(CStateManager& mgr, const CInt32POINode& node, E return; } case EUserEventType::BeginAction: { +#ifndef NDEBUG printf("BeginAction\n"); +#endif x8e4_26_ = true; x7c4_ = GetEndActionTime(); break; diff --git a/Runtime/World/CVisorFlare.cpp b/Runtime/World/CVisorFlare.cpp index 1be3c4a63..6e1bfbf85 100644 --- a/Runtime/World/CVisorFlare.cpp +++ b/Runtime/World/CVisorFlare.cpp @@ -69,7 +69,9 @@ void CVisorFlare::Update(float dt, const zeus::CVector3f& pos, const CActor* act mgr.SetThermalColdScale2(mgr.GetThermalColdScale2() + x24_); } +#ifndef NDEBUG printf("%08X %f %f\n", act->GetEditorId().id, x24_, x28_); +#endif } } From 416fec236773ea5b3ff2a9e3641efcd2e409e0e7 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sat, 11 Apr 2020 03:45:45 -0400 Subject: [PATCH 056/224] Update README.md --- README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 9758b90d1..c6fba0d55 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ **Official Discord Channel:** https://discord.gg/AMBVFuf ### Download -Precompiled builds of the command-line extraction utility (`hecl`) with embedded dataspec libraries are available at https://github.com/AxioDL/urde/releases. This will give you intermediate dumps of original formats as *blender* and *yaml* representations. +Precompiled builds of the command-line extraction utility (`hecl`) with embedded dataspec libraries are available at https://releases.axiodl.com. This will give you intermediate dumps of original formats as *blender* and *yaml* representations. Everything else is much too experimental to make portable/stable release builds (for now) @@ -19,9 +19,10 @@ Everything else is much too experimental to make portable/stable release builds ### Usage -* Extract ISO: `hecl extract [path].iso` -* Repackage game for URDE: `cd [extracted dir]; hecl package` -* Run URDE: `urde [path to hecl dir]/out` +* Extract ISO: `hecl extract [path].iso -o mp1` + * `mp1` can be substituted with the directory name of your choice +* Repackage game for URDE: `cd mp1; hecl package` +* Run URDE: `urde mp1/out` #### URDE options (non-exhaustive) @@ -38,7 +39,7 @@ Everything else is much too experimental to make portable/stable release builds * LLVM development package *(headers and libs)* * [Specialized Windows Package](https://axiodl.com/files/LLVM-9.0.1-win64.exe) * [Specialized macOS Package](https://axiodl.com/files/LLVM-9.0.1-Darwin.tar.xz) -* **[Windows]** [Visual Studio 2017/2019 Community](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx) +* **[Windows]** [Visual Studio 2019 Community](https://www.visualstudio.com/en-us/products/visual-studio-community-vs.aspx) * Select `C++ Development` and verify the following packages are included: * `Windows 10 SDK` * `CMake Tools` @@ -50,7 +51,7 @@ Everything else is much too experimental to make portable/stable release builds ### Prep Directions ```sh -git clone --recurse-submodules https://github.com/AxioDL/urde.git +git clone --recursive https://github.com/AxioDL/urde.git mkdir urde-build cd urde-build ``` @@ -66,7 +67,7 @@ ninja #### CMake options - Build release optimized (better runtime performance): `-DCMAKE_BUILD_TYPE=Release` -- Use clang+lld (faster linking): `-DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++` +- Use clang+lld (faster linking): `-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++` - Optimize for current CPU (resulting binaries are not portable): `-DURDE_VECTOR_ISA=native` #### CLion From 30bcdb2b2f78ce373dc25157adc47cd83c26613a Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Sat, 11 Apr 2020 00:53:04 -0700 Subject: [PATCH 057/224] Add TextureCache support to MP2 and 3 --- DataSpec/SpecMP1.cpp | 1 + DataSpec/SpecMP2.cpp | 68 +++++++++++++++++++++++++++++++++++++ DataSpec/SpecMP3.cpp | 81 ++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 144 insertions(+), 6 deletions(-) diff --git a/DataSpec/SpecMP1.cpp b/DataSpec/SpecMP1.cpp index 77416895e..57150d232 100644 --- a/DataSpec/SpecMP1.cpp +++ b/DataSpec/SpecMP1.cpp @@ -66,6 +66,7 @@ struct TextureCache { static void Generate(PAKRouter& pakRouter, hecl::Database::Project& project, const hecl::ProjectPath& pakPath) { hecl::ProjectPath texturePath(pakPath, _SYS_STR("texture_cache.yaml")); hecl::ProjectPath catalogPath(pakPath, _SYS_STR("!catalog.yaml")); + texturePath.makeDirChain(false); if (const auto fp = hecl::FopenUnique(catalogPath.getAbsolutePath().data(), _SYS_STR("a"))) { fmt::print(fp.get(), fmt("TextureCache: {}\n"), texturePath.getRelativePathUTF8()); diff --git a/DataSpec/SpecMP2.cpp b/DataSpec/SpecMP2.cpp index d013ca9ab..1c4614f51 100644 --- a/DataSpec/SpecMP2.cpp +++ b/DataSpec/SpecMP2.cpp @@ -11,6 +11,7 @@ #include "DNAMP1/CSNG.hpp" #include "DNACommon/MAPU.hpp" #include "DNACommon/PATH.hpp" +#include "DNACommon/TXTR.hpp" #include "hecl/ClientProcess.hpp" #include "hecl/Blender/Connection.hpp" @@ -27,6 +28,69 @@ static logvisor::Module Log("urde::SpecMP2"); extern hecl::Database::DataSpecEntry SpecEntMP2; extern hecl::Database::DataSpecEntry SpecEntMP2ORIG; +struct TextureCache { + static void Generate(PAKRouter& pakRouter, hecl::Database::Project& project, const hecl::ProjectPath& pakPath) { + hecl::ProjectPath texturePath(pakPath, _SYS_STR("texture_cache.yaml")); + hecl::ProjectPath catalogPath(pakPath, _SYS_STR("!catalog.yaml")); + texturePath.makeDirChain(false); + + if (const auto fp = hecl::FopenUnique(catalogPath.getAbsolutePath().data(), _SYS_STR("a"))) { + fmt::print(fp.get(), fmt("TextureCache: {}\n"), texturePath.getRelativePathUTF8()); + } + + Log.report(logvisor::Level::Info, fmt("Gathering Texture metadata (this can take up to 10 seconds)...")); + std::unordered_map metaMap; + + pakRouter.enumerateResources([&](const DNAMP2::PAK::Entry* ent) { + if (ent->type == FOURCC('TXTR') && metaMap.find(ent->id) == metaMap.end()) { + PAKEntryReadStream rs = pakRouter.beginReadStreamForId(ent->id); + metaMap[ent->id] = TXTR::GetMetaData(rs); + } + return true; + }); + + athena::io::YAMLDocWriter yamlW("MP2TextureCache"); + for (const auto& pair : metaMap) { + hecl::ProjectPath path = pakRouter.getWorking(pair.first); + auto rec = yamlW.enterSubRecord(path.getRelativePathUTF8()); + pair.second.write(yamlW); + } + + athena::io::FileWriter fileW(texturePath.getAbsolutePath()); + yamlW.finish(&fileW); + Log.report(logvisor::Level::Info, fmt("Done...")); + } + + static void Cook(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outPath) { + hecl::Database::Project& project = inPath.getProject(); + athena::io::YAMLDocReader r; + athena::io::FileReader fr(inPath.getAbsolutePath()); + if (!fr.isOpen() || !r.parse(&fr)) + return; + + std::vector> metaPairs; + metaPairs.reserve(r.getRootNode()->m_mapChildren.size()); + for (const auto& node : r.getRootNode()->m_mapChildren) { + hecl::ProjectPath projectPath(project, node.first); + auto rec = r.enterSubRecord(node.first.c_str()); + TXTR::Meta meta; + meta.read(r); + metaPairs.emplace_back(projectPath.parsedHash32(), meta); + } + + std::sort(metaPairs.begin(), metaPairs.end(), [](const auto& a, const auto& b) -> bool { + return a.first < b.first; + }); + + athena::io::FileWriter w(outPath.getAbsolutePath()); + w.writeUint32Big(metaPairs.size()); + for (const auto& pair : metaPairs) { + pair.first.write(w); + pair.second.write(w); + } + } +}; + struct SpecMP2 : SpecBase { bool checkStandaloneID(const char* id) const override { if (!memcmp(id, "G2M", 3)) @@ -249,6 +313,10 @@ struct SpecMP2 : SpecBase { process.waitUntilComplete(); + /* Generate Texture Cache containing meta data for every texture file */ + hecl::ProjectPath noAramPath(m_project.getProjectWorkingPath(), _SYS_STR("MP2/URDE")); + TextureCache::Generate(m_pakRouter, m_project, noAramPath); + return true; } diff --git a/DataSpec/SpecMP3.cpp b/DataSpec/SpecMP3.cpp index 632d3c68d..4dfd8aaa7 100644 --- a/DataSpec/SpecMP3.cpp +++ b/DataSpec/SpecMP3.cpp @@ -1,13 +1,14 @@ #include #include -#include "SpecBase.hpp" -#include "DNAMP3/DNAMP3.hpp" +#include "DataSpec/SpecBase.hpp" +#include "DataSpec/DNAMP3/DNAMP3.hpp" -#include "DNAMP3/MLVL.hpp" -#include "DNAMP3/STRG.hpp" -#include "DNAMP3/MAPA.hpp" -#include "DNAMP2/STRG.hpp" +#include "DataSpec/DNAMP3/MLVL.hpp" +#include "DataSpec/DNAMP3/STRG.hpp" +#include "DataSpec/DNAMP3/MAPA.hpp" +#include "DataSpec/DNAMP2/STRG.hpp" +#include "DataSpec/DNACommon/TXTR.hpp" #include "hecl/ClientProcess.hpp" #include "hecl/Blender/Connection.hpp" @@ -24,6 +25,69 @@ static logvisor::Module Log("urde::SpecMP3"); extern hecl::Database::DataSpecEntry SpecEntMP3; extern hecl::Database::DataSpecEntry SpecEntMP3ORIG; +struct TextureCache { + static void Generate(PAKRouter& pakRouter, hecl::Database::Project& project, const hecl::ProjectPath& pakPath) { + hecl::ProjectPath texturePath(pakPath, _SYS_STR("texture_cache.yaml")); + hecl::ProjectPath catalogPath(pakPath, _SYS_STR("!catalog.yaml")); + texturePath.makeDirChain(false); + + if (const auto fp = hecl::FopenUnique(catalogPath.getAbsolutePath().data(), _SYS_STR("a"))) { + fmt::print(fp.get(), fmt("TextureCache: {}\n"), texturePath.getRelativePathUTF8()); + } + + Log.report(logvisor::Level::Info, fmt("Gathering Texture metadata (this can take up to 10 seconds)...")); + std::unordered_map metaMap; + + pakRouter.enumerateResources([&](const DNAMP3::PAK::Entry* ent) { + if (ent->type == FOURCC('TXTR') && metaMap.find(ent->id) == metaMap.end()) { + PAKEntryReadStream rs = pakRouter.beginReadStreamForId(ent->id); + metaMap[ent->id] = TXTR::GetMetaData(rs); + } + return true; + }); + + athena::io::YAMLDocWriter yamlW("MP3TextureCache"); + for (const auto& pair : metaMap) { + hecl::ProjectPath path = pakRouter.getWorking(pair.first); + auto rec = yamlW.enterSubRecord(path.getRelativePathUTF8()); + pair.second.write(yamlW); + } + + athena::io::FileWriter fileW(texturePath.getAbsolutePath()); + yamlW.finish(&fileW); + Log.report(logvisor::Level::Info, fmt("Done...")); + } + + static void Cook(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outPath) { + hecl::Database::Project& project = inPath.getProject(); + athena::io::YAMLDocReader r; + athena::io::FileReader fr(inPath.getAbsolutePath()); + if (!fr.isOpen() || !r.parse(&fr)) + return; + + std::vector> metaPairs; + metaPairs.reserve(r.getRootNode()->m_mapChildren.size()); + for (const auto& node : r.getRootNode()->m_mapChildren) { + hecl::ProjectPath projectPath(project, node.first); + auto rec = r.enterSubRecord(node.first.c_str()); + TXTR::Meta meta; + meta.read(r); + metaPairs.emplace_back(projectPath.parsedHash32(), meta); + } + + std::sort(metaPairs.begin(), metaPairs.end(), [](const auto& a, const auto& b) -> bool { + return a.first < b.first; + }); + + athena::io::FileWriter w(outPath.getAbsolutePath()); + w.writeUint32Big(metaPairs.size()); + for (const auto& pair : metaPairs) { + pair.first.write(w); + pair.second.write(w); + } + } +}; + struct SpecMP3 : SpecBase { bool checkStandaloneID(const char* id) const override { if (!memcmp(id, "RM3", 3)) @@ -409,6 +473,11 @@ struct SpecMP3 : SpecBase { } process.waitUntilComplete(); + + /* Extract part of .dol for RandomStatic entropy */ + hecl::ProjectPath noAramPath(m_project.getProjectWorkingPath(), _SYS_STR("MP3/URDE")); + /* Generate Texture Cache containing meta data for every texture file */ + TextureCache::Generate(m_pakRouter, m_project, noAramPath); } return true; } From 937551486805100c641249fdc3dbcb1af47b357d Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Sat, 11 Apr 2020 07:29:06 -0700 Subject: [PATCH 058/224] Fix CRipper --- Runtime/MP1/World/CRipper.cpp | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/Runtime/MP1/World/CRipper.cpp b/Runtime/MP1/World/CRipper.cpp index bf9e8ee8d..45344ca70 100644 --- a/Runtime/MP1/World/CRipper.cpp +++ b/Runtime/MP1/World/CRipper.cpp @@ -21,8 +21,8 @@ CRipper::CRipper(TUniqueId uid, std::string_view name, EFlavorType type, const C {EMaterialTypes::Solid}, {EMaterialTypes::NoStaticCollision, EMaterialTypes::NoPlatformCollision, EMaterialTypes::Platform})); x460_knockBackController.SetAutoResetImpulse(false); - x460_knockBackController.SetAnimationStateRange(EKnockBackAnimationState::KnockBack, - EKnockBackAnimationState::Hurled); + x460_knockBackController.SetAnimationStateRange(EKnockBackAnimationState::Flinch, + EKnockBackAnimationState::KnockBack); } void CRipper::Think(float dt, CStateManager& mgr) { @@ -33,25 +33,23 @@ void CRipper::Think(float dt, CStateManager& mgr) { ProcessGrapplePoint(mgr); const CPlayer& pl = mgr.GetPlayer(); CGrappleArm::EArmState armState = pl.GetPlayerGun()->GetGrappleArm().GetAnimState(); - if (x598_grapplePoint == kInvalidUniqueId || pl.GetOrbitTargetId() != x598_grapplePoint || - pl.GetGrappleState() == CPlayer::EGrappleState::None) { - CPatterned::Think(dt, mgr); - if (x59c_24_muted) { - SetMuted(false); - x59c_24_muted = false; - } - } else { - if (armState == CGrappleArm::EArmState::FireGrapple) { - CPatterned::Think(dt, mgr); - } else if (armState == CGrappleArm::EArmState::IntoGrappleIdle || armState == CGrappleArm::EArmState::Three) { + if (x598_grapplePoint != kInvalidUniqueId && pl.GetOrbitTargetId() == x598_grapplePoint && pl.GetGrappleState() != CPlayer::EGrappleState::None) { + if (pl.GetGrappleState() != CPlayer::EGrappleState::Firing && (armState > CGrappleArm::EArmState::Three)) { Stop(); if (!x59c_24_muted) { SetMuted(true); x59c_24_muted = true; } + } else { + CPatterned::Think(dt, mgr); + } + } else { + CPatterned::Think(dt, mgr); + if (x59c_24_muted) { + SetMuted(false); + x59c_24_muted = false; } } - CPatterned::Think(dt, mgr); } void CRipper::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) { @@ -73,7 +71,7 @@ void CRipper::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateMan x450_bodyController->Activate(mgr); AddMaterial(EMaterialTypes::Immovable, mgr); RemoveMaterial(EMaterialTypes::Solid, mgr); - if (x3fc_flavor != EFlavorType::One) { + if (x3fc_flavor == EFlavorType::One) { AddGrapplePoint(mgr); RemoveMaterial(EMaterialTypes::Orbit, mgr); } @@ -96,7 +94,7 @@ void CRipper::Patrol(CStateManager& mgr, EStateMsg msg, float arg) { } void CRipper::ProcessGrapplePoint(CStateManager& mgr) { - if (x3fc_flavor == EFlavorType::One || x598_grapplePoint == kInvalidUniqueId) + if (x3fc_flavor != EFlavorType::One || x598_grapplePoint == kInvalidUniqueId) return; if (TCastToPtr gp = mgr.ObjectById(x598_grapplePoint)) { @@ -109,7 +107,7 @@ void CRipper::AddGrapplePoint(CStateManager& mgr) { return; x598_grapplePoint = mgr.AllocateUniqueId(); - mgr.AddObject(new CScriptGrapplePoint(x59a_platformId, "RipperGrapplePoint"sv, + mgr.AddObject(new CScriptGrapplePoint(x598_grapplePoint, "RipperGrapplePoint"sv, CEntityInfo(GetAreaIdAlways(), NullConnectionList), GetTransform(), true, x568_grappleParams)); } From 886d95173698549692913ffd489e77b54a3da4be Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 14:32:43 -0400 Subject: [PATCH 059/224] CCameraShakeData: Make use of boolean literals where applicable in LoadCameraShakeData Same behavior, minus the implicit conversions to bool. --- Runtime/Camera/CCameraShakeData.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Runtime/Camera/CCameraShakeData.cpp b/Runtime/Camera/CCameraShakeData.cpp index 6de888378..490b3c9de 100644 --- a/Runtime/Camera/CCameraShakeData.cpp +++ b/Runtime/Camera/CCameraShakeData.cpp @@ -100,24 +100,24 @@ float CCameraShakeData::GetMaxFMComponent() const { } CCameraShakeData CCameraShakeData::LoadCameraShakeData(CInputStream& in) { - float xMag = in.readFloatBig(); + const float xMag = in.readFloatBig(); in.readFloatBig(); - float yMag = in.readFloatBig(); + const float yMag = in.readFloatBig(); in.readFloatBig(); - float zMag = in.readFloatBig(); + const float zMag = in.readFloatBig(); in.readFloatBig(); - float duration = in.readFloatBig(); + const float duration = in.readFloatBig(); - SCameraShakePoint xAM(0, 0.f, 0.f, duration, 2.f * xMag); - SCameraShakePoint yAM(0, 0.f, 0.f, duration, 2.f * yMag); - SCameraShakePoint zAM(0, 0.f, 0.f, duration, 2.f * zMag); - SCameraShakePoint xFM(0, 0.f, 0.f, 0.5f * duration, 3.f); - SCameraShakePoint yFM(0, 0.f, 0.f, 0.5f * duration, 0.f); - SCameraShakePoint zFM(0, 0.f, 0.f, 0.5f * duration, 3.f); + const SCameraShakePoint xAM(false, 0.f, 0.f, duration, 2.f * xMag); + const SCameraShakePoint yAM(false, 0.f, 0.f, duration, 2.f * yMag); + const SCameraShakePoint zAM(false, 0.f, 0.f, duration, 2.f * zMag); + const SCameraShakePoint xFM(false, 0.f, 0.f, 0.5f * duration, 3.f); + const SCameraShakePoint yFM(false, 0.f, 0.f, 0.5f * duration, 0.f); + const SCameraShakePoint zFM(false, 0.f, 0.f, 0.5f * duration, 3.f); - CCameraShakerComponent shakerX(1, xAM, xFM); - CCameraShakerComponent shakerY; - CCameraShakerComponent shakerZ(1, zAM, zFM); + const CCameraShakerComponent shakerX(true, xAM, xFM); + const CCameraShakerComponent shakerY; + const CCameraShakerComponent shakerZ(true, zAM, zFM); return {duration, 100.f, 0, zeus::skZero3f, shakerX, shakerY, shakerZ}; } From 515103aa921b835e99151d11a8dd493de11e186e Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 15:04:53 -0400 Subject: [PATCH 060/224] CWeaponDescription: Make operator bool() explicit Eliminates potential error-prone implicit conversions. --- Runtime/Particle/CWeaponDescription.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Particle/CWeaponDescription.hpp b/Runtime/Particle/CWeaponDescription.hpp index b6a1c2852..29e5d1692 100644 --- a/Runtime/Particle/CWeaponDescription.hpp +++ b/Runtime/Particle/CWeaponDescription.hpp @@ -18,7 +18,7 @@ struct SCollisionResponseData { bool m_found = false; SCollisionResponseData() = default; SCollisionResponseData(CToken&& tok, bool found) : m_res(std::move(tok)), m_found(found) {} - operator bool() const { return m_found; } + explicit operator bool() const { return m_found; } }; class CWeaponDescription { From 01bb0f38403dd672e4c8fe8acd0ea7f184736194 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 15:28:58 -0400 Subject: [PATCH 061/224] CWorld: Separate enum definition from declaration Allows more flexibility if anything ever gets moved around and is arguably nicer to read. --- Runtime/World/CWorld.hpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Runtime/World/CWorld.hpp b/Runtime/World/CWorld.hpp index 17e815ff4..87c6f31b8 100644 --- a/Runtime/World/CWorld.hpp +++ b/Runtime/World/CWorld.hpp @@ -38,13 +38,15 @@ public: }; class CDummyWorld : public IWorld { - bool x4_loadMap; enum class Phase { Loading, LoadingMap, LoadingMapAreas, Done, - } x8_phase = Phase::Loading; + }; + + bool x4_loadMap; + Phase x8_phase = Phase::Loading; CAssetId xc_mlvlId; CAssetId x10_strgId; CAssetId x14_savwId; @@ -112,7 +114,9 @@ private: LoadingSkyBox, LoadingSoundGroups, Done, - } x4_phase = Phase::Loading; + }; + + Phase x4_phase = Phase::Loading; CAssetId x8_mlvlId; CAssetId xc_strgId; CAssetId x10_savwId; From 7e8ca5e8084b9a8c00df42d79fb1ca188d3099c6 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sat, 11 Apr 2020 16:07:05 -0400 Subject: [PATCH 062/224] Add -DLLVM_ROOT_DIR to appveyor --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index d24b929ee..0f89793ba 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -68,7 +68,7 @@ before_build: build_script: - mkdir build - cd build - - cmake -DCMAKE_BUILD_TYPE=%CONFIGURATION% -GNinja .. + - cmake -DCMAKE_BUILD_TYPE=%CONFIGURATION% -DLLVM_ROOT_DIR=C:\projects\deps\llvm -GNinja .. - ninja urde #notifications: From 75d8988ee88bf1f5654dbaa1064c2edade19d185 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 15:35:44 -0400 Subject: [PATCH 063/224] CRandom16: Make constructor explicit Same behavior, minus the implicit conversions upon construction. --- Runtime/CRandom16.hpp | 4 ++-- Runtime/Graphics/CRainSplashGenerator.hpp | 2 +- Runtime/Weapon/CNewFlameThrower.hpp | 2 +- Runtime/Weapon/CWaveBuster.hpp | 2 +- Runtime/World/CMorphBall.hpp | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Runtime/CRandom16.hpp b/Runtime/CRandom16.hpp index 3d82cd886..4b3354286 100644 --- a/Runtime/CRandom16.hpp +++ b/Runtime/CRandom16.hpp @@ -9,7 +9,7 @@ class CRandom16 { static CRandom16* g_randomNumber; public: - CRandom16(s32 p = 99) : m_seed(p) {} + explicit CRandom16(s32 seed = 99) : m_seed(seed) {} s32 Next() { m_seed = (m_seed * 0x41c64e6d) + 0x00003039; @@ -18,7 +18,7 @@ public: s32 GetSeed() const { return m_seed; } - void SetSeed(s32 p) { m_seed = p; } + void SetSeed(s32 seed) { m_seed = seed; } float Float() { return Next() * 0.000015259022f; } diff --git a/Runtime/Graphics/CRainSplashGenerator.hpp b/Runtime/Graphics/CRainSplashGenerator.hpp index 7a63534ab..5f2f9e514 100644 --- a/Runtime/Graphics/CRainSplashGenerator.hpp +++ b/Runtime/Graphics/CRainSplashGenerator.hpp @@ -44,7 +44,7 @@ class CRainSplashGenerator { void SetPoint(const zeus::CVector3f& pos); }; std::vector x0_rainSplashes; - CRandom16 x10_random = {99}; + CRandom16 x10_random{99}; zeus::CVector3f x14_scale; float x20_generateTimer = 0.0f; float x24_generateInterval = 0.0f; diff --git a/Runtime/Weapon/CNewFlameThrower.hpp b/Runtime/Weapon/CNewFlameThrower.hpp index 29f8af7a9..953a86615 100644 --- a/Runtime/Weapon/CNewFlameThrower.hpp +++ b/Runtime/Weapon/CNewFlameThrower.hpp @@ -10,7 +10,7 @@ namespace urde { class CNewFlameThrower : public CGameProjectile { - CRandom16 x2e8_rand = {99}; + CRandom16 x2e8_rand{99}; float x2ec_ = 0.f; float x2f0_ = 0.f; bool x300_ = false; diff --git a/Runtime/Weapon/CWaveBuster.hpp b/Runtime/Weapon/CWaveBuster.hpp index d15269cca..c46c471d0 100644 --- a/Runtime/Weapon/CWaveBuster.hpp +++ b/Runtime/Weapon/CWaveBuster.hpp @@ -26,7 +26,7 @@ class CWaveBuster : public CGameProjectile { std::unique_ptr x388_busterSwoosh2Gen; std::unique_ptr x38c_busterSparksGen; std::unique_ptr x390_busterLightGen; - CRandom16 x394_rand = {99}; + CRandom16 x394_rand{99}; float x39c_ = 0.5f; float x3a0_ = 0.5f; float x3a4_ = 0.f; diff --git a/Runtime/World/CMorphBall.hpp b/Runtime/World/CMorphBall.hpp index bc52fcc17..4fceccab6 100644 --- a/Runtime/World/CMorphBall.hpp +++ b/Runtime/World/CMorphBall.hpp @@ -111,7 +111,7 @@ private: std::unique_ptr x19e0_effect_morphBallIceBreakGen; rstl::reserved_vector, bool>, 32> x19e4_spiderElectricGens; std::list x1b6c_activeSpiderElectricList; - CRandom16 x1b80_rand = {99}; + CRandom16 x1b80_rand{99}; rstl::reserved_vector, 8> x1b84_wakeEffects; rstl::reserved_vector, 8> x1bc8_wakeEffectGens; s32 x1c0c_wakeEffectIdx = -1; From 4bdcc5efdbf3c0eef922507cfe4e103296cb81a3 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 15:17:12 -0400 Subject: [PATCH 064/224] CModel: Make CModelFlags constexpr constructible. Allows initializers to be elided where applicable. While we're at it, we can make the conditional flag tests more explicit and eliminate implicit truncation in the case of the second flag test. --- Runtime/Graphics/CModel.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Runtime/Graphics/CModel.hpp b/Runtime/Graphics/CModel.hpp index 9460599f3..b6ef2e16f 100644 --- a/Runtime/Graphics/CModel.hpp +++ b/Runtime/Graphics/CModel.hpp @@ -37,12 +37,12 @@ struct CModelFlags { zeus::CColor addColor = zeus::skClear; zeus::CAABox mbShadowBox; - CModelFlags() = default; - CModelFlags(u8 blendMode, u8 shadIdx, u16 flags, const zeus::CColor& col) + constexpr CModelFlags() = default; + constexpr CModelFlags(u8 blendMode, u8 shadIdx, u16 flags, const zeus::CColor& col) : x0_blendMode(blendMode), x1_matSetIdx(shadIdx), x2_flags(flags), x4_color(col) { /* Blend mode will override this if the surface's original material is opaque */ - m_noZWrite = !(x2_flags & 0x2); - m_depthGreater = (x2_flags & 0x8); + m_noZWrite = (x2_flags & 0x2) == 0; + m_depthGreater = (x2_flags & 0x8) != 0; } /* Flags From 75c07677ed4d68d382e709d1a13ab2defa5bfa42 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 16:53:59 -0400 Subject: [PATCH 065/224] CModel: Mark CModelFlag instances as constexpr where applicable Allows more runtime initializes to potentially be elided. --- Runtime/MP1/World/CBeetle.cpp | 2 +- Runtime/Particle/CDecal.cpp | 6 +++--- Runtime/Weapon/CGunMotion.cpp | 2 +- Runtime/Weapon/CGunWeapon.cpp | 8 ++++---- Runtime/Weapon/CPlayerGun.cpp | 6 +++--- Runtime/Weapon/CProjectileWeapon.cpp | 2 +- Runtime/World/CFishCloud.cpp | 2 +- Runtime/World/CMorphBall.cpp | 4 ++-- Runtime/World/CPlayer.cpp | 2 +- Runtime/World/CSnakeWeedSwarm.cpp | 2 +- Runtime/World/CWallCrawlerSwarm.cpp | 4 ++-- 11 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Runtime/MP1/World/CBeetle.cpp b/Runtime/MP1/World/CBeetle.cpp index 2f94a2614..ed6b65e05 100644 --- a/Runtime/MP1/World/CBeetle.cpp +++ b/Runtime/MP1/World/CBeetle.cpp @@ -162,7 +162,7 @@ void CBeetle::Render(CStateManager& mgr) { x5ac_tailModel->Render(mgr, tailXf, x90_actorLights.get(), flags); } } else if (x5ac_tailModel) { - CModelFlags flags(0, 0, 3, zeus::skWhite); + constexpr CModelFlags flags(0, 0, 3, zeus::skWhite); x5ac_tailModel->Render(mgr, tailXf, x90_actorLights.get(), flags); } } diff --git a/Runtime/Particle/CDecal.cpp b/Runtime/Particle/CDecal.cpp index a5c3d41b8..77f357a31 100644 --- a/Runtime/Particle/CDecal.cpp +++ b/Runtime/Particle/CDecal.cpp @@ -219,14 +219,14 @@ void CDecal::RenderMdl() { CGraphics::SetModelMatrix(worldXf); if (desc.x5c_24_DMAB) { - CModelFlags flags(7, 0, 1, color); + const CModelFlags flags(7, 0, 1, color); desc.x38_DMDL.m_token->Draw(flags); } else { if (color.a() == 1.f) { - CModelFlags flags(0, 0, 3, zeus::skWhite); + constexpr CModelFlags flags(0, 0, 3, zeus::skWhite); desc.x38_DMDL.m_token->Draw(flags); } else { - CModelFlags flags(5, 0, 1, color); + const CModelFlags flags(5, 0, 1, color); desc.x38_DMDL.m_token->Draw(flags); } } diff --git a/Runtime/Weapon/CGunMotion.cpp b/Runtime/Weapon/CGunMotion.cpp index 966886eef..85db42741 100644 --- a/Runtime/Weapon/CGunMotion.cpp +++ b/Runtime/Weapon/CGunMotion.cpp @@ -83,7 +83,7 @@ void CGunMotion::Update(float dt, CStateManager& mgr) { } void CGunMotion::Draw(const CStateManager& mgr, const zeus::CTransform& xf) const { - CModelFlags flags(0, 0, 3, zeus::skWhite); + constexpr CModelFlags flags(0, 0, 3, zeus::skWhite); x0_modelData.Render(mgr, xf, nullptr, flags); } diff --git a/Runtime/Weapon/CGunWeapon.cpp b/Runtime/Weapon/CGunWeapon.cpp index 803d3afb6..5a24b9028 100644 --- a/Runtime/Weapon/CGunWeapon.cpp +++ b/Runtime/Weapon/CGunWeapon.cpp @@ -271,17 +271,17 @@ void CGunWeapon::Draw(bool drawSuitArm, const CStateManager& mgr, const zeus::CT if (mgr.GetThermalDrawFlag() == EThermalDrawFlag::Hot && x200_beamId != CPlayerState::EBeamId::Ice) { /* Hot Draw */ - zeus::CColor mulColor(flags.x4_color.a(), flags.x4_color.a()); - zeus::CColor addColor(0.25f, 0.25f); + const zeus::CColor mulColor(flags.x4_color.a(), flags.x4_color.a()); + constexpr zeus::CColor addColor(0.25f, 0.25f); if (x218_29_drawHologram) { DrawHologram(mgr, xf, flags); } else { - CModelFlags useFlags(0, 0, 3, zeus::skWhite); + constexpr CModelFlags useFlags(0, 0, 3, zeus::skWhite); x10_solidModelData->RenderThermal(xf, mulColor, addColor, useFlags); } if (drawSuitArm && xb0_suitArmModelData) { - CModelFlags useFlags(0, 0, 3, zeus::skWhite); + constexpr CModelFlags useFlags(0, 0, 3, zeus::skWhite); xb0_suitArmModelData->RenderThermal(xf, mulColor, addColor, useFlags); } } else { diff --git a/Runtime/Weapon/CPlayerGun.cpp b/Runtime/Weapon/CPlayerGun.cpp index b0159965d..8fd887f80 100644 --- a/Runtime/Weapon/CPlayerGun.cpp +++ b/Runtime/Weapon/CPlayerGun.cpp @@ -109,15 +109,15 @@ constexpr std::array chargeShakeTbl{ constexpr CMaterialFilter sAimFilter = CMaterialFilter::MakeIncludeExclude({EMaterialTypes::Solid}, {EMaterialTypes::ProjectilePassthrough}); -const std::array kThermalFlags{{ +constexpr std::array kThermalFlags{{ {0, 0, 3, zeus::skWhite}, {5, 0, 3, zeus::CColor(0.f, 0.5f)}, {0, 0, 3, zeus::skWhite}, {0, 0, 3, zeus::skWhite}, }}; -const CModelFlags kHandThermalFlag = {7, 0, 3, zeus::skWhite}; -const CModelFlags kHandHoloFlag = {1, 0, 3, zeus::CColor(0.75f, 0.5f, 0.f, 1.f)}; +constexpr CModelFlags kHandThermalFlag{7, 0, 3, zeus::skWhite}; +constexpr CModelFlags kHandHoloFlag{1, 0, 3, zeus::CColor(0.75f, 0.5f, 0.f, 1.f)}; } // Anonymous namespace float CPlayerGun::CMotionState::gGunExtendDistance = 0.125f; diff --git a/Runtime/Weapon/CProjectileWeapon.cpp b/Runtime/Weapon/CProjectileWeapon.cpp index f73090744..55dddc6f3 100644 --- a/Runtime/Weapon/CProjectileWeapon.cpp +++ b/Runtime/Weapon/CProjectileWeapon.cpp @@ -235,7 +235,7 @@ void CProjectileWeapon::Render() { std::vector useLights; useLights.push_back(CLight::BuildLocalAmbient({}, xc8_ambientLightColor)); (**x108_model).GetInstance().ActivateLights(useLights); - CModelFlags flags(0, 0, 3, zeus::skWhite); + constexpr CModelFlags flags(0, 0, 3, zeus::skWhite); (*x108_model)->Draw(flags); } diff --git a/Runtime/World/CFishCloud.cpp b/Runtime/World/CFishCloud.cpp index 80d16c219..750467784 100644 --- a/Runtime/World/CFishCloud.cpp +++ b/Runtime/World/CFishCloud.cpp @@ -520,7 +520,7 @@ void CFishCloud::RenderBoid(int idx, const CBoid& boid, u32& drawMask, model.GetModelInst()->SetAmbientColor(zeus::skWhite); CGraphics::SetModelMatrix(zeus::lookAt(boid.x0_pos, boid.x0_pos + boid.xc_vel)); if (thermalHot) { - CModelFlags thermFlags(0, 0, 3, zeus::skWhite); + constexpr CModelFlags thermFlags(0, 0, 3, zeus::skWhite); mData.RenderThermal(zeus::skWhite, zeus::CColor(0.f, 0.25f), thermFlags); } else { mData.GetAnimationData()->Render(model, flags, std::nullopt, nullptr); diff --git a/Runtime/World/CMorphBall.cpp b/Runtime/World/CMorphBall.cpp index d00d29429..c9e9e24f8 100644 --- a/Runtime/World/CMorphBall.cpp +++ b/Runtime/World/CMorphBall.cpp @@ -1674,8 +1674,8 @@ void CMorphBall::Render(const CStateManager& mgr, const CActorLights* lights) co RenderMorphBallTransitionFlash(mgr); if (x0_player.GetFrozenState()) { - CModelFlags fflags(0, 0, 3, zeus::skWhite); - x70_frozenBallModel->Render(mgr, zeus::CTransform::Translate(ballToWorld.origin), lights, fflags); + constexpr CModelFlags modelFlags(0, 0, 3, zeus::skWhite); + x70_frozenBallModel->Render(mgr, zeus::CTransform::Translate(ballToWorld.origin), lights, modelFlags); } RenderIceBreakEffect(mgr); diff --git a/Runtime/World/CPlayer.cpp b/Runtime/World/CPlayer.cpp index ea281b5e8..f1b87f6f6 100644 --- a/Runtime/World/CPlayer.cpp +++ b/Runtime/World/CPlayer.cpp @@ -1572,7 +1572,7 @@ void CPlayer::RenderReflectedPlayer(CStateManager& mgr) { } CPhysicsActor::Render(mgr); if (HasTransitionBeamModel()) { - const CModelFlags flags(0, 0, 3, zeus::skWhite); + constexpr CModelFlags flags(0, 0, 3, zeus::skWhite); x7f0_ballTransitionBeamModel->Render(mgr, x7f4_gunWorldXf, nullptr, flags); } break; diff --git a/Runtime/World/CSnakeWeedSwarm.cpp b/Runtime/World/CSnakeWeedSwarm.cpp index 76609926a..85bf1fe2d 100644 --- a/Runtime/World/CSnakeWeedSwarm.cpp +++ b/Runtime/World/CSnakeWeedSwarm.cpp @@ -416,7 +416,7 @@ void CSnakeWeedSwarm::RenderBoid(u32 idx, const CBoid& boid, u32& posesToBuild) auto& modelData = *x1b0_modelData[modelIdx]; auto& model = modelData.PickAnimatedModel(x1c4_which); auto& animData = *modelData.GetAnimationData(); - const CModelFlags useFlags(0, 0, 3, zeus::skWhite); + constexpr CModelFlags useFlags(0, 0, 3, zeus::skWhite); if (posesToBuild & 1 << modelIdx) { posesToBuild &= ~(1 << modelIdx); animData.BuildPose(); diff --git a/Runtime/World/CWallCrawlerSwarm.cpp b/Runtime/World/CWallCrawlerSwarm.cpp index 5faec5c3f..b71d0aa43 100644 --- a/Runtime/World/CWallCrawlerSwarm.cpp +++ b/Runtime/World/CWallCrawlerSwarm.cpp @@ -1062,7 +1062,7 @@ void CWallCrawlerSwarm::RenderBoid(const CBoid* boid, u32& drawMask, bool therma model.GetModelInst()->SetAmbientColor(boid->x40_ambientLighting); CGraphics::SetModelMatrix(boid->GetTransform()); if (boid->x48_timeToDie > 0.f && !thermalHot) { - const CModelFlags useFlags(0, 0, 3, zeus::skWhite); + constexpr CModelFlags useFlags(0, 0, 3, zeus::skWhite); mData.GetAnimationData()->Render(model, useFlags, std::nullopt, nullptr); if (auto iceModel = mData.GetAnimationData()->GetIceModel()) { if (!iceModel->GetModelInst()->TryLockTextures()) { @@ -1075,7 +1075,7 @@ void CWallCrawlerSwarm::RenderBoid(const CBoid* boid, u32& drawMask, bool therma mData.GetAnimationData()->Render(*iceModel, iceFlags, std::nullopt, nullptr); } } else if (thermalHot) { - const CModelFlags thermFlags(5, 0, 3, zeus::skWhite); + constexpr CModelFlags thermFlags(5, 0, 3, zeus::skWhite); mData.RenderThermal(zeus::skWhite, zeus::CColor(0.f, 0.25f), thermFlags); } else { mData.GetAnimationData()->Render(model, flags, std::nullopt, nullptr); From 5b4441ac36c0603b386f4085ef5da84c917a3afe Mon Sep 17 00:00:00 2001 From: Jack Andersen Date: Sat, 11 Apr 2020 12:51:39 -1000 Subject: [PATCH 066/224] Update fmtlib --- DataSpec/AssetNameMap.cpp | 4 +- DataSpec/DNACommon/ANCS.cpp | 20 ++--- DataSpec/DNACommon/ANIM.cpp | 8 +- DataSpec/DNACommon/AROTBuilder.cpp | 4 +- DataSpec/DNACommon/ATBL.cpp | 2 +- DataSpec/DNACommon/BabeDead.cpp | 16 ++-- DataSpec/DNACommon/CMDL.cpp | 72 ++++++++--------- DataSpec/DNACommon/DNACommon.cpp | 14 ++-- DataSpec/DNACommon/DNACommon.hpp | 6 +- DataSpec/DNACommon/DeafBabe.cpp | 12 +-- DataSpec/DNACommon/FONT.cpp | 2 +- DataSpec/DNACommon/FSM2.cpp | 4 +- DataSpec/DNACommon/MAPA.cpp | 26 +++--- DataSpec/DNACommon/MAPU.cpp | 4 +- DataSpec/DNACommon/MLVL.cpp | 8 +- DataSpec/DNACommon/PAK.cpp | 50 ++++++------ DataSpec/DNACommon/PAK.hpp | 4 +- DataSpec/DNACommon/PATH.cpp | 16 ++-- DataSpec/DNACommon/ParticleCommon.hpp | 14 ++-- DataSpec/DNACommon/STRG.cpp | 2 +- DataSpec/DNACommon/TXTR.cpp | 44 +++++----- DataSpec/DNAMP1/ANCS.cpp | 56 ++++++------- DataSpec/DNAMP1/ANIM.cpp | 10 +-- DataSpec/DNAMP1/ANIM.hpp | 2 +- DataSpec/DNAMP1/CINF.cpp | 14 ++-- DataSpec/DNAMP1/CMDLMaterials.cpp | 54 ++++++------- DataSpec/DNAMP1/CMDLMaterials.hpp | 4 +- DataSpec/DNAMP1/CSKR.cpp | 2 +- DataSpec/DNAMP1/CSNG.cpp | 4 +- DataSpec/DNAMP1/DCLN.cpp | 2 +- DataSpec/DNAMP1/DNAMP1.cpp | 30 +++---- DataSpec/DNAMP1/FRME.cpp | 56 ++++++------- DataSpec/DNAMP1/MLVL.cpp | 4 +- DataSpec/DNAMP1/MREA.cpp | 18 ++--- DataSpec/DNAMP1/PAK.cpp | 9 ++- DataSpec/DNAMP1/SCAN.hpp | 4 +- DataSpec/DNAMP1/SCLY.cpp | 8 +- DataSpec/DNAMP1/STRG.cpp | 20 ++--- DataSpec/DNAMP1/ScriptObjects/Babygoth.hpp | 2 +- DataSpec/DNAMP1/ScriptObjects/Magdolite.hpp | 2 +- DataSpec/DNAMP1/ScriptObjects/OmegaPirate.hpp | 2 +- DataSpec/DNAMP1/ScriptObjects/Parameters.hpp | 4 +- DataSpec/DNAMP2/ANIM.cpp | 6 +- DataSpec/DNAMP2/CINF.cpp | 16 ++-- DataSpec/DNAMP2/CSKR.cpp | 2 +- DataSpec/DNAMP2/DNAMP2.cpp | 12 +-- DataSpec/DNAMP2/DeafBabe.cpp | 2 +- DataSpec/DNAMP2/MREA.cpp | 8 +- DataSpec/DNAMP2/PAK.cpp | 2 +- DataSpec/DNAMP2/STRG.cpp | 12 +-- DataSpec/DNAMP2/STRG.hpp | 1 + DataSpec/DNAMP3/ANIM.cpp | 6 +- DataSpec/DNAMP3/CMDLMaterials.cpp | 36 ++++----- DataSpec/DNAMP3/CSKR.cpp | 2 +- DataSpec/DNAMP3/DNAMP3.cpp | 12 +-- DataSpec/DNAMP3/MREA.cpp | 4 +- DataSpec/DNAMP3/PAK.cpp | 9 ++- DataSpec/DNAMP3/STRG.cpp | 12 +-- DataSpec/DNAMP3/STRG.hpp | 1 + DataSpec/SpecBase.cpp | 80 +++++++++---------- DataSpec/SpecMP1.cpp | 16 ++-- DataSpec/SpecMP2.cpp | 6 +- DataSpec/SpecMP3.cpp | 6 +- Editor/ProjectManager.cpp | 8 +- Editor/ProjectResourceFactoryBase.cpp | 52 ++++++------ Editor/Space.cpp | 6 +- Editor/SplashScreen.cpp | 10 +-- Editor/ViewManager.cpp | 22 ++--- Editor/badging/Badging.cpp | 4 +- Editor/icons/icons.cpp | 4 +- Editor/locale | 2 +- Editor/main.cpp | 14 ++-- NESEmulator/CNESEmulator.cpp | 4 +- Runtime/Audio/CAudioSys.cpp | 1 + Runtime/AutoMapper/CAutoMapper.cpp | 10 +-- Runtime/CGameAllocator.cpp | 2 +- Runtime/CInGameTweakManagerBase.hpp | 2 +- Runtime/CMemoryCardSysNix.cpp | 6 +- Runtime/CMemoryCardSysOSX.cpp | 4 +- Runtime/CMemoryCardSysWin.cpp | 4 +- Runtime/CObjectList.cpp | 2 +- Runtime/CPakFile.cpp | 4 +- Runtime/CResFactory.cpp | 4 +- Runtime/CResLoader.cpp | 4 +- Runtime/CStateManager.cpp | 18 ++--- Runtime/CStopwatch.hpp | 4 +- Runtime/Character/CAllFormatsAnimSource.cpp | 2 +- Runtime/Character/CAnimData.cpp | 2 +- Runtime/Character/CModelData.cpp | 6 +- Runtime/Character/CParticleDatabase.cpp | 1 + Runtime/Graphics/CBooRenderer.cpp | 4 +- Runtime/Graphics/CLineRenderer.cpp | 4 +- Runtime/Graphics/CModelBoo.cpp | 6 +- Runtime/Graphics/CSkinnedModel.cpp | 6 +- Runtime/Graphics/CTextureBoo.cpp | 10 +-- Runtime/GuiSys/CAuiEnergyBarT01.cpp | 2 +- Runtime/GuiSys/CAuiImagePane.cpp | 2 +- Runtime/GuiSys/CCompoundTargetReticle.cpp | 2 +- Runtime/GuiSys/CGuiFrame.cpp | 2 +- Runtime/GuiSys/CGuiModel.cpp | 2 +- Runtime/GuiSys/CGuiTextPane.cpp | 2 +- Runtime/GuiSys/CGuiTextSupport.cpp | 2 +- Runtime/GuiSys/CGuiWidget.cpp | 2 +- Runtime/GuiSys/CGuiWidgetIdDB.cpp | 1 + Runtime/GuiSys/CGuiWidgetIdDB.hpp | 2 + Runtime/GuiSys/CHudBallInterface.cpp | 4 +- Runtime/GuiSys/CHudEnergyInterface.cpp | 2 +- Runtime/GuiSys/CHudMissileInterface.cpp | 2 +- Runtime/GuiSys/CHudThreatInterface.cpp | 2 +- Runtime/GuiSys/CHudVisorBeamMenu.cpp | 6 +- Runtime/IOStreams.cpp | 6 +- Runtime/MP1/CFrontEndUI.cpp | 24 +++--- Runtime/MP1/CMemoryCardDriver.cpp | 2 +- Runtime/MP1/CPauseScreen.cpp | 10 +-- Runtime/MP1/CPauseScreenBase.cpp | 16 ++-- Runtime/MP1/CSamusHud.cpp | 4 +- Runtime/MP1/CSlideShow.cpp | 2 +- Runtime/MP1/MP1.cpp | 28 +++---- Runtime/MP1/MP1.hpp | 2 +- Runtime/MP1/World/CSpankWeed.cpp | 2 +- Runtime/MP1/World/CThardus.cpp | 2 +- Runtime/Particle/CDecalDataFactory.cpp | 2 +- Runtime/Particle/CElementGen.cpp | 10 +-- Runtime/Particle/CParticleDataFactory.cpp | 4 +- Runtime/Particle/CParticleElectric.cpp | 2 +- .../Particle/CParticleElectricDataFactory.cpp | 2 +- Runtime/Particle/CParticleSwoosh.cpp | 2 +- .../Particle/CParticleSwooshDataFactory.cpp | 2 +- .../Particle/CProjectileWeaponDataFactory.cpp | 2 +- Runtime/RetroTypes.cpp | 8 +- Runtime/Weapon/CEnergyProjectile.cpp | 2 +- Runtime/World/CActor.cpp | 2 +- Runtime/World/CFishCloud.cpp | 2 +- Runtime/World/CGameArea.cpp | 4 +- Runtime/World/CPathFindArea.cpp | 2 +- Runtime/World/CPlayer.cpp | 2 +- Runtime/World/CScriptGunTurret.cpp | 2 +- Runtime/World/CScriptStreamedMusic.cpp | 2 +- Runtime/World/CStateMachine.cpp | 2 +- Runtime/World/CWallCrawlerSwarm.cpp | 2 +- Runtime/World/CWorld.cpp | 2 +- Runtime/World/ScriptLoader.cpp | 12 +-- Runtime/rstl.hpp | 22 ++--- Shaders/shader_CFluidPlaneShaderGLSL.cpp | 44 +++++----- Shaders/shader_CFluidPlaneShaderHLSL.cpp | 52 ++++++------ Shaders/shader_CFluidPlaneShaderMetal.cpp | 44 +++++----- amuse | 2 +- assetnameparser/main.cpp | 14 ++-- hecl | 2 +- nod | 2 +- specter | 2 +- visigen/MainMac.mm | 2 +- visigen/MainWin.cpp | 4 +- visigen/MainXlib.cpp | 20 ++--- visigen/VISIBuilder.cpp | 16 ++-- visigen/VISIRenderer.cpp | 12 +-- 156 files changed, 786 insertions(+), 777 deletions(-) diff --git a/DataSpec/AssetNameMap.cpp b/DataSpec/AssetNameMap.cpp index ace70701c..a720d15e0 100644 --- a/DataSpec/AssetNameMap.cpp +++ b/DataSpec/AssetNameMap.cpp @@ -32,7 +32,7 @@ void LoadAssetMap(athena::io::MemoryReader& ar) { ar.readBytesToBuf(&magic, 4); if (magic != FOURCC('AIDM')) Log.report(logvisor::Warning, - fmt(_SYS_STR("Unable to load asset map; Assets will not have proper filenames for most files."))); + FMT_STRING(_SYS_STR("Unable to load asset map; Assets will not have proper filenames for most files."))); else { uint32_t assetCount = ar.readUint32Big(); g_AssetNameMap.reserve(assetCount); @@ -50,7 +50,7 @@ void InitAssetNameMap() { if (g_AssetNameMapInit) return; - Log.report(logvisor::Info, fmt("Initializing asset name database...")); + Log.report(logvisor::Info, FMT_STRING("Initializing asset name database...")); /* First load the 32bit map for MP1/2 */ { diff --git a/DataSpec/DNACommon/ANCS.cpp b/DataSpec/DNACommon/ANCS.cpp index cbe208d8d..0ee44741d 100644 --- a/DataSpec/DNACommon/ANCS.cpp +++ b/DataSpec/DNACommon/ANCS.cpp @@ -99,7 +99,7 @@ bool ReadANCSToBlender(hecl::blender::Connection& conn, const ANCSDNA& ancs, con { hecl::blender::PyOutStream os = conn.beginPythonOut(true); - os.format(fmt( + os.format(FMT_STRING( "import bpy\n" "from mathutils import Vector\n" "bpy.context.scene.name = '{}'\n" @@ -116,7 +116,7 @@ bool ReadANCSToBlender(hecl::blender::Connection& conn, const ANCSDNA& ancs, con std::unordered_set cinfsDone; for (const auto& info : chResInfo) { /* Provide data to add-on */ - os.format(fmt( + os.format(FMT_STRING( "actor_subtype = actor_data.subtypes.add()\n" "actor_subtype.name = '{}'\n\n"), info.name); @@ -125,7 +125,7 @@ bool ReadANCSToBlender(hecl::blender::Connection& conn, const ANCSDNA& ancs, con if (cinfsDone.find(info.cinf) == cinfsDone.end()) { if (const typename PAKRouter::EntryType* cinfE = pakRouter.lookupEntry(info.cinf, nullptr, true, false)) { hecl::ProjectPath cinfPath = pakRouter.getWorking(cinfE); - os.linkArmature(cinfPath.getAbsolutePathUTF8(), fmt::format(fmt("CINF_{}"), info.cinf)); + os.linkArmature(cinfPath.getAbsolutePathUTF8(), fmt::format(FMT_STRING("CINF_{}"), info.cinf)); os << "if obj.name not in bpy.context.scene.objects:\n" " bpy.context.scene.collection.objects.link(obj)\n"; } @@ -135,7 +135,7 @@ bool ReadANCSToBlender(hecl::blender::Connection& conn, const ANCSDNA& ancs, con } cinfsDone.insert(info.cinf); } - os.format(fmt("arm_obj = bpy.data.objects['CINF_{}']\n"), info.cinf); + os.format(FMT_STRING("arm_obj = bpy.data.objects['CINF_{}']\n"), info.cinf); os << "actor_subtype.linked_armature = arm_obj.name\n"; /* Link CMDL */ @@ -154,7 +154,7 @@ bool ReadANCSToBlender(hecl::blender::Connection& conn, const ANCSDNA& ancs, con /* Link overlays */ for (const auto& overlay : info.overlays) { os << "overlay = actor_subtype.overlays.add()\n"; - os.format(fmt("overlay.name = '{}'\n"), overlay.first); + os.format(FMT_STRING("overlay.name = '{}'\n"), overlay.first); /* Link CMDL */ if (const typename PAKRouter::EntryType* cmdlE = @@ -175,7 +175,7 @@ bool ReadANCSToBlender(hecl::blender::Connection& conn, const ANCSDNA& ancs, con /* Link attachments */ for (auto it = attRange.first; it != attRange.second; ++it) { os << "attachment = actor_data.attachments.add()\n"; - os.format(fmt("attachment.name = '{}'\n"), it->second.second); + os.format(FMT_STRING("attachment.name = '{}'\n"), it->second.second); auto cinfid = it->second.first.cinf; auto cmdlid = it->second.first.cmdl; @@ -185,7 +185,7 @@ bool ReadANCSToBlender(hecl::blender::Connection& conn, const ANCSDNA& ancs, con if (cinfsDone.find(cinfid) == cinfsDone.end()) { if (const typename PAKRouter::EntryType* cinfE = pakRouter.lookupEntry(cinfid, nullptr, true, false)) { hecl::ProjectPath cinfPath = pakRouter.getWorking(cinfE); - os.linkArmature(cinfPath.getAbsolutePathUTF8(), fmt::format(fmt("CINF_{}"), cinfid)); + os.linkArmature(cinfPath.getAbsolutePathUTF8(), fmt::format(FMT_STRING("CINF_{}"), cinfid)); os << "if obj.name not in bpy.context.scene.objects:\n" " bpy.context.scene.collection.objects.link(obj)\n"; } @@ -195,7 +195,7 @@ bool ReadANCSToBlender(hecl::blender::Connection& conn, const ANCSDNA& ancs, con } cinfsDone.insert(cinfid); } - os.format(fmt("arm_obj = bpy.data.objects['CINF_{}']\n"), cinfid); + os.format(FMT_STRING("arm_obj = bpy.data.objects['CINF_{}']\n"), cinfid); os << "attachment.linked_armature = arm_obj.name\n"; } @@ -230,7 +230,7 @@ bool ReadANCSToBlender(hecl::blender::Connection& conn, const ANCSDNA& ancs, con for (const auto& id : animResInfo) { typename ANCSDNA::ANIMType anim; if (pakRouter.lookupAndReadDNA(id.second.animId, anim, true)) { - os.format(fmt( + os.format(FMT_STRING( "act = bpy.data.actions.new('{}')\n" "act.use_fake_user = True\n" "act.anim_id = '{}'\n"), @@ -238,7 +238,7 @@ bool ReadANCSToBlender(hecl::blender::Connection& conn, const ANCSDNA& ancs, con anim.sendANIMToBlender(os, inverter, id.second.additive); } - os.format(fmt( + os.format(FMT_STRING( "actor_action = actor_data.actions.add()\n" "actor_action.name = '{}'\n"), id.second.name); diff --git a/DataSpec/DNACommon/ANIM.cpp b/DataSpec/DNACommon/ANIM.cpp index 895de4afe..42079d125 100644 --- a/DataSpec/DNACommon/ANIM.cpp +++ b/DataSpec/DNACommon/ANIM.cpp @@ -175,7 +175,7 @@ std::vector> BitstreamReader::read(const atUint8* data, size_ for (size_t f = 0; f < keyFrameCount; ++f) { #if DUMP_KEYS - fmt::print(stderr, fmt("\nFRAME {} {} {}\n"), f, (m_bitCur / 32) * 4, m_bitCur % 32); + fmt::print(stderr, FMT_STRING("\nFRAME {} {} {}\n"), f, (m_bitCur / 32) * 4, m_bitCur % 32); int lastId = -1; #endif auto kit = chanKeys.begin(); @@ -197,7 +197,7 @@ std::vector> BitstreamReader::read(const atUint8* data, size_ QuantizedRot qr = {{p[0], p[1], p[2]}, wBit}; kit->emplace_back(DequantizeRotation(qr, rotDiv)); #if DUMP_KEYS - fmt::print(stderr, fmt("{} R: {} {} {} {}\t"), chan.id, wBit, p[0], p[1], p[2]); + fmt::print(stderr, FMT_STRING("{} R: {} {} {} {}\t"), chan.id, wBit, p[0], p[1], p[2]); #endif break; } @@ -210,7 +210,7 @@ std::vector> BitstreamReader::read(const atUint8* data, size_ p[2] += val3; kit->push_back({p[0] * transMult, p[1] * transMult, p[2] * transMult}); #if DUMP_KEYS - fmt::print(stderr, fmt("{} T: {} {} {}\t"), chan.id, p[0], p[1], p[2]); + fmt::print(stderr, FMT_STRING("{} T: {} {} {}\t"), chan.id, p[0], p[1], p[2]); #endif break; } @@ -220,7 +220,7 @@ std::vector> BitstreamReader::read(const atUint8* data, size_ p[2] += dequantize(data, chan.q[2]); kit->push_back({p[0] * scaleMult, p[1] * scaleMult, p[2] * scaleMult}); #if DUMP_KEYS - fmt::print(stderr, fmt("{} S: {} {} {}\t"), chan.id, p[0], p[1], p[2]); + fmt::print(stderr, FMT_STRING("{} S: {} {} {}\t"), chan.id, p[0], p[1], p[2]); #endif break; } diff --git a/DataSpec/DNACommon/AROTBuilder.cpp b/DataSpec/DNACommon/AROTBuilder.cpp index c31ae21f0..30a2ede2d 100644 --- a/DataSpec/DNACommon/AROTBuilder.cpp +++ b/DataSpec/DNACommon/AROTBuilder.cpp @@ -140,7 +140,7 @@ void AROTBuilder::Node::nodeCount(size_t& sz, size_t& idxRefs, BitmapPool& bmpPo sz += 1; poolIdx = bmpPool.addIndices(childIndices); if (poolIdx > 65535) - Log.report(logvisor::Fatal, fmt("AROT bitmap exceeds 16-bit node addressing; area too complex")); + Log.report(logvisor::Fatal, FMT_STRING("AROT bitmap exceeds 16-bit node addressing; area too complex")); uint32_t childCount = AROTChildCounts[compSubdivs]; nodeOff = curOff; @@ -180,7 +180,7 @@ void AROTBuilder::Node::writeNodes(athena::io::MemoryWriter& w, int nodeIdx) { if (childNodes.size()) { int curIdx = nodeIdx + 1; if (curIdx > 65535) - Log.report(logvisor::Fatal, fmt("AROT node exceeds 16-bit node addressing; area too complex")); + Log.report(logvisor::Fatal, FMT_STRING("AROT node exceeds 16-bit node addressing; area too complex")); std::array childIndices; diff --git a/DataSpec/DNACommon/ATBL.cpp b/DataSpec/DNACommon/ATBL.cpp index 10e5f3ead..38757305e 100644 --- a/DataSpec/DNACommon/ATBL.cpp +++ b/DataSpec/DNACommon/ATBL.cpp @@ -24,7 +24,7 @@ bool ATBL::Extract(PAKEntryReadStream& rs, const hecl::ProjectPath& outPath) { uint16_t idx = rs.readUint16Big(); if (idx == 0xffff) continue; - w.writeUint16(fmt::format(fmt("0x{:04X}"), i), idx); + w.writeUint16(fmt::format(FMT_STRING("0x{:04X}"), i), idx); } athena::io::FileWriter fw(outPath.getAbsolutePath()); diff --git a/DataSpec/DNACommon/BabeDead.cpp b/DataSpec/DNACommon/BabeDead.cpp index 2b4d8eed9..51a43ea19 100644 --- a/DataSpec/DNACommon/BabeDead.cpp +++ b/DataSpec/DNACommon/BabeDead.cpp @@ -18,13 +18,13 @@ void ReadBabeDeadLightToBlender(hecl::blender::PyOutStream& os, const BabeDeadLi switch (light.lightType) { case BabeDeadLight::LightType::LocalAmbient: case BabeDeadLight::LightType::LocalAmbient2: - os.format(fmt( + os.format(FMT_STRING( "bg_node.inputs[0].default_value = ({},{},{},1.0)\n" "bg_node.inputs[1].default_value = {}\n"), light.color.simd[0], light.color.simd[1], light.color.simd[2], light.q / 8.f); return; case BabeDeadLight::LightType::Directional: - os.format(fmt( + os.format(FMT_STRING( "lamp = bpy.data.lights.new('LAMP_{:01d}_{:03d}', 'SUN')\n" "lamp.color = ({},{},{})\n" "lamp_obj = bpy.data.objects.new(lamp.name, lamp)\n" @@ -36,7 +36,7 @@ void ReadBabeDeadLightToBlender(hecl::blender::PyOutStream& os, const BabeDeadLi light.direction.simd[1], light.direction.simd[2], light.castShadows ? "True" : "False"); return; case BabeDeadLight::LightType::Custom: - os.format(fmt( + os.format(FMT_STRING( "lamp = bpy.data.lights.new('LAMP_{:01d}_{:03d}', 'POINT')\n" "lamp.color = ({},{},{})\n" "lamp_obj = bpy.data.objects.new(lamp.name, lamp)\n" @@ -48,7 +48,7 @@ void ReadBabeDeadLightToBlender(hecl::blender::PyOutStream& os, const BabeDeadLi break; case BabeDeadLight::LightType::Spot: case BabeDeadLight::LightType::Spot2: - os.format(fmt( + os.format(FMT_STRING( "lamp = bpy.data.lights.new('LAMP_{:01d}_{:03d}', 'SPOT')\n" "lamp.color = ({},{},{})\n" "lamp.spot_size = {:.6g}\n" @@ -66,7 +66,7 @@ void ReadBabeDeadLightToBlender(hecl::blender::PyOutStream& os, const BabeDeadLi return; } - os.format(fmt( + os.format(FMT_STRING( "lamp.retro_layer = {}\n" "lamp.retro_origtype = {}\n" "lamp.falloff_type = 'INVERSE_COEFFICIENTS'\n" @@ -90,17 +90,17 @@ void ReadBabeDeadLightToBlender(hecl::blender::PyOutStream& os, const BabeDeadLi os << "falloff_node.inputs[0].default_value *= 150.0\n" "lamp.node_tree.links.new(falloff_node.outputs[2], lamp.node_tree.nodes['Emission'].inputs[1])\n"; if (light.q > FLT_EPSILON) - os.format(fmt("lamp.constant_coefficient = 2.0 / {}\n"), light.q); + os.format(FMT_STRING("lamp.constant_coefficient = 2.0 / {}\n"), light.q); break; case BabeDeadLight::Falloff::Linear: os << "lamp.node_tree.links.new(falloff_node.outputs[1], lamp.node_tree.nodes['Emission'].inputs[1])\n"; if (light.q > FLT_EPSILON) - os.format(fmt("lamp.linear_coefficient = 250 / {}\n"), light.q); + os.format(FMT_STRING("lamp.linear_coefficient = 250 / {}\n"), light.q); break; case BabeDeadLight::Falloff::Quadratic: os << "lamp.node_tree.links.new(falloff_node.outputs[0], lamp.node_tree.nodes['Emission'].inputs[1])\n"; if (light.q > FLT_EPSILON) - os.format(fmt("lamp.quadratic_coefficient = 25000 / {}\n"), light.q); + os.format(FMT_STRING("lamp.quadratic_coefficient = 25000 / {}\n"), light.q); break; default: break; diff --git a/DataSpec/DNACommon/CMDL.cpp b/DataSpec/DNACommon/CMDL.cpp index 487a113b3..bbb099792 100644 --- a/DataSpec/DNACommon/CMDL.cpp +++ b/DataSpec/DNACommon/CMDL.cpp @@ -84,7 +84,7 @@ void ReadMaterialSetToBlender_1_2(hecl::blender::PyOutStream& os, const Material } hecl::SystemString resPath = pakRouter.getResourceRelativePath(entry, tex); hecl::SystemUTF8Conv resPathView(resPath); - os.format(fmt( + os.format(FMT_STRING( "if '{}' in bpy.data.images:\n" " image = bpy.data.images['{}']\n" "else:\n" @@ -148,7 +148,7 @@ public: for (const std::pair>>& ev : m_extraVerts) { for (const std::pair& se : ev.second) { if (se.second == nextVert) { - os.format(fmt( + os.format(FMT_STRING( "bm.verts.ensure_lookup_table()\n" "orig_vert = bm.verts[{}]\n" "vert = bm.verts.new(orig_vert.co)\n"), @@ -466,7 +466,7 @@ void InitGeomBlenderContext(hecl::blender::PyOutStream& os, const hecl::ProjectP "\n"; /* Link master shader library */ - os.format(fmt( + os.format(FMT_STRING( "# Master shader library\n" "with bpy.data.libraries.load('{}', link=True, relative=True) as (data_from, data_to):\n" " data_to.node_groups = data_from.node_groups\n" @@ -485,13 +485,13 @@ void FinishBlenderMesh(hecl::blender::PyOutStream& os, unsigned matSetCount, int "obj = bpy.data.objects.new(mesh.name, mesh)\n" "obj.show_transparent = True\n" "coll.objects.link(obj)\n"; - os.format(fmt("mesh.hecl_material_count = {}\n"), matSetCount); + os.format(FMT_STRING("mesh.hecl_material_count = {}\n"), matSetCount); } else { - os.format(fmt("mesh = bpy.data.meshes.new(bpy.context.scene.name + '_{:03d}')\n"), meshIdx); + os.format(FMT_STRING("mesh = bpy.data.meshes.new(bpy.context.scene.name + '_{:03d}')\n"), meshIdx); os << "obj = bpy.data.objects.new(mesh.name, mesh)\n" "obj.show_transparent = True\n" "coll.objects.link(obj)\n"; - os.format(fmt("mesh.hecl_material_count = {}\n"), matSetCount); + os.format(FMT_STRING("mesh.hecl_material_count = {}\n"), matSetCount); } os << "mesh.use_auto_smooth = True\n" @@ -701,7 +701,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I for (atUint16 i = 0; i <= maxIdxs.pos; ++i) { positions.push_back(reader.readVec3fBig()); const atVec3f& pos = positions.back(); - os.format(fmt("vert = bm.verts.new(({},{},{}))\n"), pos.simd[0], pos.simd[1], pos.simd[2]); + os.format(FMT_STRING("vert = bm.verts.new(({},{},{}))\n"), pos.simd[0], pos.simd[1], pos.simd[2]); if (rp.first.second) { if (SurfaceHeader::UseMatrixSkinning() && !skinIndices.empty()) rp.first.second->weightVertex(os, *rp.second.second, skinIndices[i]); @@ -711,10 +711,10 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I } if (rp.first.second && SurfaceHeader::UseMatrixSkinning() && !skinIndices.empty()) vertCount += extraTracker.sendAdditionalVertsToBlender(os, rp, 0); - os.format(fmt("two_face_vert = {}\n"), vertCount); + os.format(FMT_STRING("two_face_vert = {}\n"), vertCount); for (atUint16 i = 0; i <= maxIdxs.pos; ++i) { const atVec3f& pos = positions[i]; - os.format(fmt("vert = bm.verts.new(({},{},{}))\n"), pos.simd[0], pos.simd[1], pos.simd[2]); + os.format(FMT_STRING("vert = bm.verts.new(({},{},{}))\n"), pos.simd[0], pos.simd[1], pos.simd[2]); if (rp.first.second) { if (SurfaceHeader::UseMatrixSkinning() && !skinIndices.empty()) rp.first.second->weightVertex(os, *rp.second.second, skinIndices[i]); @@ -735,13 +735,13 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I float x = reader.readInt16Big() / 16384.0f; float y = reader.readInt16Big() / 16384.0f; float z = reader.readInt16Big() / 16384.0f; - os.format(fmt("norm_list.append(({},{},{}))\n"), x, y, z); + os.format(FMT_STRING("norm_list.append(({},{},{}))\n"), x, y, z); } } else { atUint32 normCount = secSizes[s] / 12; for (atUint32 i = 0; i < normCount; ++i) { const atVec3f norm = reader.readVec3fBig(); - os.format(fmt("norm_list.append(({},{},{}))\n"), norm.simd[0], norm.simd[1], norm.simd[2]); + os.format(FMT_STRING("norm_list.append(({},{},{}))\n"), norm.simd[0], norm.simd[1], norm.simd[2]); } } break; @@ -756,7 +756,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I atUint32 uvCount = secSizes[s] / 8; for (atUint32 i = 0; i < uvCount; ++i) { const atVec2f uv = reader.readVec2fBig(); - os.format(fmt("uv_list.append(({},{}))\n"), uv.simd[0], uv.simd[1]); + os.format(FMT_STRING("uv_list.append(({},{}))\n"), uv.simd[0], uv.simd[1]); } break; } @@ -772,7 +772,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I for (atUint32 i = 0; i < uvCount; ++i) { float x = reader.readInt16Big() / 32768.0f; float y = reader.readInt16Big() / 32768.0f; - os.format(fmt("suv_list.append(({},{}))\n"), x, y); + os.format(FMT_STRING("suv_list.append(({},{}))\n"), x, y); } break; } @@ -799,10 +799,10 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I if (SurfaceHeader::UseMatrixSkinning() && rp.first.second) bankIn = rp.first.second->getMatrixBank(sHead.skinMatrixBankIdx()); - os.format(fmt("materials[{}].pass_index = {}\n"), sHead.matIdx, surfIdx++); + os.format(FMT_STRING("materials[{}].pass_index = {}\n"), sHead.matIdx, surfIdx++); if (matUVCount > createdUVLayers) { for (unsigned l = createdUVLayers; l < matUVCount; ++l) - os.format(fmt("bm.loops.layers.uv.new('UV_{}')\n"), l); + os.format(FMT_STRING("bm.loops.layers.uv.new('UV_{}')\n"), l); createdUVLayers = matUVCount; } @@ -824,7 +824,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I atUint8 flip = 0; for (int v = 0; v < vertCount - 2; ++v) { if (flip) { - os.format(fmt( + os.format(FMT_STRING( "last_face, last_mesh = add_triangle(bm, bm.verts, ({},{},{}), norm_list, ({},{},{}), {}, od_list, " "two_face_vert)\n"), primVerts[c % 3].pos, primVerts[(c + 2) % 3].pos, primVerts[(c + 1) % 3].pos, primVerts[c % 3].norm, @@ -833,7 +833,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I os << "if last_face is not None:\n"; for (unsigned j = 0; j < matUVCount; ++j) { if (j == 0 && matShortUVs) - os.format(fmt( + os.format(FMT_STRING( " uv_tri = expand_lightmap_triangle(lightmap_tri_tracker, suv_list[{}], suv_list[{}], " "suv_list[{}])\n" " loop_from_facevert(last_mesh, last_face, {})[last_mesh.loops.layers.uv[{}]].uv = " @@ -845,7 +845,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I primVerts[c % 3].uvs[j], primVerts[(c + 2) % 3].uvs[j], primVerts[(c + 1) % 3].uvs[j], primVerts[c % 3].pos, j, primVerts[(c + 2) % 3].pos, j, primVerts[(c + 1) % 3].pos, j); else - os.format(fmt( + os.format(FMT_STRING( " loop_from_facevert(last_mesh, last_face, {})[last_mesh.loops.layers.uv[{}]].uv = " "uv_list[{}]\n" " loop_from_facevert(last_mesh, last_face, {})[last_mesh.loops.layers.uv[{}]].uv = " @@ -857,7 +857,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I } } } else { - os.format(fmt( + os.format(FMT_STRING( "last_face, last_mesh = add_triangle(bm, bm.verts, ({},{},{}), norm_list, ({},{},{}), {}, od_list, " "two_face_vert)\n"), primVerts[c % 3].pos, primVerts[(c + 1) % 3].pos, primVerts[(c + 2) % 3].pos, primVerts[c % 3].norm, @@ -866,7 +866,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I os << "if last_face is not None:\n"; for (unsigned j = 0; j < matUVCount; ++j) { if (j == 0 && matShortUVs) - os.format(fmt( + os.format(FMT_STRING( " uv_tri = expand_lightmap_triangle(lightmap_tri_tracker, suv_list[{}], suv_list[{}], " "suv_list[{}])\n" " loop_from_facevert(last_mesh, last_face, {})[last_mesh.loops.layers.uv[{}]].uv = " @@ -878,7 +878,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I primVerts[c % 3].uvs[j], primVerts[(c + 1) % 3].uvs[j], primVerts[(c + 2) % 3].uvs[j], primVerts[c % 3].pos, j, primVerts[(c + 1) % 3].pos, j, primVerts[(c + 2) % 3].pos, j); else - os.format(fmt( + os.format(FMT_STRING( " loop_from_facevert(last_mesh, last_face, {})[last_mesh.loops.layers.uv[{}]].uv = " "uv_list[{}]\n" " loop_from_facevert(last_mesh, last_face, {})[last_mesh.loops.layers.uv[{}]].uv = " @@ -901,7 +901,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I } else if (ptype == GX::TRIANGLES) { for (int v = 0; v < vertCount; v += 3) { - os.format(fmt( + os.format(FMT_STRING( "last_face, last_mesh = add_triangle(bm, bm.verts, ({},{},{}), norm_list, ({},{},{}), {}, od_list, " "two_face_vert)\n"), primVerts[0].pos, primVerts[1].pos, primVerts[2].pos, primVerts[0].norm, primVerts[1].norm, @@ -910,7 +910,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I os << "if last_face is not None:\n"; for (unsigned j = 0; j < matUVCount; ++j) { if (j == 0 && matShortUVs) - os.format(fmt( + os.format(FMT_STRING( " uv_tri = expand_lightmap_triangle(lightmap_tri_tracker, suv_list[{}], suv_list[{}], " "suv_list[{}])\n" " loop_from_facevert(last_mesh, last_face, {})[last_mesh.loops.layers.uv[{}]].uv = " @@ -922,7 +922,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I primVerts[0].uvs[j], primVerts[1].uvs[j], primVerts[2].uvs[j], primVerts[0].pos, j, primVerts[1].pos, j, primVerts[2].pos, j); else - os.format(fmt( + os.format(FMT_STRING( " loop_from_facevert(last_mesh, last_face, {})[last_mesh.loops.layers.uv[{}]].uv = " "uv_list[{}]\n" " loop_from_facevert(last_mesh, last_face, {})[last_mesh.loops.layers.uv[{}]].uv = " @@ -945,7 +945,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I } else if (ptype == GX::TRIANGLEFAN) { ++c; for (int v = 0; v < vertCount - 2; ++v) { - os.format(fmt( + os.format(FMT_STRING( "last_face, last_mesh = add_triangle(bm, bm.verts, ({},{},{}), norm_list, ({},{},{}), {}, od_list, " "two_face_vert)\n"), firstPrimVert.pos, primVerts[c % 3].pos, primVerts[(c + 1) % 3].pos, firstPrimVert.norm, @@ -954,7 +954,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I os << "if last_face is not None:\n"; for (unsigned j = 0; j < matUVCount; ++j) { if (j == 0 && matShortUVs) - os.format(fmt( + os.format(FMT_STRING( " uv_tri = expand_lightmap_triangle(lightmap_tri_tracker, suv_list[{}], suv_list[{}], " "suv_list[{}])\n" " loop_from_facevert(last_mesh, last_face, {})[last_mesh.loops.layers.uv[{}]].uv = " @@ -966,7 +966,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I firstPrimVert.uvs[j], primVerts[c % 3].uvs[j], primVerts[(c + 1) % 3].uvs[j], firstPrimVert.pos, j, primVerts[c % 3].pos, j, primVerts[(c + 1) % 3].pos, j); else - os.format(fmt( + os.format(FMT_STRING( " loop_from_facevert(last_mesh, last_face, {})[last_mesh.loops.layers.uv[{}]].uv = " "uv_list[{}]\n" " loop_from_facevert(last_mesh, last_face, {})[last_mesh.loops.layers.uv[{}]].uv = " @@ -1002,7 +1002,7 @@ atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os, athena::io::I FinishBlenderMesh(os, matSetCount, meshIdx); if (rp.first.second) { - os.format(fmt("mesh.cskr_id = '{}'\n"), rp.first.first); + os.format(FMT_STRING("mesh.cskr_id = '{}'\n"), rp.first.first); rp.second.second->sendVertexGroupsToBlender(os); } @@ -1016,18 +1016,18 @@ bool ReadCMDLToBlender(hecl::blender::Connection& conn, athena::io::IStreamReade head.read(reader); if (head.magic != 0xDEADBABE) { - LogDNACommon.report(logvisor::Error, fmt("invalid CMDL magic")); + LogDNACommon.report(logvisor::Error, FMT_STRING("invalid CMDL magic")); return false; } if (head.version != Version) { - LogDNACommon.report(logvisor::Error, fmt("invalid CMDL version")); + LogDNACommon.report(logvisor::Error, FMT_STRING("invalid CMDL version")); return false; } /* Open Py Stream and read sections */ hecl::blender::PyOutStream os = conn.beginPythonOut(true); - os.format(fmt( + os.format(FMT_STRING( "import bpy\n" "import bmesh\n" "\n" @@ -1078,7 +1078,7 @@ void NameCMDL(athena::io::IStreamReader& reader, PAKRouter& pakRouter, typename const SpecBase& dataspec) { Header head; head.read(reader); - std::string bestName = fmt::format(fmt("CMDL_{}"), entry.id); + std::string bestName = fmt::format(FMT_STRING("CMDL_{}"), entry.id); /* Pre-read pass to determine maximum used vert indices */ atUint32 matSecCount = 0; @@ -1152,7 +1152,7 @@ bool WriteCMDL(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath size_t endOff = 0; for (const Material& mat : mset) { - std::string diagName = fmt::format(fmt("{}:{}"), inPath.getLastComponentUTF8(), mat.name); + std::string diagName = fmt::format(FMT_STRING("{}:{}"), inPath.getLastComponentUTF8(), mat.name); hecl::Frontend::IR matIR = FE.compileSource(mat.source, diagName); setBackends.emplace_back(); hecl::Backend::GX& matGX = setBackends.back(); @@ -1245,7 +1245,7 @@ bool WriteCMDL(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath for (const Mesh::Surface& surf : mesh.surfaces) { size_t vertSz = matSets.at(0).materials.at(surf.materialIdx).getVAFlags().vertDLSize(); if (surf.verts.size() > 65536) - LogDNACommon.report(logvisor::Fatal, fmt("GX DisplayList overflow")); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("GX DisplayList overflow")); size_t secSz = 64; for (auto it = surf.verts.cbegin(); it != surf.verts.cend();) { atUint16 vertCount = 0; @@ -1339,7 +1339,7 @@ bool WriteCMDL(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath else if (mesh.topology == hecl::HMDLTopology::TriStrips) prim = GX::TRIANGLESTRIP; else - LogDNACommon.report(logvisor::Fatal, fmt("unrecognized mesh output mode")); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("unrecognized mesh output mode")); auto surfSizeIt = head.secSizes.begin() + firstSurfSec; for (const Mesh::Surface& surf : mesh.surfaces) { const typename MaterialSet::Material::VAFlags& vaFlags = matSets.at(0).materials.at(surf.materialIdx).getVAFlags(); @@ -1787,7 +1787,7 @@ bool WriteMREASecs(std::vector>& secsOut, const hecl::Proje else if (mesh.topology == hecl::HMDLTopology::TriStrips) prim = GX::TRIANGLESTRIP; else - LogDNACommon.report(logvisor::Fatal, fmt("unrecognized mesh output mode")); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("unrecognized mesh output mode")); auto surfEndOffIt = surfEndOffs.begin(); size_t lastEndOff = 0; for (const Mesh::Surface& surf : mesh.surfaces) { diff --git a/DataSpec/DNACommon/DNACommon.cpp b/DataSpec/DNACommon/DNACommon.cpp index 0ddf8c344..dcf816b81 100644 --- a/DataSpec/DNACommon/DNACommon.cpp +++ b/DataSpec/DNACommon/DNACommon.cpp @@ -26,11 +26,11 @@ hecl::ProjectPath UniqueIDBridge::TranslatePakIdToPath(const IDType& id, bool si if (!project) { if (pakRouter) { if (hecl::VerbosityLevel >= 1 && !silenceWarnings && id.isValid()) - LogDNACommon.report(logvisor::Warning, fmt("unable to translate {} to path"), id); + LogDNACommon.report(logvisor::Warning, FMT_STRING("unable to translate {} to path"), id); return {}; } LogDNACommon.report(logvisor::Fatal, - fmt("g_PakRouter or s_Project must be set to non-null before " + FMT_STRING("g_PakRouter or s_Project must be set to non-null before " "calling UniqueIDBridge::TranslatePakIdToPath")); return {}; } @@ -38,7 +38,7 @@ hecl::ProjectPath UniqueIDBridge::TranslatePakIdToPath(const IDType& id, bool si const hecl::ProjectPath* search = project->lookupBridgePath(id.toUint64()); if (!search) { if (hecl::VerbosityLevel >= 1 && !silenceWarnings && id.isValid()) - LogDNACommon.report(logvisor::Warning, fmt("unable to translate {} to path"), id); + LogDNACommon.report(logvisor::Warning, FMT_STRING("unable to translate {} to path"), id); return {}; } return *search; @@ -53,7 +53,7 @@ hecl::ProjectPath UniqueIDBridge::MakePathFromString(std::string_view str) { return {}; hecl::Database::Project* project = s_Project.get(); if (!project) - LogDNACommon.report(logvisor::Fatal, fmt("UniqueIDBridge::setGlobalProject must be called before MakePathFromString")); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("UniqueIDBridge::setGlobalProject must be called before MakePathFromString")); hecl::ProjectPath path = hecl::ProjectPath(*project, str); project->addBridgePathToCache(IDType(path).toUint64(), path); return path; @@ -91,7 +91,7 @@ void UniqueID32::Enumerate(typename BinarySize::StreamT& s) } std::string UniqueID32::toString() const { - return fmt::format(fmt("{}"), *this); + return fmt::format(FMT_STRING("{}"), *this); } template <> @@ -143,7 +143,7 @@ void UniqueID64::Enumerate(typename BinarySize::StreamT& s) } std::string UniqueID64::toString() const { - return fmt::format(fmt("{}"), *this); + return fmt::format(FMT_STRING("{}"), *this); } /** PAK 128-bit Unique ID */ @@ -176,7 +176,7 @@ void UniqueID128::Enumerate(typename BinarySize::StreamT& s) } std::string UniqueID128::toString() const { - return fmt::format(fmt("{}"), *this); + return fmt::format(FMT_STRING("{}"), *this); } /** Word Bitmap reader/writer */ diff --git a/DataSpec/DNACommon/DNACommon.hpp b/DataSpec/DNACommon/DNACommon.hpp index 08587bb3d..6ef5263fb 100644 --- a/DataSpec/DNACommon/DNACommon.hpp +++ b/DataSpec/DNACommon/DNACommon.hpp @@ -79,15 +79,15 @@ public: PAKRouterBase(const SpecBase& dataSpec) : m_dataSpec(dataSpec) {} hecl::Database::Project& getProject() const { return m_dataSpec.getProject(); } virtual hecl::ProjectPath getWorking(const UniqueID32&, bool silenceWarnings = false) const { - LogDNACommon.report(logvisor::Fatal, fmt("PAKRouter IDType mismatch; expected UniqueID32 specialization")); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("PAKRouter IDType mismatch; expected UniqueID32 specialization")); return hecl::ProjectPath(); } virtual hecl::ProjectPath getWorking(const UniqueID64&, bool silenceWarnings = false) const { - LogDNACommon.report(logvisor::Fatal, fmt("PAKRouter IDType mismatch; expected UniqueID64 specialization")); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("PAKRouter IDType mismatch; expected UniqueID64 specialization")); return hecl::ProjectPath(); } virtual hecl::ProjectPath getWorking(const UniqueID128&, bool silenceWarnings = false) const { - LogDNACommon.report(logvisor::Fatal, fmt("PAKRouter IDType mismatch; expected UniqueID128 specialization")); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("PAKRouter IDType mismatch; expected UniqueID128 specialization")); return hecl::ProjectPath(); } }; diff --git a/DataSpec/DNACommon/DeafBabe.cpp b/DataSpec/DNACommon/DeafBabe.cpp index 5f93be382..c18bb7162 100644 --- a/DataSpec/DNACommon/DeafBabe.cpp +++ b/DataSpec/DNACommon/DeafBabe.cpp @@ -22,7 +22,7 @@ void DeafBabeSendToBlender(hecl::blender::PyOutStream& os, const DEAFBABE& db, b "col_bm = bmesh.new()\n"; for (const atVec3f& vert : db.verts) { zeus::simd_floats f(vert.simd); - os.format(fmt("col_bm.verts.new(({},{},{}))\n"), f[0], f[1], f[2]); + os.format(FMT_STRING("col_bm.verts.new(({},{},{}))\n"), f[0], f[1], f[2]); } os << "col_bm.verts.ensure_lookup_table()\n"; @@ -49,11 +49,11 @@ void DeafBabeSendToBlender(hecl::blender::PyOutStream& os, const DEAFBABE& db, b } os << "tri_verts = []\n"; - os.format(fmt("tri_verts.append(col_bm.verts[{}])\n"), vindices[0]); - os.format(fmt("tri_verts.append(col_bm.verts[{}])\n"), vindices[1]); - os.format(fmt("tri_verts.append(col_bm.verts[{}])\n"), vindices[2]); + os.format(FMT_STRING("tri_verts.append(col_bm.verts[{}])\n"), vindices[0]); + os.format(FMT_STRING("tri_verts.append(col_bm.verts[{}])\n"), vindices[1]); + os.format(FMT_STRING("tri_verts.append(col_bm.verts[{}])\n"), vindices[2]); - os.format(fmt( + os.format(FMT_STRING( "face = col_bm.faces.get(tri_verts)\n" "if face is None:\n" " face = col_bm.faces.new(tri_verts)\n" @@ -72,7 +72,7 @@ void DeafBabeSendToBlender(hecl::blender::PyOutStream& os, const DEAFBABE& db, b db.insertNoClimb(os); if (isDcln) - os.format(fmt("col_mesh = bpy.data.meshes.new('CMESH_{}')\n"), idx); + os.format(FMT_STRING("col_mesh = bpy.data.meshes.new('CMESH_{}')\n"), idx); else os << "col_mesh = bpy.data.meshes.new('CMESH')\n"; diff --git a/DataSpec/DNACommon/FONT.cpp b/DataSpec/DNACommon/FONT.cpp index 7cab85f3c..3e3e652b8 100644 --- a/DataSpec/DNACommon/FONT.cpp +++ b/DataSpec/DNACommon/FONT.cpp @@ -13,7 +13,7 @@ void FONT::_read(athena::io::IStreamReader& __dna_reader) { DNAFourCC magic; magic.read(__dna_reader); if (magic != SBIG('FONT')) { - LogModule.report(logvisor::Fatal, fmt("Invalid FONT magic '{}'"), magic); + LogModule.report(logvisor::Fatal, FMT_STRING("Invalid FONT magic '{}'"), magic); return; } /* version */ diff --git a/DataSpec/DNACommon/FSM2.cpp b/DataSpec/DNACommon/FSM2.cpp index e13d4753a..27b73f457 100644 --- a/DataSpec/DNACommon/FSM2.cpp +++ b/DataSpec/DNACommon/FSM2.cpp @@ -16,7 +16,7 @@ template void FSM2::Enumerate(typename Op::StreamT& s) { Do(athena::io::PropId{"header"}, header, s); if (header.magic != SBIG('FSM2')) { - LogDNAFSM2.report(logvisor::Fatal, fmt("Invalid FSM2 magic '{}' expected 'FSM2'"), header.magic); + LogDNAFSM2.report(logvisor::Fatal, FMT_STRING("Invalid FSM2 magic '{}' expected 'FSM2'"), header.magic); return; } @@ -29,7 +29,7 @@ void FSM2::Enumerate(typename Op::StreamT& s) { detail.reset(new FSMV2); Do(athena::io::PropId{"detail"}, static_cast(*detail), s); } else { - LogDNAFSM2.report(logvisor::Fatal, fmt("Invalid FSM2 version '{}'"), header.version); + LogDNAFSM2.report(logvisor::Fatal, FMT_STRING("Invalid FSM2 version '{}'"), header.version); return; } } diff --git a/DataSpec/DNACommon/MAPA.cpp b/DataSpec/DNACommon/MAPA.cpp index 3e8a868f5..2cc8e85d9 100644 --- a/DataSpec/DNACommon/MAPA.cpp +++ b/DataSpec/DNACommon/MAPA.cpp @@ -21,7 +21,7 @@ void MAPA::Enumerate(typename Read::StreamT& __dna_reader) { /* magic */ magic = __dna_reader.readUint32Big(); if (magic != 0xDEADD00D) { - LogDNACommon.report(logvisor::Error, fmt("invalid MAPA magic")); + LogDNACommon.report(logvisor::Error, FMT_STRING("invalid MAPA magic")); return; } /* version */ @@ -33,7 +33,7 @@ void MAPA::Enumerate(typename Read::StreamT& __dna_reader) { else if (version == 5) header = std::make_unique(); else { - LogDNACommon.report(logvisor::Error, fmt("invalid MAPA version")); + LogDNACommon.report(logvisor::Error, FMT_STRING("invalid MAPA version")); return; } @@ -146,7 +146,7 @@ bool ReadMAPAToBlender(hecl::blender::Connection& conn, const MAPA& mapa, const " edge.seam = True\n" "\n"; - os.format(fmt( + os.format(FMT_STRING( "bpy.context.scene.name = 'MAPA_{}'\n" "bpy.context.scene.retro_map_vis_mode = '{}'\n"), entry.id, RetroMapVisModes[mapa.header->visMode()]); @@ -159,7 +159,7 @@ bool ReadMAPAToBlender(hecl::blender::Connection& conn, const MAPA& mapa, const zeus::simd_floats mtxF[3]; for (int i = 0; i < 3; ++i) moMP12->transformMtx[i].simd.copy_to(mtxF[i]); - os.format(fmt( + os.format(FMT_STRING( "obj = bpy.data.objects.new('MAPOBJ_{:02d}', None)\n" "bpy.context.scene.collection.objects.link(obj)\n" "obj.retro_mappable_type = {}\n" @@ -181,7 +181,7 @@ bool ReadMAPAToBlender(hecl::blender::Connection& conn, const MAPA& mapa, const zeus::simd_floats mtxF[3]; for (int i = 0; i < 3; ++i) moMP3->transformMtx[i].simd.copy_to(mtxF[i]); - os.format(fmt( + os.format(FMT_STRING( "obj = bpy.data.objects.new('MAPOBJ_{:02d}', None)\n" "bpy.context.scene.collection.objects.link(obj)\n" "obj.retro_mappable_type = {}\n" @@ -208,7 +208,7 @@ bool ReadMAPAToBlender(hecl::blender::Connection& conn, const MAPA& mapa, const /* Read in verts */ for (const atVec3f& vert : mapa.vertices) { zeus::simd_floats f(vert.simd); - os.format(fmt("bm.verts.new(({},{},{}))\n"), f[0], f[1], f[2]); + os.format(FMT_STRING("bm.verts.new(({},{},{}))\n"), f[0], f[1], f[2]); } os << "bm.verts.ensure_lookup_table()\n"; @@ -225,10 +225,10 @@ bool ReadMAPAToBlender(hecl::blender::Connection& conn, const MAPA& mapa, const atUint8 flip = 0; for (size_t v = 0; v < prim.indexCount - 2; ++v) { if (flip) { - os.format(fmt("add_triangle(bm, ({},{},{}))\n"), primVerts[c % 3], primVerts[(c + 2) % 3], + os.format(FMT_STRING("add_triangle(bm, ({},{},{}))\n"), primVerts[c % 3], primVerts[(c + 2) % 3], primVerts[(c + 1) % 3]); } else { - os.format(fmt("add_triangle(bm, ({},{},{}))\n"), primVerts[c % 3], primVerts[(c + 1) % 3], + os.format(FMT_STRING("add_triangle(bm, ({},{},{}))\n"), primVerts[c % 3], primVerts[(c + 1) % 3], primVerts[(c + 2) % 3]); } flip ^= 1; @@ -248,7 +248,7 @@ bool ReadMAPAToBlender(hecl::blender::Connection& conn, const MAPA& mapa, const } } else if (GX::Primitive(prim.type) == GX::TRIANGLES) { for (size_t v = 0; v < prim.indexCount; v += 3) { - os.format(fmt("add_triangle(bm, ({},{},{}))\n"), primVerts[0], primVerts[1], primVerts[2]); + os.format(FMT_STRING("add_triangle(bm, ({},{},{}))\n"), primVerts[0], primVerts[1], primVerts[2]); /* Break if done */ if (v + 3 >= prim.indexCount) @@ -264,7 +264,7 @@ bool ReadMAPAToBlender(hecl::blender::Connection& conn, const MAPA& mapa, const for (const typename MAPA::Surface::Border& border : surf.borders) { auto iit = border.indices.cbegin(); for (size_t i = 0; i < border.indexCount - 1; ++i) { - os.format(fmt("add_border(bm, ({},{}))\n"), *iit, *(iit + 1)); + os.format(FMT_STRING("add_border(bm, ({},{}))\n"), *iit, *(iit + 1)); ++iit; } } @@ -278,7 +278,7 @@ bool ReadMAPAToBlender(hecl::blender::Connection& conn, const MAPA& mapa, const const zeus::CMatrix4f* tmpMtx = pakRouter.lookupMAPATransform(entry.id); const zeus::CMatrix4f& mtx = tmpMtx ? *tmpMtx : zeus::skIdentityMatrix4f; - os.format(fmt( + os.format(FMT_STRING( "mtx = Matrix((({},{},{},{}),({},{},{},{}),({},{},{},{}),(0.0,0.0,0.0,1.0)))\n" "mtxd = mtx.decompose()\n" "obj.rotation_mode = 'QUATERNION'\n" @@ -294,7 +294,7 @@ bool ReadMAPAToBlender(hecl::blender::Connection& conn, const MAPA& mapa, const if (hecl::StringUtils::BeginsWith(ent.m_name, _SYS_STR("!world_")) && hecl::StringUtils::EndsWith(ent.m_name, _SYS_STR(".blend"))) { hecl::SystemUTF8Conv conv(ent.m_name); - os.linkBackground(fmt::format(fmt("//../{}"), conv), "World"sv); + os.linkBackground(fmt::format(FMT_STRING("//../{}"), conv), "World"sv); break; } } @@ -326,7 +326,7 @@ template bool ReadMAPAToBlender>(hecl::blender::Con template bool Cook(const hecl::blender::MapArea& mapaIn, const hecl::ProjectPath& out) { if (mapaIn.verts.size() >= 256) { - Log.report(logvisor::Error, fmt(_SYS_STR("MAPA {} vertex range exceeded [{}/{}]")), out.getRelativePath(), + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("MAPA {} vertex range exceeded [{}/{}]")), out.getRelativePath(), mapaIn.verts.size(), 255); return false; } diff --git a/DataSpec/DNACommon/MAPU.cpp b/DataSpec/DNACommon/MAPU.cpp index d6f1210f4..e3e7dcf9f 100644 --- a/DataSpec/DNACommon/MAPU.cpp +++ b/DataSpec/DNACommon/MAPU.cpp @@ -43,7 +43,7 @@ bool ReadMAPUToBlender(hecl::blender::Connection& conn, const MAPU& mapu, const for (int i = 0; i < 3; ++i) wldXf.xf[i].simd.copy_to(wldXfF[i]); zeus::simd_floats hexColorF(wld.hexColor.mSimd); - os.format(fmt( + os.format(FMT_STRING( "wldObj = bpy.data.objects.new('{}', None)\n" "mtx = Matrix((({},{},{},{}),({},{},{},{}),({},{},{},{}),(0.0,0.0,0.0,1.0)))\n" "mtxd = mtx.decompose()\n" @@ -62,7 +62,7 @@ bool ReadMAPUToBlender(hecl::blender::Connection& conn, const MAPU& mapu, const zeus::simd_floats hexXfF[3]; for (int i = 0; i < 3; ++i) hexXf.xf[i].simd.copy_to(hexXfF[i]); - os.format(fmt( + os.format(FMT_STRING( "obj = bpy.data.objects.new('{}_{}', hexMesh)\n" "mtx = Matrix((({},{},{},{}),({},{},{},{}),({},{},{},{}),(0.0,0.0,0.0,1.0)))\n" "mtxd = mtx.decompose()\n" diff --git a/DataSpec/DNACommon/MLVL.cpp b/DataSpec/DNACommon/MLVL.cpp index 1db5939b1..94df2d0ca 100644 --- a/DataSpec/DNACommon/MLVL.cpp +++ b/DataSpec/DNACommon/MLVL.cpp @@ -41,7 +41,7 @@ bool ReadMLVLToBlender(hecl::blender::Connection& conn, const MLVL& mlvl, const zeus::simd_floats xfMtxF[3]; for (int i = 0; i < 3; ++i) area.transformMtx[i].simd.copy_to(xfMtxF[i]); - os.format(fmt( + os.format(FMT_STRING( "box_mesh = bpy.data.meshes.new('''{}''')\n" "bm.to_mesh(box_mesh)\n" "bm.free()\n" @@ -67,7 +67,7 @@ bool ReadMLVLToBlender(hecl::blender::Connection& conn, const MLVL& mlvl, const int idx = 0; for (const atVec3f& pv : dock.planeVerts) { const zeus::CVector3f pvRel = zeus::CVector3f(pv) - pvAvg; - os.format(fmt( + os.format(FMT_STRING( "bm.verts.new(({},{},{}))\n" "bm.verts.ensure_lookup_table()\n"), pvRel[0], pvRel[1], pvRel[2]); @@ -76,13 +76,13 @@ bool ReadMLVLToBlender(hecl::blender::Connection& conn, const MLVL& mlvl, const ++idx; } os << "bm.edges.new((bm.verts[-1], bm.verts[0]))\n"; - os.format(fmt("dockMesh = bpy.data.meshes.new('DOCK_{:02d}_{:02d}')\n"), areaIdx, dockIdx); + os.format(FMT_STRING("dockMesh = bpy.data.meshes.new('DOCK_{:02d}_{:02d}')\n"), areaIdx, dockIdx); os << "dockObj = bpy.data.objects.new(dockMesh.name, dockMesh)\n" "bpy.context.scene.collection.objects.link(dockObj)\n" "bm.to_mesh(dockMesh)\n" "bm.free()\n" "dockObj.parent = box\n"; - os.format(fmt("dockObj.location = ({},{},{})\n"), float(pvAvg[0]), float(pvAvg[1]), float(pvAvg[2])); + os.format(FMT_STRING("dockObj.location = ({},{},{})\n"), float(pvAvg[0]), float(pvAvg[1]), float(pvAvg[2])); ++dockIdx; } ++areaIdx; diff --git a/DataSpec/DNACommon/PAK.cpp b/DataSpec/DNACommon/PAK.cpp index 6758ed3a9..c285742cf 100644 --- a/DataSpec/DNACommon/PAK.cpp +++ b/DataSpec/DNACommon/PAK.cpp @@ -207,7 +207,7 @@ void PAKRouter::enterPAKBridge(const BRIDGETYPE& pakBridge) { ++pit; ++bridgeIdx; } - LogDNACommon.report(logvisor::Fatal, fmt("PAKBridge provided to PAKRouter::enterPAKBridge() was not part of build()")); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("PAKBridge provided to PAKRouter::enterPAKBridge() was not part of build()")); } template @@ -287,7 +287,7 @@ hecl::ProjectPath PAKRouter::getWorking(const EntryType* entry, return sharedPath.ensureAuxInfo(auxInfo); } - LogDNACommon.report(logvisor::Fatal, fmt("Unable to find entry {}"), entry->id); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("Unable to find entry {}"), entry->id); return hecl::ProjectPath(); } @@ -338,7 +338,7 @@ hecl::ProjectPath PAKRouter::getCooked(const EntryType* entry) const if (sharedSearch != m_sharedEntries.end()) { return hecl::ProjectPath(m_sharedCooked, getBestEntryName(*entry)); } - LogDNACommon.report(logvisor::Fatal, fmt("Unable to find entry {}"), entry->id); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("Unable to find entry {}"), entry->id); return hecl::ProjectPath(); } @@ -353,7 +353,7 @@ hecl::SystemString PAKRouter::getResourceRelativePath(const EntryTyp const PAKType* pak = m_pak.get(); if (!pak) LogDNACommon.report(logvisor::Fatal, - fmt("PAKRouter::enterPAKBridge() must be called before PAKRouter::getResourceRelativePath()")); + FMT_STRING("PAKRouter::enterPAKBridge() must be called before PAKRouter::getResourceRelativePath()")); const typename BRIDGETYPE::PAKType::Entry* be = lookupEntry(b); if (!be) return hecl::SystemString(); @@ -377,17 +377,17 @@ std::string PAKRouter::getBestEntryName(const EntryType& entry, bool if (stdOverride && !pak.m_noShare) { if (entry.type == FOURCC('MLVL')) - return fmt::format(fmt("!world_{}"), entry.id); + return fmt::format(FMT_STRING("!world_{}"), entry.id); else if (entry.type == FOURCC('MREA')) - return fmt::format(fmt("!area_{}"), entry.id); + return fmt::format(FMT_STRING("!area_{}"), entry.id); else if (entry.type == FOURCC('MAPA')) - return fmt::format(fmt("!map_{}"), entry.id); + return fmt::format(FMT_STRING("!map_{}"), entry.id); else if (entry.type == FOURCC('PATH')) - return fmt::format(fmt("!path_{}"), entry.id); + return fmt::format(FMT_STRING("!path_{}"), entry.id); else if (entry.type == FOURCC('MAPW')) - return fmt::format(fmt("!mapw_{}"), entry.id); + return fmt::format(FMT_STRING("!mapw_{}"), entry.id); else if (entry.type == FOURCC('SAVW')) - return fmt::format(fmt("!savw_{}"), entry.id); + return fmt::format(FMT_STRING("!savw_{}"), entry.id); } std::string catalogueName; @@ -409,17 +409,17 @@ std::string PAKRouter::getBestEntryName(const IDType& entry, bool st if (stdOverride && !pak.m_noShare) { if (e->type == FOURCC('MLVL')) - return fmt::format(fmt("!world_{}"), e->id); + return fmt::format(FMT_STRING("!world_{}"), e->id); else if (e->type == FOURCC('MREA')) - return fmt::format(fmt("!area_{}"), e->id); + return fmt::format(FMT_STRING("!area_{}"), e->id); else if (e->type == FOURCC('MAPA')) - return fmt::format(fmt("!map_{}"), e->id); + return fmt::format(FMT_STRING("!map_{}"), e->id); else if (e->type == FOURCC('PATH')) - return fmt::format(fmt("!path_{}"), e->id); + return fmt::format(FMT_STRING("!path_{}"), e->id); else if (e->type == FOURCC('MAPW')) - return fmt::format(fmt("!mapw_{}"), e->id); + return fmt::format(FMT_STRING("!mapw_{}"), e->id); else if (e->type == FOURCC('SAVW')) - return fmt::format(fmt("!savw_{}"), e->id); + return fmt::format(FMT_STRING("!savw_{}"), e->id); } std::string catalogueName; @@ -495,7 +495,7 @@ const typename BRIDGETYPE::PAKType::Entry* PAKRouter::lookupEntry(co return nullptr; if (!m_bridges) - LogDNACommon.report(logvisor::Fatal, fmt("PAKRouter::build() must be called before PAKRouter::lookupEntry()")); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("PAKRouter::build() must be called before PAKRouter::lookupEntry()")); const PAKType* pak = m_pak.get(); const nod::Node* node = m_node.get(); @@ -511,7 +511,7 @@ const typename BRIDGETYPE::PAKType::Entry* PAKRouter::lookupEntry(co if (currentPAK) { #ifndef NDEBUG if (!silenceWarnings) - LogDNACommon.report(logvisor::Warning, fmt("unable to find PAK entry {} in current PAK"), entry); + LogDNACommon.report(logvisor::Warning, FMT_STRING("unable to find PAK entry {} in current PAK"), entry); #endif return nullptr; } @@ -528,7 +528,7 @@ const typename BRIDGETYPE::PAKType::Entry* PAKRouter::lookupEntry(co #ifndef NDEBUG if (!silenceWarnings) - LogDNACommon.report(logvisor::Warning, fmt("unable to find PAK entry {}"), entry); + LogDNACommon.report(logvisor::Warning, FMT_STRING("unable to find PAK entry {}"), entry); #endif if (nodeOut) *nodeOut = nullptr; @@ -561,7 +561,7 @@ const zeus::CMatrix4f* PAKRouter::lookupMAPATransform(const IDType& template hecl::ProjectPath PAKRouter::getAreaLayerWorking(const IDType& areaId, int layerIdx) const { if (!m_bridges) - LogDNACommon.report(logvisor::Fatal, fmt("PAKRouter::build() must be called before PAKRouter::getAreaLayerWorking()")); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("PAKRouter::build() must be called before PAKRouter::getAreaLayerWorking()")); auto bridgePathIt = m_bridgePaths.cbegin(); for (const BRIDGETYPE& bridge : *m_bridges) { for (const auto& level : bridge.m_levelDeps) @@ -583,7 +583,7 @@ hecl::ProjectPath PAKRouter::getAreaLayerWorking(const IDType& areaI bool& activeOut) const { activeOut = false; if (!m_bridges) - LogDNACommon.report(logvisor::Fatal, fmt("PAKRouter::build() must be called before PAKRouter::getAreaLayerWorking()")); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("PAKRouter::build() must be called before PAKRouter::getAreaLayerWorking()")); auto bridgePathIt = m_bridgePaths.cbegin(); for (const BRIDGETYPE& bridge : *m_bridges) { for (const auto& level : bridge.m_levelDeps) @@ -605,7 +605,7 @@ hecl::ProjectPath PAKRouter::getAreaLayerWorking(const IDType& areaI template hecl::ProjectPath PAKRouter::getAreaLayerCooked(const IDType& areaId, int layerIdx) const { if (!m_bridges) - LogDNACommon.report(logvisor::Fatal, fmt("PAKRouter::build() must be called before PAKRouter::getAreaLayerCooked()")); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("PAKRouter::build() must be called before PAKRouter::getAreaLayerCooked()")); auto bridgePathIt = m_bridgePaths.cbegin(); for (const BRIDGETYPE& bridge : *m_bridges) { for (const auto& level : bridge.m_levelDeps) @@ -626,7 +626,7 @@ template hecl::ProjectPath PAKRouter::getAreaLayerCooked(const IDType& areaId, int layerIdx, bool& activeOut) const { activeOut = false; if (!m_bridges) - LogDNACommon.report(logvisor::Fatal, fmt("PAKRouter::build() must be called before PAKRouter::getAreaLayerCooked()")); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("PAKRouter::build() must be called before PAKRouter::getAreaLayerCooked()")); auto bridgePathIt = m_bridgePaths.cbegin(); for (const BRIDGETYPE& bridge : *m_bridges) { for (const auto& level : bridge.m_levelDeps) @@ -648,7 +648,7 @@ hecl::ProjectPath PAKRouter::getAreaLayerCooked(const IDType& areaId template void PAKRouter::enumerateResources(const std::function& func) { if (!m_bridges) - LogDNACommon.report(logvisor::Fatal, fmt("PAKRouter::build() must be called before PAKRouter::enumerateResources()")); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("PAKRouter::build() must be called before PAKRouter::enumerateResources()")); for (const auto& entryPair : m_uniqueEntries) if (!func(entryPair.second.second)) return; @@ -662,7 +662,7 @@ bool PAKRouter::mreaHasDupeResources(const IDType& id) const { const PAKType* pak = m_pak.get(); if (!pak) LogDNACommon.report(logvisor::Fatal, - fmt("PAKRouter::enterPAKBridge() must be called before PAKRouter::mreaHasDupeResources()")); + FMT_STRING("PAKRouter::enterPAKBridge() must be called before PAKRouter::mreaHasDupeResources()")); return pak->mreaHasDupeResources(id); } diff --git a/DataSpec/DNACommon/PAK.hpp b/DataSpec/DNACommon/PAK.hpp index c7723eea0..35ca2802e 100644 --- a/DataSpec/DNACommon/PAK.hpp +++ b/DataSpec/DNACommon/PAK.hpp @@ -31,7 +31,7 @@ public: PAKEntryReadStream(std::unique_ptr&& buf, atUint64 sz, atUint64 pos) : m_buf(std::move(buf)), m_sz(sz), m_pos(pos) { if (m_pos >= m_sz) - LogDNACommon.report(logvisor::Fatal, fmt("PAK stream cursor overrun")); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("PAK stream cursor overrun")); } void seek(atInt64 pos, athena::SeekOrigin origin) override { if (origin == athena::SeekOrigin::Begin) { @@ -42,7 +42,7 @@ public: m_pos = m_sz + pos; } if (m_pos > m_sz) { - LogDNACommon.report(logvisor::Fatal, fmt("PAK stream cursor overrun")); + LogDNACommon.report(logvisor::Fatal, FMT_STRING("PAK stream cursor overrun")); } } atUint64 position() const override { return m_pos; } diff --git a/DataSpec/DNACommon/PATH.cpp b/DataSpec/DNACommon/PATH.cpp index b756b5e73..212cdad6f 100644 --- a/DataSpec/DNACommon/PATH.cpp +++ b/DataSpec/DNACommon/PATH.cpp @@ -70,7 +70,7 @@ void PATH::sendToBlender(hecl::blender::Connection& conn, std::string " material_index.append(key)\n" " return len(material_index)-1\n" "\n"; - os.format(fmt("bpy.context.scene.name = '{}'\n"), entryName); + os.format(FMT_STRING("bpy.context.scene.name = '{}'\n"), entryName); os << "# Clear Scene\n" "if len(bpy.data.collections):\n" " bpy.data.collections.remove(bpy.data.collections[0])\n" @@ -80,7 +80,7 @@ void PATH::sendToBlender(hecl::blender::Connection& conn, std::string for (const Node& n : nodes) { zeus::simd_floats f(n.position.simd); - os.format(fmt("bm.verts.new(({},{},{}))\n"), f[0], f[1], f[2]); + os.format(FMT_STRING("bm.verts.new(({},{},{}))\n"), f[0], f[1], f[2]); } os << "bm.verts.ensure_lookup_table()\n"; @@ -88,9 +88,9 @@ void PATH::sendToBlender(hecl::blender::Connection& conn, std::string for (const Region& r : regions) { os << "tri_verts = []\n"; for (atUint32 i = 0; i < r.nodeCount; ++i) - os.format(fmt("tri_verts.append(bm.verts[{}])\n"), r.nodeStart + i); + os.format(FMT_STRING("tri_verts.append(bm.verts[{}])\n"), r.nodeStart + i); - os.format(fmt("face = bm.faces.get(tri_verts)\n" + os.format(FMT_STRING("face = bm.faces.get(tri_verts)\n" "if face is None:\n" " face = bm.faces.new(tri_verts)\n" " face.normal_flip()\n" @@ -103,7 +103,7 @@ void PATH::sendToBlender(hecl::blender::Connection& conn, std::string #if 0 const zeus::CVector3f center = xf->multiplyOneOverW(r.centroid); zeus::CAABox aabb(xf->multiplyOneOverW(r.aabb[0]), xf->multiplyOneOverW(r.aabb[1])); - os.format(fmt("aabb = bpy.data.objects.new('AABB', None)\n") + os.format(FMT_STRING("aabb = bpy.data.objects.new('AABB', None)\n") "aabb.location = (%f,%f,%f)\n" "aabb.scale = (%f,%f,%f)\n" "aabb.empty_display_type = 'CUBE'\n" @@ -125,7 +125,7 @@ void PATH::sendToBlender(hecl::blender::Connection& conn, std::string for (const Node& n : nodes) { zeus::simd_floats f(n.position.simd); zeus::simd_floats no(n.position.simd + n.normal.simd); - os.format(fmt("v = bm.verts.new((%f,%f,%f))\n") + os.format(FMT_STRING("v = bm.verts.new((%f,%f,%f))\n") "v2 = bm.verts.new((%f,%f,%f))\n" "bm.edges.new((v, v2))\n", f[0], f[1], f[2], no[0], no[1], no[2]); } @@ -150,7 +150,7 @@ void PATH::sendToBlender(hecl::blender::Connection& conn, std::string zeus::simd_floats xfMtxF[4]; for (int i = 0; i < 4; ++i) w.m[i].mSimd.copy_to(xfMtxF[i]); - os.format(fmt("mtx = Matrix((({},{},{},{}),({},{},{},{}),({},{},{},{}),(0.0,0.0,0.0,1.0)))\n" + os.format(FMT_STRING("mtx = Matrix((({},{},{},{}),({},{},{},{}),({},{},{},{}),(0.0,0.0,0.0,1.0)))\n" "mtxd = mtx.decompose()\n" "path_mesh_obj.rotation_mode = 'QUATERNION'\n" "path_mesh_obj.location = mtxd[0]\n" @@ -171,7 +171,7 @@ void PATH::sendToBlender(hecl::blender::Connection& conn, std::string } #endif - os.linkBackground(fmt::format(fmt("//{}"), areaPath)); + os.linkBackground(fmt::format(FMT_STRING("//{}"), areaPath)); os.centerView(); os.close(); } diff --git a/DataSpec/DNACommon/ParticleCommon.hpp b/DataSpec/DNACommon/ParticleCommon.hpp index 159cc85fd..f219fe300 100644 --- a/DataSpec/DNACommon/ParticleCommon.hpp +++ b/DataSpec/DNACommon/ParticleCommon.hpp @@ -45,7 +45,7 @@ struct PPImpl : BigDNA, _Basis { constexpr FourCC RefType = uint32_t(_Basis::Type); DNAFourCC clsId(r); if (clsId != RefType) { - LogModule.report(logvisor::Warning, fmt("non {} provided to {} parser"), RefType, RefType); + LogModule.report(logvisor::Warning, FMT_STRING("non {} provided to {} parser"), RefType, RefType); return; } clsId.read(r); @@ -68,7 +68,7 @@ struct PPImpl : BigDNA, _Basis { p.read(r); } })) { - LogModule.report(logvisor::Fatal, fmt("Unknown {} class {} @{}"), RefType, clsId, r.position()); + LogModule.report(logvisor::Fatal, FMT_STRING("Unknown {} class {} @{}"), RefType, clsId, r.position()); } clsId.read(r); } @@ -124,7 +124,7 @@ struct PPImpl : BigDNA, _Basis { if (key == "DNAType"sv) continue; if (key.size() < 4) { - LogModule.report(logvisor::Warning, fmt("short FourCC in element '{}'"), key); + LogModule.report(logvisor::Warning, FMT_STRING("short FourCC in element '{}'"), key); continue; } @@ -142,7 +142,7 @@ struct PPImpl : BigDNA, _Basis { p.read(r); } })) { - LogModule.report(logvisor::Fatal, fmt("Unknown {} class {}"), RefType, clsId); + LogModule.report(logvisor::Fatal, FMT_STRING("Unknown {} class {}"), RefType, clsId); } } } @@ -201,7 +201,7 @@ struct PEImpl : BigDNA { m_elem = std::make_unique(); m_elem->read(r); })) { - LogModule.report(logvisor::Fatal, fmt("Unknown {} class {} @{}"), _PtrType::TypeName, clsId, r.position()); + LogModule.report(logvisor::Fatal, FMT_STRING("Unknown {} class {} @{}"), _PtrType::TypeName, clsId, r.position()); } } @@ -229,7 +229,7 @@ struct PEImpl : BigDNA { const auto& [key, value] = mapChildren[0]; if (key.size() < 4) - LogModule.report(logvisor::Fatal, fmt("short FourCC in element '{}'"), key); + LogModule.report(logvisor::Fatal, FMT_STRING("short FourCC in element '{}'"), key); if (auto rec = r.enterSubRecord(key)) { const DNAFourCC clsId = key.c_str(); @@ -238,7 +238,7 @@ struct PEImpl : BigDNA { m_elem = std::make_unique(); m_elem->read(r); })) { - LogModule.report(logvisor::Fatal, fmt("Unknown {} class {}"), _PtrType::TypeName, clsId); + LogModule.report(logvisor::Fatal, FMT_STRING("Unknown {} class {}"), _PtrType::TypeName, clsId); } } } diff --git a/DataSpec/DNACommon/STRG.cpp b/DataSpec/DNACommon/STRG.cpp index d49339bee..868f808b0 100644 --- a/DataSpec/DNACommon/STRG.cpp +++ b/DataSpec/DNACommon/STRG.cpp @@ -13,7 +13,7 @@ void ISTRG::gatherDependencies(std::vector& pathsOut) const { std::unique_ptr LoadSTRG(athena::io::IStreamReader& reader) { uint32_t magic = reader.readUint32Big(); if (magic != 0x87654321) { - LogDNACommon.report(logvisor::Error, fmt("invalid STRG magic")); + LogDNACommon.report(logvisor::Error, FMT_STRING("invalid STRG magic")); return std::unique_ptr(); } diff --git a/DataSpec/DNACommon/TXTR.cpp b/DataSpec/DNACommon/TXTR.cpp index 413b6f0ba..815164cc2 100644 --- a/DataSpec/DNACommon/TXTR.cpp +++ b/DataSpec/DNACommon/TXTR.cpp @@ -826,9 +826,9 @@ static void EncodeCMPR(const uint8_t* rgbaIn, uint8_t* texels, int width, int he } } -static void PNGErr(png_structp png, png_const_charp msg) { Log.report(logvisor::Error, fmt("{}"), msg); } +static void PNGErr(png_structp png, png_const_charp msg) { Log.report(logvisor::Error, FMT_STRING("{}"), msg); } -static void PNGWarn(png_structp png, png_const_charp msg) { Log.report(logvisor::Warning, fmt("{}"), msg); } +static void PNGWarn(png_structp png, png_const_charp msg) { Log.report(logvisor::Warning, FMT_STRING("{}"), msg); } bool TXTR::Extract(PAKEntryReadStream& rs, const hecl::ProjectPath& outPath) { const uint32_t format = rs.readUint32Big(); @@ -838,7 +838,7 @@ bool TXTR::Extract(PAKEntryReadStream& rs, const hecl::ProjectPath& outPath) { auto fp = hecl::FopenUnique(outPath.getAbsolutePath().data(), _SYS_STR("wb")); if (fp == nullptr) { - Log.report(logvisor::Error, fmt(_SYS_STR("Unable to open '{}' for writing")), outPath.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("Unable to open '{}' for writing")), outPath.getAbsolutePath()); return false; } png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, PNGErr, PNGWarn); @@ -1041,7 +1041,7 @@ static int GetNumPaletteEntriesForGCN(png_structp png, png_infop info) { bool TXTR::Cook(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outPath) { auto inf = hecl::FopenUnique(inPath.getAbsolutePath().data(), _SYS_STR("rb")); if (inf == nullptr) { - Log.report(logvisor::Error, fmt(_SYS_STR("Unable to open '{}' for reading")), inPath.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("Unable to open '{}' for reading")), inPath.getAbsolutePath()); return false; } @@ -1049,25 +1049,25 @@ bool TXTR::Cook(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outPat char header[8]; std::fread(header, 1, sizeof(header), inf.get()); if (png_sig_cmp((png_const_bytep)header, 0, 8)) { - Log.report(logvisor::Error, fmt(_SYS_STR("invalid PNG signature in '{}'")), inPath.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("invalid PNG signature in '{}'")), inPath.getAbsolutePath()); return false; } /* Setup PNG reader */ png_structp pngRead = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); if (!pngRead) { - Log.report(logvisor::Error, fmt("unable to initialize libpng")); + Log.report(logvisor::Error, FMT_STRING("unable to initialize libpng")); return false; } png_infop info = png_create_info_struct(pngRead); if (!info) { - Log.report(logvisor::Error, fmt("unable to initialize libpng info")); + Log.report(logvisor::Error, FMT_STRING("unable to initialize libpng info")); png_destroy_read_struct(&pngRead, nullptr, nullptr); return false; } if (setjmp(png_jmpbuf(pngRead))) { - Log.report(logvisor::Error, fmt(_SYS_STR("unable to initialize libpng I/O for '{}'")), inPath.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("unable to initialize libpng I/O for '{}'")), inPath.getAbsolutePath()); png_destroy_read_struct(&pngRead, &info, nullptr); return false; } @@ -1083,7 +1083,7 @@ bool TXTR::Cook(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outPat const png_byte bitDepth = png_get_bit_depth(pngRead, info); if (width < 4 || height < 4) { - Log.report(logvisor::Error, fmt("image must be 4x4 or larger")); + Log.report(logvisor::Error, FMT_STRING("image must be 4x4 or larger")); png_destroy_read_struct(&pngRead, &info, nullptr); return false; } @@ -1112,7 +1112,7 @@ bool TXTR::Cook(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outPat } if (bitDepth != 8) { - Log.report(logvisor::Error, fmt(_SYS_STR("'{}' is not 8 bits-per-channel")), inPath.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("'{}' is not 8 bits-per-channel")), inPath.getAbsolutePath()); png_destroy_read_struct(&pngRead, &info, nullptr); return false; } @@ -1143,7 +1143,7 @@ bool TXTR::Cook(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outPat nComps = 1; break; default: - Log.report(logvisor::Error, fmt(_SYS_STR("unsupported color type in '{}'")), inPath.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("unsupported color type in '{}'")), inPath.getAbsolutePath()); png_destroy_read_struct(&pngRead, &info, nullptr); return false; } @@ -1163,7 +1163,7 @@ bool TXTR::Cook(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outPat bufOut.reset(new uint8_t[bufLen]); if (setjmp(png_jmpbuf(pngRead))) { - Log.report(logvisor::Fatal, fmt(_SYS_STR("unable to read image in '{}'")), inPath.getAbsolutePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("unable to read image in '{}'")), inPath.getAbsolutePath()); png_destroy_read_struct(&pngRead, &info, nullptr); return false; } @@ -1344,7 +1344,7 @@ bool TXTR::Cook(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outPat /* Do write out */ athena::io::FileWriter outf(outPath.getAbsolutePath(), true, false); if (outf.hasError()) { - Log.report(logvisor::Error, fmt(_SYS_STR("Unable to open '{}' for writing")), outPath.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("Unable to open '{}' for writing")), outPath.getAbsolutePath()); return false; } @@ -1360,7 +1360,7 @@ bool TXTR::Cook(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outPat bool TXTR::CookPC(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outPath) { auto inf = hecl::FopenUnique(inPath.getAbsolutePath().data(), _SYS_STR("rb")); if (inf == nullptr) { - Log.report(logvisor::Error, fmt(_SYS_STR("Unable to open '{}' for reading")), inPath.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("Unable to open '{}' for reading")), inPath.getAbsolutePath()); return false; } @@ -1368,25 +1368,25 @@ bool TXTR::CookPC(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outP char header[8]; std::fread(header, 1, sizeof(header), inf.get()); if (png_sig_cmp((png_const_bytep)header, 0, 8)) { - Log.report(logvisor::Error, fmt(_SYS_STR("invalid PNG signature in '{}'")), inPath.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("invalid PNG signature in '{}'")), inPath.getAbsolutePath()); return false; } /* Setup PNG reader */ png_structp pngRead = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); if (!pngRead) { - Log.report(logvisor::Error, fmt("unable to initialize libpng")); + Log.report(logvisor::Error, FMT_STRING("unable to initialize libpng")); return false; } png_infop info = png_create_info_struct(pngRead); if (!info) { - Log.report(logvisor::Error, fmt("unable to initialize libpng info")); + Log.report(logvisor::Error, FMT_STRING("unable to initialize libpng info")); png_destroy_read_struct(&pngRead, nullptr, nullptr); return false; } if (setjmp(png_jmpbuf(pngRead))) { - Log.report(logvisor::Error, fmt(_SYS_STR("unable to initialize libpng I/O for '{}'")), inPath.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("unable to initialize libpng I/O for '{}'")), inPath.getAbsolutePath()); png_destroy_read_struct(&pngRead, &info, nullptr); return false; } @@ -1425,7 +1425,7 @@ bool TXTR::CookPC(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outP } if (bitDepth != 8) { - Log.report(logvisor::Error, fmt(_SYS_STR("'{}' is not 8 bits-per-channel")), inPath.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("'{}' is not 8 bits-per-channel")), inPath.getAbsolutePath()); png_destroy_read_struct(&pngRead, &info, nullptr); return false; } @@ -1454,7 +1454,7 @@ bool TXTR::CookPC(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outP paletteBuf = ReadPalette(pngRead, info, paletteSize); break; default: - Log.report(logvisor::Error, fmt(_SYS_STR("unsupported color type in '{}'")), inPath.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("unsupported color type in '{}'")), inPath.getAbsolutePath()); png_destroy_read_struct(&pngRead, &info, nullptr); return false; } @@ -1472,7 +1472,7 @@ bool TXTR::CookPC(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outP bufOut.reset(new uint8_t[bufLen]); if (setjmp(png_jmpbuf(pngRead))) { - Log.report(logvisor::Fatal, fmt(_SYS_STR("unable to read image in '{}'")), inPath.getAbsolutePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("unable to read image in '{}'")), inPath.getAbsolutePath()); png_destroy_read_struct(&pngRead, &info, nullptr); return false; } @@ -1593,7 +1593,7 @@ bool TXTR::CookPC(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outP /* Do write out */ athena::io::FileWriter outf(outPath.getAbsolutePath(), true, false); if (outf.hasError()) { - Log.report(logvisor::Error, fmt(_SYS_STR("Unable to open '{}' for writing")), outPath.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("Unable to open '{}' for writing")), outPath.getAbsolutePath()); return false; } diff --git a/DataSpec/DNAMP1/ANCS.cpp b/DataSpec/DNAMP1/ANCS.cpp index 3a9337759..e3c67b451 100644 --- a/DataSpec/DNAMP1/ANCS.cpp +++ b/DataSpec/DNAMP1/ANCS.cpp @@ -988,19 +988,19 @@ bool ANCS::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat /* Search for yaml */ hecl::ProjectPath yamlPath = inPath.getWithExtension(_SYS_STR(".yaml"), true); if (!yamlPath.isFile()) - Log.report(logvisor::Fatal, fmt(_SYS_STR("'{}' not found as file")), yamlPath.getRelativePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("'{}' not found as file")), yamlPath.getRelativePath()); athena::io::FileReader reader(yamlPath.getAbsolutePath()); if (!reader.isOpen()) - Log.report(logvisor::Fatal, fmt(_SYS_STR("can't open '{}' for reading")), yamlPath.getRelativePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("can't open '{}' for reading")), yamlPath.getRelativePath()); if (!athena::io::ValidateFromYAMLStream(reader)) { - Log.report(logvisor::Fatal, fmt(_SYS_STR("'{}' is not urde::DNAMP1::ANCS type")), yamlPath.getRelativePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("'{}' is not urde::DNAMP1::ANCS type")), yamlPath.getRelativePath()); } athena::io::YAMLDocReader yamlReader; if (!yamlReader.parse(&reader)) { - Log.report(logvisor::Fatal, fmt(_SYS_STR("unable to parse '{}'")), yamlPath.getRelativePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("unable to parse '{}'")), yamlPath.getRelativePath()); } ANCS ancs; ancs.read(yamlReader); @@ -1020,9 +1020,9 @@ bool ANCS::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat hecl::SystemStringConv chSysName(ch.name); if (!sub.cskrId.empty()) { hecl::SystemStringConv cskrSysName(sub.cskrId); - ch.cskr = inPath.ensureAuxInfo(fmt::format(fmt(_SYS_STR("{}_{}.CSKR")), chSysName, cskrSysName)); + ch.cskr = inPath.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}_{}.CSKR")), chSysName, cskrSysName)); } else { - ch.cskr = inPath.ensureAuxInfo(fmt::format(fmt(_SYS_STR("{}.CSKR")), chSysName)); + ch.cskr = inPath.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}.CSKR")), chSysName)); } /* Add subtype AABBs */ @@ -1048,10 +1048,10 @@ bool ANCS::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat if (!search->cskrId.empty()) { hecl::SystemStringConv cskrSys(search->cskrId); ch.cskrIce = inPath.ensureAuxInfo( - fmt::format(fmt(_SYS_STR("{}.{}_{}.CSKR")), chSysName, overlaySys, cskrSys)); + fmt::format(FMT_STRING(_SYS_STR("{}.{}_{}.CSKR")), chSysName, overlaySys, cskrSys)); } else { ch.cskrIce = inPath.ensureAuxInfo( - fmt::format(fmt(_SYS_STR("{}.{}.CSKR")), chSysName, overlaySys)); + fmt::format(FMT_STRING(_SYS_STR("{}.{}.CSKR")), chSysName, overlaySys)); } } } @@ -1074,9 +1074,9 @@ bool ANCS::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat hecl::ProjectPath pathOut; if (!act.animId.empty()) { hecl::SystemStringConv idSys(act.animId); - pathOut = inPath.ensureAuxInfo(fmt::format(fmt(_SYS_STR("{}_{}.ANIM")), sysStr, idSys)); + pathOut = inPath.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}_{}.ANIM")), sysStr, idSys)); } else { - inPath.ensureAuxInfo(fmt::format(fmt(_SYS_STR("{}.ANIM")), sysStr)); + inPath.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}.ANIM")), sysStr)); } prim.animId = pathOut; break; @@ -1093,9 +1093,9 @@ bool ANCS::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat hecl::ProjectPath pathOut; if (!act.animId.empty()) { hecl::SystemStringConv animIdSys(act.animId); - pathOut = inPath.ensureAuxInfo(fmt::format(fmt(_SYS_STR("{}_{}.ANIM")), sysStr, animIdSys)); + pathOut = inPath.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}_{}.ANIM")), sysStr, animIdSys)); } else { - pathOut = inPath.ensureAuxInfo(fmt::format(fmt(_SYS_STR("{}.ANIM")), sysStr)); + pathOut = inPath.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}.ANIM")), sysStr)); } ancs.animationSet.animResources.emplace_back(); @@ -1103,7 +1103,7 @@ bool ANCS::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat /* Check for associated EVNT YAML */ hecl::SystemString testPrefix(inPath.getWithExtension( - fmt::format(fmt(_SYS_STR(".{}_")), sysStr).c_str(), true).getLastComponent()); + fmt::format(FMT_STRING(_SYS_STR(".{}_")), sysStr).c_str(), true).getLastComponent()); hecl::ProjectPath evntYamlPath; for (const auto& ent : dEnum) { if (hecl::StringUtils::BeginsWith(ent.m_name, testPrefix.c_str()) && @@ -1163,7 +1163,7 @@ bool ANCS::CookCSKR(const hecl::ProjectPath& outPath, const hecl::ProjectPath& i } } if (!subtype) - Log.report(logvisor::Fatal, fmt(_SYS_STR("unable to find subtype '{}'")), subName); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("unable to find subtype '{}'")), subName); } const hecl::ProjectPath* modelPath = nullptr; @@ -1176,7 +1176,7 @@ bool ANCS::CookCSKR(const hecl::ProjectPath& outPath, const hecl::ProjectPath& i } } if (!attachment) - Log.report(logvisor::Fatal, fmt(_SYS_STR("unable to find attachment '{}'")), overName); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("unable to find attachment '{}'")), overName); modelPath = &attachment->mesh; } else if (overName.empty()) { modelPath = &subtype->mesh; @@ -1188,15 +1188,15 @@ bool ANCS::CookCSKR(const hecl::ProjectPath& outPath, const hecl::ProjectPath& i } } if (!modelPath) - Log.report(logvisor::Fatal, fmt(_SYS_STR("unable to resolve model path of {}:{}")), subName, overName); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("unable to resolve model path of {}:{}")), subName, overName); if (!modelPath->isFile()) - Log.report(logvisor::Fatal, fmt(_SYS_STR("unable to resolve '{}'")), modelPath->getRelativePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("unable to resolve '{}'")), modelPath->getRelativePath()); hecl::ProjectPath skinIntPath = modelPath->getCookedPath(SpecEntMP1).getWithExtension(_SYS_STR(".skinint")); if (!skinIntPath.isFileOrGlob() || skinIntPath.getModtime() < modelPath->getModtime()) if (!modelCookFunc(*modelPath)) - Log.report(logvisor::Fatal, fmt(_SYS_STR("unable to cook '{}'")), modelPath->getRelativePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("unable to cook '{}'")), modelPath->getRelativePath()); std::vector>, uint32_t>> skins; uint32_t posCount = 0; @@ -1221,7 +1221,7 @@ bool ANCS::CookCSKR(const hecl::ProjectPath& outPath, const hecl::ProjectPath& i const std::string& name = boneNames[bIdx]; auto search = boneIdMap.find(name); if (search == boneIdMap.cend()) - Log.report(logvisor::Fatal, fmt("unable to find bone '{}' in {}"), name, + Log.report(logvisor::Fatal, FMT_STRING("unable to find bone '{}' in {}"), name, inPath.getRelativePathUTF8()); virtualBone.first.emplace_back(search->second, weight); } @@ -1287,7 +1287,7 @@ bool ANCS::CookCSKRPC(const hecl::ProjectPath& outPath, const hecl::ProjectPath& } } if (!subtype) - Log.report(logvisor::Fatal, fmt(_SYS_STR("unable to find subtype '{}'")), subName); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("unable to find subtype '{}'")), subName); } const hecl::ProjectPath* modelPath = nullptr; @@ -1300,7 +1300,7 @@ bool ANCS::CookCSKRPC(const hecl::ProjectPath& outPath, const hecl::ProjectPath& } } if (!attachment) - Log.report(logvisor::Fatal, fmt(_SYS_STR("unable to find attachment '{}'")), overName); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("unable to find attachment '{}'")), overName); modelPath = &attachment->mesh; } else if (overName.empty()) { modelPath = &subtype->mesh; @@ -1312,15 +1312,15 @@ bool ANCS::CookCSKRPC(const hecl::ProjectPath& outPath, const hecl::ProjectPath& } } if (!modelPath) - Log.report(logvisor::Fatal, fmt(_SYS_STR("unable to resolve model path of {}:{}")), subName, overName); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("unable to resolve model path of {}:{}")), subName, overName); if (!modelPath->isFile()) - Log.report(logvisor::Fatal, fmt(_SYS_STR("unable to resolve '{}'")), modelPath->getRelativePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("unable to resolve '{}'")), modelPath->getRelativePath()); hecl::ProjectPath skinIntPath = modelPath->getCookedPath(SpecEntMP1PC).getWithExtension(_SYS_STR(".skinint")); if (!skinIntPath.isFileOrGlob() || skinIntPath.getModtime() < modelPath->getModtime()) if (!modelCookFunc(*modelPath)) - Log.report(logvisor::Fatal, fmt(_SYS_STR("unable to cook '{}'")), modelPath->getRelativePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("unable to cook '{}'")), modelPath->getRelativePath()); uint32_t bankCount = 0; std::vector> skinBanks; @@ -1360,7 +1360,7 @@ bool ANCS::CookCSKRPC(const hecl::ProjectPath& outPath, const hecl::ProjectPath& const std::string& name = boneNames[bIdx]; auto search = boneIdMap.find(name); if (search == boneIdMap.cend()) - Log.report(logvisor::Fatal, fmt("unable to find bone '{}' in {}"), name, + Log.report(logvisor::Fatal, FMT_STRING("unable to find bone '{}' in {}"), name, inPath.getRelativePathUTF8()); virtualBone.emplace_back(search->second, weight); } @@ -1381,7 +1381,7 @@ bool ANCS::CookCSKRPC(const hecl::ProjectPath& outPath, const hecl::ProjectPath& const std::string& name = boneNames[bIdx]; auto search = boneIdMap.find(name); if (search == boneIdMap.cend()) - Log.report(logvisor::Fatal, fmt("unable to find bone '{}' in {}"), name, + Log.report(logvisor::Fatal, FMT_STRING("unable to find bone '{}' in {}"), name, inPath.getRelativePathUTF8()); skinOut.writeUint32Big(search->second); } @@ -1420,7 +1420,7 @@ bool ANCS::CookANIM(const hecl::ProjectPath& outPath, const hecl::ProjectPath& i DNAANCS::Action action = ds.compileActionChannelsOnly(actNameView.str()); if (!actor.armatures.size()) - Log.report(logvisor::Fatal, fmt(_SYS_STR("0 armatures in {}")), inPath.getRelativePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("0 armatures in {}")), inPath.getRelativePath()); /* Build bone ID map */ std::unordered_map boneIdMap; @@ -1440,7 +1440,7 @@ bool ANCS::CookANIM(const hecl::ProjectPath& outPath, const hecl::ProjectPath& i /* Check for associated EVNT YAML */ hecl::SystemString testPrefix(inPath.getWithExtension( - fmt::format(fmt(_SYS_STR(".{}_")), actName).c_str(), true).getLastComponent()); + fmt::format(FMT_STRING(_SYS_STR(".{}_")), actName).c_str(), true).getLastComponent()); hecl::ProjectPath evntYamlPath; for (const auto& ent : hecl::DirectoryEnumerator(inPath.getParentPath().getAbsolutePath())) { if (hecl::StringUtils::BeginsWith(ent.m_name, testPrefix.c_str()) && diff --git a/DataSpec/DNAMP1/ANIM.cpp b/DataSpec/DNAMP1/ANIM.cpp index 0fce2c36a..b00bb3988 100644 --- a/DataSpec/DNAMP1/ANIM.cpp +++ b/DataSpec/DNAMP1/ANIM.cpp @@ -7,7 +7,7 @@ namespace DataSpec::DNAMP1 { using ANIMOutStream = hecl::blender::ANIMOutStream; void ANIM::IANIM::sendANIMToBlender(hecl::blender::PyOutStream& os, const DNAANIM::RigInverter& rig) const { - os.format(fmt( + os.format(FMT_STRING( "act.hecl_fps = round({})\n" "act.hecl_looping = {}\n"), (1.0f / mainInterval), looping ? "True" : "False"); @@ -26,7 +26,7 @@ void ANIM::IANIM::sendANIMToBlender(hecl::blender::PyOutStream& os, const DNAANI continue; } - os.format(fmt("bone_string = '{}'\n"), *bName); + os.format(FMT_STRING("bone_string = '{}'\n"), *bName); os << "action_group = act.groups.new(bone_string)\n" "\n" "rotCurves = []\n" @@ -111,7 +111,7 @@ UniqueID32 ANIM::GetEVNTId(athena::io::IStreamReader& reader) { reader.seek(4); return reader.readUint32Big(); default: - Log.report(logvisor::Error, fmt("unrecognized ANIM version")); + Log.report(logvisor::Error, FMT_STRING("unrecognized ANIM version")); break; } return {}; @@ -134,7 +134,7 @@ void ANIM::Enumerate(typename Read::StreamT& reader) { m_anim->read(reader); break; default: - Log.report(logvisor::Error, fmt("unrecognized ANIM version")); + Log.report(logvisor::Error, FMT_STRING("unrecognized ANIM version")); break; } } @@ -559,7 +559,7 @@ ANIM::ANIM(const BlenderAction& act, const std::unordered_mapsecond) != addedBones.cend()) diff --git a/DataSpec/DNAMP1/ANIM.hpp b/DataSpec/DNAMP1/ANIM.hpp index d6a771d73..e1dda6619 100644 --- a/DataSpec/DNAMP1/ANIM.hpp +++ b/DataSpec/DNAMP1/ANIM.hpp @@ -192,7 +192,7 @@ struct ANIM : BigDNA { if (m_anim->evnt.isValid()) { hecl::SystemStringConv sysStr(animInfo.name); hecl::ProjectPath evntYamlPath = outPath.getWithExtension( - fmt::format(fmt(_SYS_STR(".{}_{}.evnt.yaml")), sysStr, m_anim->evnt).c_str(), true); + fmt::format(FMT_STRING(_SYS_STR(".{}_{}.evnt.yaml")), sysStr, m_anim->evnt).c_str(), true); hecl::ProjectPath::Type evntYamlType = evntYamlPath.getPathType(); if (force || evntYamlType == hecl::ProjectPath::Type::None) { diff --git a/DataSpec/DNAMP1/CINF.cpp b/DataSpec/DNAMP1/CINF.cpp index 974f26d10..9eec50834 100644 --- a/DataSpec/DNAMP1/CINF.cpp +++ b/DataSpec/DNAMP1/CINF.cpp @@ -34,7 +34,7 @@ void CINF::sendVertexGroupsToBlender(hecl::blender::PyOutStream& os) const { for (atUint32 bid : boneIds) { for (const Name& name : names) { if (name.boneId == bid) { - os.format(fmt("obj.vertex_groups.new(name='{}')\n"), name.name); + os.format(FMT_STRING("obj.vertex_groups.new(name='{}')\n"), name.name); break; } } @@ -44,7 +44,7 @@ void CINF::sendVertexGroupsToBlender(hecl::blender::PyOutStream& os) const { void CINF::sendCINFToBlender(hecl::blender::PyOutStream& os, const UniqueID32& cinfId) const { DNAANIM::RigInverter inverter(*this); - os.format(fmt( + os.format(FMT_STRING( "arm = bpy.data.armatures.new('CINF_{}')\n" "arm_obj = bpy.data.objects.new(arm.name, arm)\n" "bpy.context.scene.collection.objects.link(arm_obj)\n" @@ -56,7 +56,7 @@ void CINF::sendCINFToBlender(hecl::blender::PyOutStream& os, const UniqueID32& c for (const DNAANIM::RigInverter::Bone& bone : inverter.getBones()) { zeus::simd_floats originF(bone.m_origBone.origin.simd); zeus::simd_floats tailF(bone.m_tail.mSimd); - os.format(fmt( + os.format(FMT_STRING( "bone = arm.edit_bones.new('{}')\n" "bone.head = ({},{},{})\n" "bone.tail = ({},{},{})\n" @@ -68,16 +68,16 @@ void CINF::sendCINFToBlender(hecl::blender::PyOutStream& os, const UniqueID32& c for (const Bone& bone : bones) if (bone.parentId != 2) - os.format(fmt("arm_bone_table[{}].parent = arm_bone_table[{}]\n"), bone.id, bone.parentId); + os.format(FMT_STRING("arm_bone_table[{}].parent = arm_bone_table[{}]\n"), bone.id, bone.parentId); os << "bpy.ops.object.mode_set(mode='OBJECT')\n"; for (const DNAANIM::RigInverter::Bone& bone : inverter.getBones()) - os.format(fmt("arm_obj.pose.bones['{}'].rotation_mode = 'QUATERNION'\n"), + os.format(FMT_STRING("arm_obj.pose.bones['{}'].rotation_mode = 'QUATERNION'\n"), *getBoneNameFromId(bone.m_origBone.id)); } -std::string CINF::GetCINFArmatureName(const UniqueID32& cinfId) { return fmt::format(fmt("CINF_{}"), cinfId); } +std::string CINF::GetCINFArmatureName(const UniqueID32& cinfId) { return fmt::format(FMT_STRING("CINF_{}"), cinfId); } int CINF::RecursiveAddArmatureBone(const Armature& armature, const BlenderBone* bone, int parent, int& curId, std::unordered_map& idMap, @@ -167,7 +167,7 @@ bool CINF::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: return false; auto os = conn.beginPythonOut(true); - os.format(fmt("import bpy\n" + os.format(FMT_STRING("import bpy\n" "from mathutils import Vector\n" "bpy.context.scene.name = 'CINF_{}'\n" "bpy.context.scene.hecl_arm_obj = bpy.context.scene.name\n" diff --git a/DataSpec/DNAMP1/CMDLMaterials.cpp b/DataSpec/DNAMP1/CMDLMaterials.cpp index 3e51255b6..e8d0babd4 100644 --- a/DataSpec/DNAMP1/CMDLMaterials.cpp +++ b/DataSpec/DNAMP1/CMDLMaterials.cpp @@ -26,7 +26,7 @@ void Material::AddTexture(Stream& out, GX::TexGenSrc type, int mtxIdx, uint32_t if (mtxIdx == -1) mtxLabel = "IDENTITY"; else - mtxLabel = fmt::format(fmt("MTX_{}"), mtxIdx); + mtxLabel = fmt::format(FMT_STRING("MTX_{}"), mtxIdx); std::string texLabel; if (diffuse) @@ -34,14 +34,14 @@ void Material::AddTexture(Stream& out, GX::TexGenSrc type, int mtxIdx, uint32_t else texLabel = "Texture"; - out.format(fmt("# Texture\n" + out.format(FMT_STRING("# Texture\n" "tex_node = new_nodetree.nodes.new('ShaderNodeTexImage')\n" "tex_node.label = '{} {}'\n" "texture_nodes.append(tex_node)\n"), texLabel, texIdx); if (texIdx != 0xff) - out.format(fmt("tex_node.image = tex_maps[{}]\n"), texIdx); + out.format(FMT_STRING("tex_node.image = tex_maps[{}]\n"), texIdx); if (type == GX::TG_POS) out << "tex_uv_node = new_nodetree.nodes.new('ShaderNodeTexCoord')\n" @@ -51,13 +51,13 @@ void Material::AddTexture(Stream& out, GX::TexGenSrc type, int mtxIdx, uint32_t "tex_links.append(new_nodetree.links.new(tex_uv_node.outputs['Normal'], tex_node.inputs['Vector']))\n"; else if (type >= GX::TG_TEX0 && type <= GX::TG_TEX7) { uint8_t texIdx = type - GX::TG_TEX0; - out.format(fmt("tex_uv_node = new_nodetree.nodes.new('ShaderNodeUVMap')\n" + out.format(FMT_STRING("tex_uv_node = new_nodetree.nodes.new('ShaderNodeUVMap')\n" "tex_links.append(new_nodetree.links.new(tex_uv_node.outputs['UV'], tex_node.inputs['Vector']))\n" "tex_uv_node.uv_map = 'UV_{}'\n"), texIdx); } - out.format(fmt("tex_uv_node.label = '{}'\n"), mtxLabel); + out.format(FMT_STRING("tex_uv_node.label = '{}'\n"), mtxLabel); out << "gridder.place_node(tex_uv_node, 0)\n" "gridder.place_node(tex_node, 0)\n" @@ -70,7 +70,7 @@ void Material::AddTexture(Stream& out, GX::TexGenSrc type, int mtxIdx, uint32_t void Material::AddTextureAnim(Stream& out, UVAnimation::Mode type, unsigned idx, const float* vals) { switch (type) { case UVAnimation::Mode::MvInvNoTranslation: - out.format(fmt("for link in list(tex_links):\n" + out.format(FMT_STRING("for link in list(tex_links):\n" " if link.from_node.label == 'MTX_{}':\n" " tex_links.remove(link)\n" " soc_from = link.from_socket\n" @@ -85,7 +85,7 @@ void Material::AddTextureAnim(Stream& out, UVAnimation::Mode type, unsigned idx, idx); break; case UVAnimation::Mode::MvInv: - out.format(fmt("for link in list(tex_links):\n" + out.format(FMT_STRING("for link in list(tex_links):\n" " if link.from_node.label == 'MTX_{}':\n" " tex_links.remove(link)\n" " soc_from = link.from_socket\n" @@ -100,7 +100,7 @@ void Material::AddTextureAnim(Stream& out, UVAnimation::Mode type, unsigned idx, idx); break; case UVAnimation::Mode::Scroll: - out.format(fmt("for link in list(tex_links):\n" + out.format(FMT_STRING("for link in list(tex_links):\n" " if link.from_node.label == 'MTX_{}':\n" " tex_links.remove(link)\n" " soc_from = link.from_socket\n" @@ -117,7 +117,7 @@ void Material::AddTextureAnim(Stream& out, UVAnimation::Mode type, unsigned idx, idx, vals[0], vals[1], vals[2], vals[3]); break; case UVAnimation::Mode::Rotation: - out.format(fmt("for link in list(tex_links):\n" + out.format(FMT_STRING("for link in list(tex_links):\n" " if link.from_node.label == 'MTX_{}':\n" " tex_links.remove(link)\n" " soc_from = link.from_socket\n" @@ -134,7 +134,7 @@ void Material::AddTextureAnim(Stream& out, UVAnimation::Mode type, unsigned idx, idx, vals[0], vals[1]); break; case UVAnimation::Mode::HStrip: - out.format(fmt("for link in list(tex_links):\n" + out.format(FMT_STRING("for link in list(tex_links):\n" " if link.from_node.label == 'MTX_{}':\n" " tex_links.remove(link)\n" " soc_from = link.from_socket\n" @@ -153,7 +153,7 @@ void Material::AddTextureAnim(Stream& out, UVAnimation::Mode type, unsigned idx, idx, vals[0], vals[1], vals[2], vals[3]); break; case UVAnimation::Mode::VStrip: - out.format(fmt("for link in list(tex_links):\n" + out.format(FMT_STRING("for link in list(tex_links):\n" " if link.from_node.label == 'MTX_{}':\n" " tex_links.remove(link)\n" " soc_from = link.from_socket\n" @@ -172,7 +172,7 @@ void Material::AddTextureAnim(Stream& out, UVAnimation::Mode type, unsigned idx, idx, vals[0], vals[1], vals[2], vals[3]); break; case UVAnimation::Mode::Model: - out.format(fmt("for link in list(tex_links):\n" + out.format(FMT_STRING("for link in list(tex_links):\n" " if link.from_node.label == 'MTX_{}':\n" " tex_links.remove(link)\n" " soc_from = link.from_socket\n" @@ -187,7 +187,7 @@ void Material::AddTextureAnim(Stream& out, UVAnimation::Mode type, unsigned idx, idx); break; case UVAnimation::Mode::CylinderEnvironment: - out.format(fmt("for link in list(tex_links):\n" + out.format(FMT_STRING("for link in list(tex_links):\n" " if link.from_node.label == 'MTX_{}':\n" " tex_links.remove(link)\n" " soc_from = link.from_socket\n" @@ -204,7 +204,7 @@ void Material::AddTextureAnim(Stream& out, UVAnimation::Mode type, unsigned idx, idx, vals[0], vals[1]); break; case UVAnimation::Mode::Eight: - out.format(fmt("for link in list(tex_links):\n" + out.format(FMT_STRING("for link in list(tex_links):\n" " if link.from_node.label == 'MTX_{}':\n" " tex_links.remove(link)\n" " soc_from = link.from_socket\n" @@ -233,7 +233,7 @@ void Material::AddTextureAnim(Stream& out, UVAnimation::Mode type, unsigned idx, } void Material::AddKcolor(Stream& out, const GX::Color& col, unsigned idx) { - out.format(fmt("kcolors[{}] = ({}, {}, {}, {})\n" + out.format(FMT_STRING("kcolors[{}] = ({}, {}, {}, {})\n" "kalphas[{}] = {}\n" "\n"), idx, (float)col.color[0] / (float)0xff, (float)col.color[1] / (float)0xff, @@ -343,14 +343,14 @@ template static void _DescribeTEV(const MAT& mat) { for (uint32_t i = 0; i < mat.tevStageCount; ++i) { const auto& stage = mat.tevStages[i]; - fmt::print(stderr, fmt("A:{} B:{} C:{} D:{} -> {} | A:{} B:{} C:{} D:{} -> {}\n"), ToString(stage.colorInA()), + fmt::print(stderr, FMT_STRING("A:{} B:{} C:{} D:{} -> {} | A:{} B:{} C:{} D:{} -> {}\n"), ToString(stage.colorInA()), ToString(stage.colorInB()), ToString(stage.colorInC()), ToString(stage.colorInD()), ToString(stage.colorOpOutReg()), ToString(stage.alphaInA()), ToString(stage.alphaInB()), ToString(stage.alphaInC()), ToString(stage.alphaInD()), ToString(stage.alphaOpOutReg())); } bool hasInd = mat.flags.samusReflectionIndirectTexture(); bool hasLm = mat.flags.lightmap(); - fmt::print(stderr, fmt("HasIndirect: {} HasLightmap: {}\n"), hasInd, hasLm); + fmt::print(stderr, FMT_STRING("HasIndirect: {} HasLightmap: {}\n"), hasInd, hasLm); } struct TexLink { @@ -440,7 +440,7 @@ template static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupIdx, unsigned matIdx) { unsigned i; - out.format(fmt("new_material = bpy.data.materials.new('MAT_{}_{}')\n"), groupIdx, matIdx); + out.format(FMT_STRING("new_material = bpy.data.materials.new('MAT_{}_{}')\n"), groupIdx, matIdx); out << "new_material.use_fake_user = True\n" "new_material.use_nodes = True\n" "new_material.use_backface_culling = True\n" @@ -458,7 +458,7 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI "\n"; /* Material Flags */ - out.format(fmt("new_material.retro_depth_sort = {}\n" + out.format(FMT_STRING("new_material.retro_depth_sort = {}\n" "new_material.retro_alpha_test = {}\n" "new_material.retro_samus_reflection = {}\n" "new_material.retro_depth_write = {}\n" @@ -477,7 +477,7 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI /* Texture Indices */ out << "tex_maps = []\n"; for (atUint32 idx : material.textureIdxs) - out.format(fmt("tex_maps.append(texmap_list[{}])\n"), idx); + out.format(FMT_STRING("tex_maps.append(texmap_list[{}])\n"), idx); /* KColor entries */ if (material.flags.konstValuesEnabled()) { @@ -784,7 +784,7 @@ static void _ConstructMaterial(Stream& out, const MAT& material, unsigned groupI break; default: _DescribeTEV(material); - Log.report(logvisor::Fatal, fmt("Unable to resolve shader hash {:08X}\n"), hash); + Log.report(logvisor::Fatal, FMT_STRING("Unable to resolve shader hash {:08X}\n"), hash); break; } @@ -1132,7 +1132,7 @@ MaterialSet::Material::UVAnimation::UVAnimation(const std::string& gameFunction, else if (gameFunction == "RetroUVMode2Node") { mode = Mode::Scroll; if (gameArgs.size() < 2) - Log.report(logvisor::Fatal, fmt("Mode2 UV anim requires 2 vector arguments")); + Log.report(logvisor::Fatal, FMT_STRING("Mode2 UV anim requires 2 vector arguments")); vals[0] = gameArgs[0].simd[0]; vals[1] = gameArgs[0].simd[1]; vals[2] = gameArgs[1].simd[0]; @@ -1140,13 +1140,13 @@ MaterialSet::Material::UVAnimation::UVAnimation(const std::string& gameFunction, } else if (gameFunction == "RetroUVMode3Node") { mode = Mode::Rotation; if (gameArgs.size() < 2) - Log.report(logvisor::Fatal, fmt("Mode3 UV anim requires 2 arguments")); + Log.report(logvisor::Fatal, FMT_STRING("Mode3 UV anim requires 2 arguments")); vals[0] = gameArgs[0].simd[0]; vals[1] = gameArgs[1].simd[0]; } else if (gameFunction == "RetroUVMode4Node") { mode = Mode::HStrip; if (gameArgs.size() < 4) - Log.report(logvisor::Fatal, fmt("Mode4 UV anim requires 4 arguments")); + Log.report(logvisor::Fatal, FMT_STRING("Mode4 UV anim requires 4 arguments")); vals[0] = gameArgs[0].simd[0]; vals[1] = gameArgs[1].simd[0]; vals[2] = gameArgs[2].simd[0]; @@ -1154,7 +1154,7 @@ MaterialSet::Material::UVAnimation::UVAnimation(const std::string& gameFunction, } else if (gameFunction == "RetroUVMode5Node") { mode = Mode::VStrip; if (gameArgs.size() < 4) - Log.report(logvisor::Fatal, fmt("Mode5 UV anim requires 4 arguments")); + Log.report(logvisor::Fatal, FMT_STRING("Mode5 UV anim requires 4 arguments")); vals[0] = gameArgs[0].simd[0]; vals[1] = gameArgs[1].simd[0]; vals[2] = gameArgs[2].simd[0]; @@ -1164,11 +1164,11 @@ MaterialSet::Material::UVAnimation::UVAnimation(const std::string& gameFunction, else if (gameFunction == "RetroUVMode7NodeN") { mode = Mode::CylinderEnvironment; if (gameArgs.size() < 2) - Log.report(logvisor::Fatal, fmt("Mode7 UV anim requires 2 arguments")); + Log.report(logvisor::Fatal, FMT_STRING("Mode7 UV anim requires 2 arguments")); vals[0] = gameArgs[0].simd[0]; vals[1] = gameArgs[1].simd[0]; } else - Log.report(logvisor::Fatal, fmt("unsupported UV anim '{}'"), gameFunction); + Log.report(logvisor::Fatal, FMT_STRING("unsupported UV anim '{}'"), gameFunction); } template diff --git a/DataSpec/DNAMP1/CMDLMaterials.hpp b/DataSpec/DNAMP1/CMDLMaterials.hpp index 78744e4d3..2a1e3269f 100644 --- a/DataSpec/DNAMP1/CMDLMaterials.hpp +++ b/DataSpec/DNAMP1/CMDLMaterials.hpp @@ -506,9 +506,9 @@ struct MaterialSet : BigDNA { continue; } if (setIdx < 0) - texEntry->name = fmt::format(fmt("{}_{}_{}"), prefix, matIdx, stageIdx); + texEntry->name = fmt::format(FMT_STRING("{}_{}_{}"), prefix, matIdx, stageIdx); else - texEntry->name = fmt::format(fmt("{}_{}_{}_{}"), prefix, setIdx, matIdx, stageIdx); + texEntry->name = fmt::format(FMT_STRING("{}_{}_{}_{}"), prefix, setIdx, matIdx, stageIdx); if (mat.flags.lightmap() && stageIdx == 0) { texEntry->name += "light"; diff --git a/DataSpec/DNAMP1/CSKR.cpp b/DataSpec/DNAMP1/CSKR.cpp index df5139dd9..7c4083a11 100644 --- a/DataSpec/DNAMP1/CSKR.cpp +++ b/DataSpec/DNAMP1/CSKR.cpp @@ -8,7 +8,7 @@ void CSKR::weightVertex(hecl::blender::PyOutStream& os, const CINF& cinf, atUint for (const SkinningRule& rule : skinningRules) { if (idx >= accum && idx < accum + rule.vertCount) for (const SkinningRule::Weight& weight : rule.weights) - os.format(fmt("vert[dvert_lay][{}] = {}\n"), cinf.getBoneIdxFromId(weight.boneId), weight.weight); + os.format(FMT_STRING("vert[dvert_lay][{}] = {}\n"), cinf.getBoneIdxFromId(weight.boneId), weight.weight); accum += rule.vertCount; } } diff --git a/DataSpec/DNAMP1/CSNG.cpp b/DataSpec/DNAMP1/CSNG.cpp index 5138a0d3b..9fb3f2fdc 100644 --- a/DataSpec/DNAMP1/CSNG.cpp +++ b/DataSpec/DNAMP1/CSNG.cpp @@ -44,8 +44,8 @@ bool CSNG::Extract(PAKEntryReadStream& rs, const hecl::ProjectPath& outPath) { r.emplace(songsPath.getAbsolutePath()); athena::io::YAMLDocWriter ydw("amuse::Songs", r ? &*r : nullptr); r = std::nullopt; - ydw.writeString(fmt::format(fmt("{:04X}"), head.midiSetupId), - fmt::format(fmt("../MidiData/{}"), midPath.getLastComponentUTF8())); + ydw.writeString(fmt::format(FMT_STRING("{:04X}"), head.midiSetupId), + fmt::format(FMT_STRING("../MidiData/{}"), midPath.getLastComponentUTF8())); athena::io::FileWriter w(songsPath.getAbsolutePath()); ydw.finish(&w); diff --git a/DataSpec/DNAMP1/DCLN.cpp b/DataSpec/DNAMP1/DCLN.cpp index 8d1496450..383056e8a 100644 --- a/DataSpec/DNAMP1/DCLN.cpp +++ b/DataSpec/DNAMP1/DCLN.cpp @@ -30,7 +30,7 @@ void DCLN::Collision::Node::sendToBlender(hecl::blender::PyOutStream& os) const void DCLN::sendToBlender(hecl::blender::Connection& conn, std::string_view entryName) { /* Open Py Stream and read sections */ hecl::blender::PyOutStream os = conn.beginPythonOut(true); - os.format(fmt( + os.format(FMT_STRING( "import bpy\n" "import bmesh\n" "from mathutils import Vector, Matrix\n" diff --git a/DataSpec/DNAMP1/DNAMP1.cpp b/DataSpec/DNAMP1/DNAMP1.cpp index 386059ff9..631040d25 100644 --- a/DataSpec/DNAMP1/DNAMP1.cpp +++ b/DataSpec/DNAMP1/DNAMP1.cpp @@ -154,7 +154,7 @@ void PAKBridge::build() { std::string idStr = area.areaMREAId.toString(); areaDeps.name = hecl::SystemString(_SYS_STR("MREA_")) + hecl::SystemStringConv(idStr).c_str(); } - hecl::SystemString num = fmt::format(fmt(_SYS_STR("{:02d} ")), ai); + hecl::SystemString num = fmt::format(FMT_STRING(_SYS_STR("{:02d} ")), ai); areaDeps.name = num + areaDeps.name; std::string lowerName(hecl::SystemUTF8Conv(areaDeps.name).str()); @@ -178,7 +178,7 @@ void PAKBridge::build() { layer.active = layerFlags.flags >> (l - 1) & 0x1; layer.name = hecl::StringUtils::TrimWhitespace(layer.name); - num = fmt::format(fmt(_SYS_STR("{:02d} ")), l - 1); + num = fmt::format(FMT_STRING(_SYS_STR("{:02d} ")), l - 1); layer.name = num + layer.name; layer.resources.reserve(area.depLayers[l] - r); @@ -210,35 +210,35 @@ void PAKBridge::addCMDLRigPairs(PAKRouter& pakRouter, CharacterAssoci for (const ANCS::CharacterSet::CharacterInfo& ci : ancs.characterSet.characters) { charAssoc.m_cmdlRigs[ci.cmdl] = {ci.cskr, ci.cinf}; charAssoc.m_cskrToCharacter[ci.cskr] = - std::make_pair(entry.id, fmt::format(fmt("{}_{}.CSKR"), ci.name, ci.cskr)); + std::make_pair(entry.id, fmt::format(FMT_STRING("{}_{}.CSKR"), ci.name, ci.cskr)); PAK::Entry* cmdlEnt = (PAK::Entry*)m_pak.lookupEntry(ci.cmdl); PAK::Entry* cskrEnt = (PAK::Entry*)m_pak.lookupEntry(ci.cskr); PAK::Entry* cinfEnt = (PAK::Entry*)m_pak.lookupEntry(ci.cinf); - cmdlEnt->name = fmt::format(fmt("ANCS_{}_{}_model"), id, ci.name); - cskrEnt->name = fmt::format(fmt("ANCS_{}_{}_skin"), id, ci.name); - cinfEnt->name = fmt::format(fmt("ANCS_{}_{}_skel"), id, ci.name); + cmdlEnt->name = fmt::format(FMT_STRING("ANCS_{}_{}_model"), id, ci.name); + cskrEnt->name = fmt::format(FMT_STRING("ANCS_{}_{}_skin"), id, ci.name); + cinfEnt->name = fmt::format(FMT_STRING("ANCS_{}_{}_skel"), id, ci.name); if (ci.cmdlIce.isValid() && ci.cskrIce.isValid()) { charAssoc.m_cmdlRigs[ci.cmdlIce] = {ci.cskrIce, ci.cinf}; charAssoc.m_cskrToCharacter[ci.cskrIce] = - std::make_pair(entry.id, fmt::format(fmt("{}.ICE_{}.CSKR"), ci.name, ci.cskrIce)); + std::make_pair(entry.id, fmt::format(FMT_STRING("{}.ICE_{}.CSKR"), ci.name, ci.cskrIce)); PAK::Entry* cmdlEnt = (PAK::Entry*)m_pak.lookupEntry(ci.cmdlIce); PAK::Entry* cskrEnt = (PAK::Entry*)m_pak.lookupEntry(ci.cskrIce); - cmdlEnt->name = fmt::format(fmt("ANCS_{}_{}_icemodel"), id, ci.name); - cskrEnt->name = fmt::format(fmt("ANCS_{}_{}_iceskin"), id, ci.name); + cmdlEnt->name = fmt::format(FMT_STRING("ANCS_{}_{}_icemodel"), id, ci.name); + cskrEnt->name = fmt::format(FMT_STRING("ANCS_{}_{}_iceskin"), id, ci.name); } } std::map> animInfo; ancs.getAnimationResInfo(&pakRouter, animInfo); for (auto& [animIdx, animResInfo] : animInfo) { PAK::Entry* animEnt = (PAK::Entry*)m_pak.lookupEntry(animResInfo.animId); - animEnt->name = fmt::format(fmt("ANCS_{}_{}"), id, animResInfo.name); + animEnt->name = fmt::format(FMT_STRING("ANCS_{}_{}"), id, animResInfo.name); charAssoc.m_cskrToCharacter[animResInfo.animId] = - std::make_pair(entry.id, fmt::format(fmt("{}_{}.ANIM"), animResInfo.name, animResInfo.animId)); + std::make_pair(entry.id, fmt::format(FMT_STRING("{}_{}.ANIM"), animResInfo.name, animResInfo.animId)); if (animResInfo.evntId.isValid()) { PAK::Entry* evntEnt = (PAK::Entry*)m_pak.lookupEntry(animResInfo.evntId); - evntEnt->name = fmt::format(fmt("ANCS_{}_{}_evnt"), id, animResInfo.name); + evntEnt->name = fmt::format(FMT_STRING("ANCS_{}_{}_evnt"), id, animResInfo.name); charAssoc.m_cskrToCharacter[animResInfo.evntId] = - std::make_pair(entry.id, fmt::format(fmt("{}_{}.evnt.yaml"), animResInfo.name, animResInfo.evntId)); + std::make_pair(entry.id, fmt::format(FMT_STRING("{}_{}.evnt.yaml"), animResInfo.name, animResInfo.evntId)); } } } else if (entry.type == FOURCC('MREA')) { @@ -276,7 +276,7 @@ void PAKBridge::addMAPATransforms(PAKRouter& pakRouter, if (mlvl.worldNameId.isValid()) pathOverrides[mlvl.worldNameId] = hecl::ProjectPath(mlvlDirPath, - fmt::format(fmt(_SYS_STR("!name_{}.yaml")), mlvl.worldNameId)); + fmt::format(FMT_STRING(_SYS_STR("!name_{}.yaml")), mlvl.worldNameId)); for (const MLVL::Area& area : mlvl.areas) { { @@ -293,7 +293,7 @@ void PAKBridge::addMAPATransforms(PAKRouter& pakRouter, hecl::ProjectPath areaDirPath = pakRouter.getWorking(area.areaMREAId).getParentPath(); if (area.areaNameId.isValid()) pathOverrides[area.areaNameId] = hecl::ProjectPath(areaDirPath, - fmt::format(fmt(_SYS_STR("!name_{}.yaml")), area.areaNameId)); + fmt::format(FMT_STRING(_SYS_STR("!name_{}.yaml")), area.areaNameId)); } if (mlvl.worldMap.isValid()) { diff --git a/DataSpec/DNAMP1/FRME.cpp b/DataSpec/DNAMP1/FRME.cpp index 4fdced531..16b83bbcc 100644 --- a/DataSpec/DNAMP1/FRME.cpp +++ b/DataSpec/DNAMP1/FRME.cpp @@ -93,7 +93,7 @@ void FRME::Widget::Enumerate(athena::io::IStreamReader& __dna_read widgetInfo = std::make_unique(); break; default: - Log.report(logvisor::Fatal, fmt(_SYS_STR("Unsupported FRME widget type {}")), type); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Unsupported FRME widget type {}")), type); } /* widgetInfo */ @@ -174,7 +174,7 @@ void FRME::Widget::CAMRInfo::Enumerate(athena::io::IStreamReader& } else if (projectionType == ProjectionType::Orthographic) { projection = std::make_unique(); } else { - Log.report(logvisor::Fatal, fmt(_SYS_STR("Invalid CAMR projection mode! {}")), int(projectionType)); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Invalid CAMR projection mode! {}")), int(projectionType)); } projection->read(__dna_reader); @@ -183,9 +183,9 @@ void FRME::Widget::CAMRInfo::Enumerate(athena::io::IStreamReader& template <> void FRME::Widget::CAMRInfo::Enumerate(athena::io::IStreamWriter& __dna_writer) { if (!projection) - Log.report(logvisor::Fatal, fmt(_SYS_STR("Invalid CAMR projection object!"))); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Invalid CAMR projection object!"))); if (projection->type != projectionType) - Log.report(logvisor::Fatal, fmt(_SYS_STR("CAMR projection type does not match actual projection type!"))); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("CAMR projection type does not match actual projection type!"))); __dna_writer.writeUint32Big(atUint32(projectionType)); projection->write(__dna_writer); @@ -306,7 +306,7 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: " bpy.context.scene.collection.objects.link(ob_new)\n" " return ob_new\n"; - os.format(fmt( + os.format(FMT_STRING( "bpy.context.scene.name = '{}'\n" "bpy.context.scene.render.resolution_x = 640\n" "bpy.context.scene.render.resolution_y = 480\n" @@ -321,7 +321,7 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: "angle = Quaternion((1.0, 0.0, 0.0), 0)\n"; if (w.type == SBIG('CAMR')) { using CAMRInfo = Widget::CAMRInfo; - os.format(fmt( + os.format(FMT_STRING( "cam = bpy.data.cameras.new(name='{}')\n" "binding = cam\n"), w.header.name); @@ -329,7 +329,7 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: if (info->projectionType == CAMRInfo::ProjectionType::Orthographic) { CAMRInfo::OrthographicProjection* proj = static_cast(info->projection.get()); - os.format(fmt( + os.format(FMT_STRING( "cam.type = 'ORTHO'\n" "cam.ortho_scale = {}\n" "cam.clip_start = {}\n" @@ -337,7 +337,7 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: std::fabs(proj->right - proj->left), proj->znear, proj->zfar); } else if (info->projectionType == CAMRInfo::ProjectionType::Perspective) { CAMRInfo::PerspectiveProjection* proj = static_cast(info->projection.get()); - os.format(fmt( + os.format(FMT_STRING( "cam.type = 'PERSP'\n" "cam.lens_unit = 'FOV'\n" "cam.clip_start = {}\n" @@ -345,10 +345,10 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: "bpy.context.scene.render.resolution_x = 480 * {}\n"), proj->znear, proj->zfar, proj->aspect); if (proj->aspect > 1.f) - os.format(fmt("cam.angle = math.atan2({}, 1.0 / math.tan(math.radians({} / 2.0))) * 2.0\n"), proj->aspect, + os.format(FMT_STRING("cam.angle = math.atan2({}, 1.0 / math.tan(math.radians({} / 2.0))) * 2.0\n"), proj->aspect, proj->fov); else - os.format(fmt("cam.angle = math.radians({})\n"), proj->fov); + os.format(FMT_STRING("cam.angle = math.radians({})\n"), proj->fov); } } os << "angle = Quaternion((1.0, 0.0, 0.0), math.radians(90.0))\n"; @@ -358,7 +358,7 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: switch (info->type) { case LITEInfo::ELightType::LocalAmbient: { zeus::simd_floats colorF(w.header.color.simd); - os.format(fmt( + os.format(FMT_STRING( "bg_node.inputs[0].default_value = ({},{},{},1.0)\n" "bg_node.inputs[1].default_value = {}\n"), colorF[0], colorF[1], colorF[2], info->distQ / 8.0); @@ -370,7 +370,7 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: [[fallthrough]]; default: { zeus::simd_floats colorF(w.header.color.simd); - os.format(fmt( + os.format(FMT_STRING( "lamp = bpy.data.lights.new(name='{}', type='POINT')\n" "lamp.color = ({}, {}, {})\n" "lamp.hecl_falloff_constant = {}\n" @@ -384,7 +384,7 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: w.header.name, colorF[0], colorF[1], colorF[2], info->distC, info->distL, info->distQ, info->angC, info->angL, info->angQ, info->loadedIdx); if (info->type == LITEInfo::ELightType::Spot) - os.format(fmt( + os.format(FMT_STRING( "lamp.type = 'SPOT'\n" "lamp.spot_size = {}\n"), info->cutoff); @@ -413,7 +413,7 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: if (resPath.size()) { hecl::SystemUTF8Conv resPathView(resPath); - os.format(fmt( + os.format(FMT_STRING( "if '{}' in bpy.data.images:\n" " image = bpy.data.images['{}']\n" "else:\n" @@ -424,7 +424,7 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: os << "image = None\n"; } - os.format(fmt( + os.format(FMT_STRING( "material = bpy.data.materials.new('{}')\n" "material.use_nodes = True\n" "new_nodetree = material.node_tree\n" @@ -445,7 +445,7 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: else ti = i; zeus::simd_floats f(info->quadCoords[ti].simd); - os.format(fmt("verts.append(bm.verts.new(({},{},{})))\n"), f[0], f[1], f[2]); + os.format(FMT_STRING("verts.append(bm.verts.new(({},{},{})))\n"), f[0], f[1], f[2]); } os << "bm.faces.new(verts)\n" "bm.loops.layers.uv.new('UV')\n" @@ -459,9 +459,9 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: else ti = i; zeus::simd_floats f(info->uvCoords[ti].simd); - os.format(fmt("bm.verts[{}].link_loops[0][bm.loops.layers.uv[0]].uv = ({},{})\n"), i, f[0], f[1]); + os.format(FMT_STRING("bm.verts[{}].link_loops[0][bm.loops.layers.uv[0]].uv = ({},{})\n"), i, f[0], f[1]); } - os.format(fmt( + os.format(FMT_STRING( "binding = bpy.data.meshes.new('{}')\n" "bm.to_mesh(binding)\n" "bm.free()\n" @@ -471,7 +471,7 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: } zeus::simd_floats colorF(w.header.color.simd); - os.format(fmt( + os.format(FMT_STRING( "frme_obj = bpy.data.objects.new(name='{}', object_data=binding)\n" "frme_obj.pass_index = {}\n" "parentName = '{}'\n" @@ -501,7 +501,7 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: os.linkMesh(modelPath.getAbsolutePathUTF8(), pakRouter.getBestEntryName(*cmdlE)); - os.format(fmt("frme_obj.retro_model_light_mask = {}\n"), info->lightMask); + os.format(FMT_STRING("frme_obj.retro_model_light_mask = {}\n"), info->lightMask); os << "print(obj.name)\n" "copy_obj = duplicateObject(obj)\n" "copy_obj.parent = frme_obj\n" @@ -516,7 +516,7 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: using PANEInfo = Widget::PANEInfo; if (PANEInfo* info = static_cast(w.widgetInfo.get())) { zeus::simd_floats f(info->scaleCenter.simd); - os.format(fmt( + os.format(FMT_STRING( "frme_obj.retro_pane_dimensions = ({},{})\n" "frme_obj.retro_pane_scale_center = ({},{},{})\n"), info->xDim, info->zDim, f[0], f[1], f[2]); @@ -533,7 +533,7 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: zeus::simd_floats fillF(info->fillColor.simd); zeus::simd_floats outlineF(info->outlineColor.simd); zeus::simd_floats extentF(info->blockExtent.simd); - os.format(fmt( + os.format(FMT_STRING( "frme_obj.retro_pane_dimensions = ({},{})\n" "frme_obj.retro_pane_scale_center = ({},{},{})\n" "frme_obj.retro_textpane_font_path = '{}'\n" @@ -557,7 +557,7 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: } else if (w.type == SBIG('TBGP')) { using TBGPInfo = Widget::TBGPInfo; if (TBGPInfo* info = static_cast(w.widgetInfo.get())) { - os.format(fmt( + os.format(FMT_STRING( "frme_obj.retro_tablegroup_elem_count = {}\n" "frme_obj.retro_tablegroup_elem_default = {}\n" "frme_obj.retro_tablegroup_wraparound = {}\n"), @@ -566,12 +566,12 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: } else if (w.type == SBIG('GRUP')) { using GRUPInfo = Widget::GRUPInfo; if (GRUPInfo* info = static_cast(w.widgetInfo.get())) { - os.format(fmt("frme_obj.retro_group_default_worker = {}\n"), info->defaultWorker); + os.format(FMT_STRING("frme_obj.retro_group_default_worker = {}\n"), info->defaultWorker); } } else if (w.type == SBIG('SLGP')) { using SLGPInfo = Widget::SLGPInfo; if (SLGPInfo* info = static_cast(w.widgetInfo.get())) { - os.format(fmt( + os.format(FMT_STRING( "frme_obj.retro_slider_min = {}\n" "frme_obj.retro_slider_max = {}\n" "frme_obj.retro_slider_default = {}\n" @@ -583,12 +583,12 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: if (ENRGInfo* info = static_cast(w.widgetInfo.get())) { hecl::ProjectPath txtrPath = pakRouter.getWorking(info->texture); if (txtrPath) - os.format(fmt("frme_obj.retro_energybar_texture_path = '{}'\n"), txtrPath.getRelativePathUTF8()); + os.format(FMT_STRING("frme_obj.retro_energybar_texture_path = '{}'\n"), txtrPath.getRelativePathUTF8()); } } else if (w.type == SBIG('METR')) { using METRInfo = Widget::METRInfo; if (METRInfo* info = static_cast(w.widgetInfo.get())) { - os.format(fmt( + os.format(FMT_STRING( "frme_obj.retro_meter_no_round_up = {}\n" "frme_obj.retro_meter_max_capacity = {}\n" "frme_obj.retro_meter_worker_count = {}\n"), @@ -600,7 +600,7 @@ bool FRME::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: for (int i = 0; i < 3; ++i) w.basis[i].simd.copy_to(xfMtxF[i]); zeus::simd_floats originF(w.origin.simd); - os.format(fmt( + os.format(FMT_STRING( "mtx = Matrix((({},{},{},{}),({},{},{},{}),({},{},{},{}),(0.0,0.0,0.0,1.0)))\n" "mtxd = mtx.decompose()\n" "frme_obj.rotation_mode = 'QUATERNION'\n" diff --git a/DataSpec/DNAMP1/MLVL.cpp b/DataSpec/DNAMP1/MLVL.cpp index 5e447ea3d..4eb5c1ee4 100644 --- a/DataSpec/DNAMP1/MLVL.cpp +++ b/DataSpec/DNAMP1/MLVL.cpp @@ -137,7 +137,7 @@ bool MLVL::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat if (!areaPath.isFile()) continue; - Log.report(logvisor::Info, fmt(_SYS_STR("Visiting {}")), area.path.getRelativePath()); + Log.report(logvisor::Info, FMT_STRING(_SYS_STR("Visiting {}")), area.path.getRelativePath()); hecl::ProjectPath memRelayPath(area.path, _SYS_STR("!memoryrelays.yaml")); @@ -311,7 +311,7 @@ bool MLVL::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat } if (!areaInit) - Log.report(logvisor::Info, fmt(_SYS_STR("No layer directories for area {}")), area.path.getRelativePath()); + Log.report(logvisor::Info, FMT_STRING(_SYS_STR("No layer directories for area {}")), area.path.getRelativePath()); /* Build deplist */ MLVL::Area& areaOut = mlvl.areas.back(); diff --git a/DataSpec/DNAMP1/MREA.cpp b/DataSpec/DNAMP1/MREA.cpp index 89c9e4f0a..2babb2763 100644 --- a/DataSpec/DNAMP1/MREA.cpp +++ b/DataSpec/DNAMP1/MREA.cpp @@ -20,7 +20,7 @@ namespace DataSpec::DNAMP1 { void MREA::ReadBabeDeadToBlender_1_2(hecl::blender::PyOutStream& os, athena::io::IStreamReader& rs) { atUint32 bdMagic = rs.readUint32Big(); if (bdMagic != 0xBABEDEAD) - Log.report(logvisor::Fatal, fmt("invalid BABEDEAD magic")); + Log.report(logvisor::Fatal, FMT_STRING("invalid BABEDEAD magic")); os << "bpy.context.scene.world.use_nodes = True\n" "bg_node = bpy.context.scene.world.node_tree.nodes['Background']\n" "bg_node.inputs[1].default_value = 0.0\n"; @@ -202,7 +202,7 @@ bool MREA::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: "from mathutils import Vector\n" "bpy.context.scene.render.fps = 60\n" "\n"; - os.format(fmt("bpy.context.scene.name = '{}'\n"), + os.format(FMT_STRING("bpy.context.scene.name = '{}'\n"), pakRouter.getBestEntryName(entry, false)); DNACMDL::InitGeomBlenderContext(os, dataSpec.getMasterShaderPath()); MaterialSet::RegisterMaterialProps(os); @@ -244,7 +244,7 @@ bool MREA::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: rs.seek(secStart + head.secSizes[curSec++], athena::SeekOrigin::Begin); curSec += DNACMDL::ReadGeomSectionsToBlender, MaterialSet, RigPair, DNACMDL::SurfaceHeader_1>( os, rs, pakRouter, entry, dummy, true, true, vertAttribs, m, head.secCount, 0, &head.secSizes[curSec]); - os.format(fmt( + os.format(FMT_STRING( "obj.retro_disable_enviro_visor = {}\n" "obj.retro_disable_thermal_visor = {}\n" "obj.retro_disable_xray_visor = {}\n" @@ -314,7 +314,7 @@ bool MREA::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: "bpy.context.view_layer.layer_collection.children['Collision'].hide_viewport = True\n"; /* Link MLVL scene as background */ - os.linkBackground(fmt::format(fmt("//../!world_{}.blend"), + os.linkBackground(fmt::format(FMT_STRING("//../!world_{}.blend"), pakRouter.getCurrentBridge().getLevelId()), "World"sv); os.centerView(); @@ -332,7 +332,7 @@ void MREA::Name(const SpecBase& dataSpec, PAKEntryReadStream& rs, PAKRouter(GetCurrentProcess())); + parPid = fmt::format(FMT_STRING(_SYS_STR("{}")), reinterpret_cast(GetCurrentProcess())); #else - parPid = fmt::format(fmt(_SYS_STR("{}")), (unsigned long long)getpid()); + parPid = fmt::format(FMT_STRING(_SYS_STR("{}")), (unsigned long long)getpid()); #endif const hecl::SystemChar* args[] = {VisiGenPath.c_str(), visiIntOut.getAbsolutePath().data(), @@ -720,7 +720,7 @@ bool MREA::Cook(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPat r.readBytesToBuf(secs.back().data(), length); visiGood = true; } else { - Log.report(logvisor::Fatal, fmt(_SYS_STR("Unable to launch {}")), VisiGenPath); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Unable to launch {}")), VisiGenPath); } } #endif diff --git a/DataSpec/DNAMP1/PAK.cpp b/DataSpec/DNAMP1/PAK.cpp index 4b7835662..516f6b110 100644 --- a/DataSpec/DNAMP1/PAK.cpp +++ b/DataSpec/DNAMP1/PAK.cpp @@ -10,7 +10,7 @@ template <> void PAK::Enumerate(typename Read::StreamT& reader) { atUint32 version = reader.readUint32Big(); if (version != 0x00030005) - Log.report(logvisor::Fatal, fmt("unexpected PAK magic")); + Log.report(logvisor::Fatal, FMT_STRING("unexpected PAK magic")); reader.readUint32Big(); atUint32 nameCount = reader.readUint32Big(); @@ -147,6 +147,7 @@ const PAK::Entry* PAK::lookupEntry(const UniqueID32& id) const { } const PAK::Entry* PAK::lookupEntry(std::string_view name) const { + // TODO: Heterogeneous lookup when C++20 available auto result = m_nameMap.find(name.data()); if (result != m_nameMap.end()) { auto result1 = m_entries.find(result->second); @@ -164,19 +165,19 @@ std::string PAK::bestEntryName(const nod::Node& pakNode, const Entry& entry, std AGSC::Header header; header.read(rs); catalogueName = header.groupName; - return fmt::format(fmt("{}_{}"), header.groupName, entry.id); + return fmt::format(FMT_STRING("{}_{}"), header.groupName, entry.id); } /* Prefer named entries first */ for (const NameEntry& nentry : m_nameEntries) { if (nentry.id == entry.id) { catalogueName = nentry.name; - return fmt::format(fmt("{}_{}"), nentry.name, entry.id); + return fmt::format(FMT_STRING("{}_{}"), nentry.name, entry.id); } } /* Otherwise return ID format string */ - return fmt::format(fmt("{}_{}"), entry.type, entry.id); + return fmt::format(FMT_STRING("{}_{}"), entry.type, entry.id); } } // namespace DataSpec::DNAMP1 diff --git a/DataSpec/DNAMP1/SCAN.hpp b/DataSpec/DNAMP1/SCAN.hpp index 701070ddd..f806fe69d 100644 --- a/DataSpec/DNAMP1/SCAN.hpp +++ b/DataSpec/DNAMP1/SCAN.hpp @@ -87,13 +87,13 @@ struct SCAN : BigDNA { scan.read(rs); if (scan.string.isValid()) { PAK::Entry* ent = (PAK::Entry*)pakRouter.lookupEntry(scan.string); - ent->name = fmt::format(fmt("SCAN_{}_strg"), entry.id); + ent->name = fmt::format(FMT_STRING("SCAN_{}_strg"), entry.id); } for (int i = 0; i < 4; ++i) { const Texture& tex = scan.textures[i]; if (tex.texture.isValid()) { PAK::Entry* ent = (PAK::Entry*)pakRouter.lookupEntry(tex.texture); - ent->name = fmt::format(fmt("SCAN_{}_tex{}"), entry.id, i + 1); + ent->name = fmt::format(FMT_STRING("SCAN_{}_tex{}"), entry.id, i + 1); } } } diff --git a/DataSpec/DNAMP1/SCLY.cpp b/DataSpec/DNAMP1/SCLY.cpp index 108391b04..6e24003bf 100644 --- a/DataSpec/DNAMP1/SCLY.cpp +++ b/DataSpec/DNAMP1/SCLY.cpp @@ -115,12 +115,12 @@ void SCLY::ScriptLayer::Enumerate(athena::io::IStreamReader& rs) { size_t actualLen = rs.position() - start; if (actualLen != len) Log.report(logvisor::Fatal, - fmt(_SYS_STR("Error while reading object of type 0x{:02X}, did not read the expected amount of " + FMT_STRING(_SYS_STR("Error while reading object of type 0x{:02X}, did not read the expected amount of " "data, read 0x{:x}, expected 0x{:x}")), (atUint32)type, actualLen, len); rs.seek(start + len, athena::SeekOrigin::Begin); } else { - Log.report(logvisor::Fatal, fmt(_SYS_STR("Unable to find type 0x{:X} in object database")), (atUint32)type); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Unable to find type 0x{:X} in object database")), (atUint32)type); } } } @@ -145,7 +145,7 @@ void SCLY::ScriptLayer::Enumerate(athena::io::YAMLDocReader& r obj->type = type; objects.push_back(std::move(obj)); } else - Log.report(logvisor::Fatal, fmt(_SYS_STR("Unable to find type 0x{:X} in object database")), (atUint32)type); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Unable to find type 0x{:X} in object database")), (atUint32)type); } } } else @@ -165,7 +165,7 @@ void SCLY::ScriptLayer::Enumerate(athena::io::IStreamWriter& ws) obj->write(ws); auto wrote = ws.position() - start; if (wrote != expLen) - Log.report(logvisor::Error, fmt("expected writing {} byte SCLY obj; wrote {}"), expLen, wrote); + Log.report(logvisor::Error, FMT_STRING("expected writing {} byte SCLY obj; wrote {}"), expLen, wrote); } } diff --git a/DataSpec/DNAMP1/STRG.cpp b/DataSpec/DNAMP1/STRG.cpp index 6acf994ba..6e893b60c 100644 --- a/DataSpec/DNAMP1/STRG.cpp +++ b/DataSpec/DNAMP1/STRG.cpp @@ -62,7 +62,7 @@ static std::u16string_view::const_iterator CookTextureList(std::u16string& ret, while (true) { auto end = str.find_first_of(u",;", it - str.begin()); if (end == std::u16string::npos) - Log.report(logvisor::Fatal, fmt("Missing comma/semicolon token while pasing font tag")); + Log.report(logvisor::Fatal, FMT_STRING("Missing comma/semicolon token while pasing font tag")); auto endIt = str.begin() + end; hecl::ProjectPath path = UniqueIDBridge::MakePathFromString(hecl::Char16ToUTF8(std::u16string(it, endIt))); @@ -92,7 +92,7 @@ static std::u16string_view::const_iterator GatherTextureList(std::vector(hecl::Char16ToUTF8(std::u16string(it, endIt))); @@ -198,7 +198,7 @@ static std::u16string CookString(std::u16string_view str) { it += 5; auto scpos = str.find(u';', it - str.begin()); if (scpos == std::u16string::npos) - Log.report(logvisor::Fatal, fmt("Missing semicolon token while pasing font tag")); + Log.report(logvisor::Fatal, FMT_STRING("Missing semicolon token while pasing font tag")); hecl::ProjectPath path = UniqueIDBridge::MakePathFromString(hecl::Char16ToUTF8(std::u16string(it, str.begin() + scpos))); ret.append(hecl::UTF8ToChar16(UniqueID32(path).toString())); @@ -249,7 +249,7 @@ void STRG::gatherDependencies(std::vector& pathsOut) const { it += 5; auto scpos = str.find(u';', it - strView.begin()); if (scpos == std::u16string::npos) - Log.report(logvisor::Fatal, fmt("Missing semicolon token while pasing font tag")); + Log.report(logvisor::Fatal, FMT_STRING("Missing semicolon token while pasing font tag")); hecl::ProjectPath path = UniqueIDBridge::MakePathFromString( hecl::Char16ToUTF8(std::u16string(it, strView.begin() + scpos))); if (path) @@ -311,11 +311,11 @@ template <> void STRG::Enumerate(typename Read::StreamT& reader) { atUint32 magic = reader.readUint32Big(); if (magic != 0x87654321) - Log.report(logvisor::Error, fmt("invalid STRG magic")); + Log.report(logvisor::Error, FMT_STRING("invalid STRG magic")); atUint32 version = reader.readUint32Big(); if (version != 0) - Log.report(logvisor::Error, fmt("invalid STRG version")); + Log.report(logvisor::Error, FMT_STRING("invalid STRG version")); _read(reader); } @@ -412,22 +412,22 @@ void STRG::Enumerate(typename ReadYaml::StreamT& reader) { continue; if (lang.first.size() != 4) { - Log.report(logvisor::Warning, fmt("STRG language string '{}' must be exactly 4 characters; skipping"), lang.first); + Log.report(logvisor::Warning, FMT_STRING("STRG language string '{}' must be exactly 4 characters; skipping"), lang.first); return; } if (lang.second->m_type != YAML_SEQUENCE_NODE) { - Log.report(logvisor::Warning, fmt("STRG language string '{}' must contain a sequence; skipping"), lang.first); + Log.report(logvisor::Warning, FMT_STRING("STRG language string '{}' must contain a sequence; skipping"), lang.first); return; } for (const auto& str : lang.second->m_seqChildren) { if (str->m_type != YAML_SCALAR_NODE) { - Log.report(logvisor::Warning, fmt("STRG language '{}' must contain all scalars; skipping"), lang.first); + Log.report(logvisor::Warning, FMT_STRING("STRG language '{}' must contain all scalars; skipping"), lang.first); return; } } } } else { - Log.report(logvisor::Warning, fmt("STRG must have a mapping root node; skipping")); + Log.report(logvisor::Warning, FMT_STRING("STRG must have a mapping root node; skipping")); return; } diff --git a/DataSpec/DNAMP1/ScriptObjects/Babygoth.hpp b/DataSpec/DNAMP1/ScriptObjects/Babygoth.hpp index a396d6616..37c3c7607 100644 --- a/DataSpec/DNAMP1/ScriptObjects/Babygoth.hpp +++ b/DataSpec/DNAMP1/ScriptObjects/Babygoth.hpp @@ -49,7 +49,7 @@ struct Babygoth : IScriptObject { charAssoc.m_cmdlRigs[noShellModel] = {noShellSkin, cinf}; charAssoc.m_cskrToCharacter[noShellSkin] = std::make_pair(patternedInfo.animationParameters.animationCharacterSet, - fmt::format(fmt("ATTACH.SHELLESS_{}.CSKR"), noShellSkin)); + fmt::format(FMT_STRING("ATTACH.SHELLESS_{}.CSKR"), noShellSkin)); charAssoc.addAttachmentRig(patternedInfo.animationParameters.animationCharacterSet, {}, noShellModel, "SHELLESS"); } } diff --git a/DataSpec/DNAMP1/ScriptObjects/Magdolite.hpp b/DataSpec/DNAMP1/ScriptObjects/Magdolite.hpp index b1e787d6c..59a06adb7 100644 --- a/DataSpec/DNAMP1/ScriptObjects/Magdolite.hpp +++ b/DataSpec/DNAMP1/ScriptObjects/Magdolite.hpp @@ -47,7 +47,7 @@ struct Magdolite : IScriptObject { charAssoc.m_cmdlRigs[cmdlHeadless] = {cskrHeadless, cinf}; charAssoc.m_cskrToCharacter[cskrHeadless] = std::make_pair(patternedInfo.animationParameters.animationCharacterSet, - fmt::format(fmt("ATTACH.HEADLESS_{}.CSKR"), cskrHeadless)); + fmt::format(FMT_STRING("ATTACH.HEADLESS_{}.CSKR"), cskrHeadless)); charAssoc.addAttachmentRig(patternedInfo.animationParameters.animationCharacterSet, {}, cmdlHeadless, "HEADLESS"); } } diff --git a/DataSpec/DNAMP1/ScriptObjects/OmegaPirate.hpp b/DataSpec/DNAMP1/ScriptObjects/OmegaPirate.hpp index 3e28ec6bd..c65cf752c 100644 --- a/DataSpec/DNAMP1/ScriptObjects/OmegaPirate.hpp +++ b/DataSpec/DNAMP1/ScriptObjects/OmegaPirate.hpp @@ -60,7 +60,7 @@ struct OmegaPirate : IScriptObject { charAssoc.m_cmdlRigs[cmdlPhazonVeins] = {cskrPhazonVeins, cinfPhazonVeins}; charAssoc.m_cskrToCharacter[cskrPhazonVeins] = std::make_pair(patternedInfo.animationParameters.animationCharacterSet, - fmt::format(fmt("ATTACH.VEINS_{}.CSKR"), cskrPhazonVeins)); + fmt::format(FMT_STRING("ATTACH.VEINS_{}.CSKR"), cskrPhazonVeins)); charAssoc.addAttachmentRig(patternedInfo.animationParameters.animationCharacterSet, cinfPhazonVeins, cmdlPhazonVeins, "VEINS"); } diff --git a/DataSpec/DNAMP1/ScriptObjects/Parameters.hpp b/DataSpec/DNAMP1/ScriptObjects/Parameters.hpp index 6ec46990b..8685fd832 100644 --- a/DataSpec/DNAMP1/ScriptObjects/Parameters.hpp +++ b/DataSpec/DNAMP1/ScriptObjects/Parameters.hpp @@ -380,13 +380,13 @@ struct ActorParameters : BigDNA { if (cmdlXray.isValid() && cskrXray.isValid()) { charAssoc.m_cmdlRigs[cmdlXray] = {cskrXray, cinf}; charAssoc.m_cskrToCharacter[cskrXray] = std::make_pair(animParms.animationCharacterSet, - fmt::format(fmt("ATTACH.XRAY_{}.CSKR"), cskrXray)); + fmt::format(FMT_STRING("ATTACH.XRAY_{}.CSKR"), cskrXray)); charAssoc.addAttachmentRig(animParms.animationCharacterSet, {}, cmdlXray, "XRAY"); } if (cmdlThermal.isValid() && cskrThermal.isValid()) { charAssoc.m_cmdlRigs[cmdlThermal] = {cskrThermal, cinf}; charAssoc.m_cskrToCharacter[cskrThermal] = - std::make_pair(animParms.animationCharacterSet, fmt::format(fmt("ATTACH.THERMAL_{}.CSKR"), cskrThermal)); + std::make_pair(animParms.animationCharacterSet, fmt::format(FMT_STRING("ATTACH.THERMAL_{}.CSKR"), cskrThermal)); charAssoc.addAttachmentRig(animParms.animationCharacterSet, {}, cmdlThermal, "THERMAL"); } } diff --git a/DataSpec/DNAMP2/ANIM.cpp b/DataSpec/DNAMP2/ANIM.cpp index 333d543a1..ee7973e05 100644 --- a/DataSpec/DNAMP2/ANIM.cpp +++ b/DataSpec/DNAMP2/ANIM.cpp @@ -6,7 +6,7 @@ namespace DataSpec::DNAMP2 { using ANIMOutStream = hecl::blender::ANIMOutStream; void ANIM::IANIM::sendANIMToBlender(hecl::blender::PyOutStream& os, const DNAANIM::RigInverter& rig) const { - os.format(fmt( + os.format(FMT_STRING( "act.hecl_fps = round({})\n" "act.hecl_looping = {}\n"), (1.0f / mainInterval), looping ? "True" : "False"); @@ -28,7 +28,7 @@ void ANIM::IANIM::sendANIMToBlender(hecl::blender::PyOutStream& os, const DNAANI continue; } - os.format(fmt("bone_string = '{}'\n"), *bName); + os.format(FMT_STRING("bone_string = '{}'\n"), *bName); os << "action_group = act.groups.new(bone_string)\n" "\n"; @@ -134,7 +134,7 @@ void ANIM::Enumerate(typename Read::StreamT& reader) { m_anim->read(reader); break; default: - Log.report(logvisor::Fatal, fmt("unrecognized ANIM version")); + Log.report(logvisor::Fatal, FMT_STRING("unrecognized ANIM version")); break; } } diff --git a/DataSpec/DNAMP2/CINF.cpp b/DataSpec/DNAMP2/CINF.cpp index 6762c4238..5d413320f 100644 --- a/DataSpec/DNAMP2/CINF.cpp +++ b/DataSpec/DNAMP2/CINF.cpp @@ -35,7 +35,7 @@ void CINF::sendVertexGroupsToBlender(hecl::blender::PyOutStream& os) const { for (atUint32 bid : boneIds) { for (const Name& name : names) { if (name.boneId == bid) { - os.format(fmt("obj.vertex_groups.new(name='{}')\n"), name.name); + os.format(FMT_STRING("obj.vertex_groups.new(name='{}')\n"), name.name); break; } } @@ -46,7 +46,7 @@ template void CINF::sendCINFToBlender(hecl::blender::PyOutStream& os, const typename PAKBridge::PAKType::IDType& cinfId) const { DNAANIM::RigInverter inverter(*this); - os.format(fmt( + os.format(FMT_STRING( "arm = bpy.data.armatures.new('CINF_{}')\n" "arm_obj = bpy.data.objects.new(arm.name, arm)\n" "bpy.context.scene.collection.objects.link(arm_obj)\n" @@ -58,7 +58,7 @@ void CINF::sendCINFToBlender(hecl::blender::PyOutStream& os, const typename PAKB for (const DNAANIM::RigInverter::Bone& bone : inverter.getBones()) { zeus::simd_floats originF(bone.m_origBone.origin.simd); zeus::simd_floats tailF(bone.m_tail.mSimd); - os.format(fmt( + os.format(FMT_STRING( "bone = arm.edit_bones.new('{}')\n" "bone.head = ({},{},{})\n" "bone.tail = ({},{},{})\n" @@ -73,18 +73,18 @@ void CINF::sendCINFToBlender(hecl::blender::PyOutStream& os, const typename PAKB atUint32 nullId = bones[0].parentId; for (const Bone& bone : bones) if (bone.parentId != nullId) - os.format(fmt("arm_bone_table[{}].parent = arm_bone_table[{}]\n"), bone.id, bone.parentId); + os.format(FMT_STRING("arm_bone_table[{}].parent = arm_bone_table[{}]\n"), bone.id, bone.parentId); } } else { for (const Bone& bone : bones) if (bone.parentId != 97) - os.format(fmt("arm_bone_table[{}].parent = arm_bone_table[{}]\n"), bone.id, bone.parentId); + os.format(FMT_STRING("arm_bone_table[{}].parent = arm_bone_table[{}]\n"), bone.id, bone.parentId); } os << "bpy.ops.object.mode_set(mode='OBJECT')\n"; for (const DNAANIM::RigInverter::Bone& bone : inverter.getBones()) - os.format(fmt("arm_obj.pose.bones['{}'].rotation_mode = 'QUATERNION'\n"), + os.format(FMT_STRING("arm_obj.pose.bones['{}'].rotation_mode = 'QUATERNION'\n"), *getBoneNameFromId(bone.m_origBone.id)); } template void CINF::sendCINFToBlender(hecl::blender::PyOutStream& os, const UniqueID32& cinfId) const; @@ -92,7 +92,7 @@ template void CINF::sendCINFToBlender(hecl::blender::PyOutStr const UniqueID64& cinfId) const; template -std::string CINF::GetCINFArmatureName(const UniqueID& cinfId) { return fmt::format(fmt("CINF_{}"), cinfId); } +std::string CINF::GetCINFArmatureName(const UniqueID& cinfId) { return fmt::format(FMT_STRING("CINF_{}"), cinfId); } template std::string CINF::GetCINFArmatureName(const UniqueID32& cinfId); template std::string CINF::GetCINFArmatureName(const UniqueID64& cinfId); @@ -185,7 +185,7 @@ bool CINF::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: return false; auto os = conn.beginPythonOut(true); - os.format(fmt("import bpy\n" + os.format(FMT_STRING("import bpy\n" "from mathutils import Vector\n" "bpy.context.scene.name = 'CINF_{}'\n" "bpy.context.scene.hecl_arm_obj = bpy.context.scene.name\n" diff --git a/DataSpec/DNAMP2/CSKR.cpp b/DataSpec/DNAMP2/CSKR.cpp index 5d9353cbf..16ab4f450 100644 --- a/DataSpec/DNAMP2/CSKR.cpp +++ b/DataSpec/DNAMP2/CSKR.cpp @@ -8,7 +8,7 @@ void CSKR::weightVertex(hecl::blender::PyOutStream& os, const CINF& cinf, atUint for (const SkinningRule& rule : skinningRules) { if (idx >= accum && idx < accum + rule.vertCount) for (const SkinningRule::Weight& weight : rule.weights) - os.format(fmt("vert[dvert_lay][{}] = {}\n"), cinf.getBoneIdxFromId(weight.boneId), weight.weight); + os.format(FMT_STRING("vert[dvert_lay][{}] = {}\n"), cinf.getBoneIdxFromId(weight.boneId), weight.weight); accum += rule.vertCount; } } diff --git a/DataSpec/DNAMP2/DNAMP2.cpp b/DataSpec/DNAMP2/DNAMP2.cpp index 208bc8d14..dd08e1b78 100644 --- a/DataSpec/DNAMP2/DNAMP2.cpp +++ b/DataSpec/DNAMP2/DNAMP2.cpp @@ -119,7 +119,7 @@ void PAKBridge::build() { areaDeps.name = hecl::SystemString(_SYS_STR("MREA_")) + hecl::SystemStringConv(idStr).c_str(); } } - hecl::SystemString num = fmt::format(fmt(_SYS_STR("{:02d} ")), ai); + hecl::SystemString num = fmt::format(FMT_STRING(_SYS_STR("{:02d} ")), ai); areaDeps.name = num + areaDeps.name; areaDeps.layers.reserve(area.depLayerCount - 1); @@ -130,7 +130,7 @@ void PAKBridge::build() { layer.name = LayerName(mlvl.layerNames[layerIdx++]); layer.active = layerFlags.flags >> (l - 1) & 0x1; layer.name = hecl::StringUtils::TrimWhitespace(layer.name); - num = fmt::format(fmt(_SYS_STR("{:02d} ")), l - 1); + num = fmt::format(FMT_STRING(_SYS_STR("{:02d} ")), l - 1); layer.name = num + layer.name; layer.resources.reserve(area.depLayers[l] - r); @@ -163,11 +163,11 @@ void PAKBridge::addCMDLRigPairs(PAKRouter& pakRouter, CharacterAssoci for (const ANCS::CharacterSet::CharacterInfo& ci : ancs.characterSet.characters) { charAssoc.m_cmdlRigs[ci.cmdl] = {ci.cskr, ci.cinf}; charAssoc.m_cskrToCharacter[ci.cskr] = - std::make_pair(entry.second.id, fmt::format(fmt("{}_{}.CSKR"), ci.name, ci.cskr)); + std::make_pair(entry.second.id, fmt::format(FMT_STRING("{}_{}.CSKR"), ci.name, ci.cskr)); if (ci.cmdlIce.isValid()) { charAssoc.m_cmdlRigs[ci.cmdlIce] = {ci.cskrIce, ci.cinf}; charAssoc.m_cskrToCharacter[ci.cskrIce] = - std::make_pair(entry.second.id, fmt::format(fmt("{}.ICE_{}.CSKR"), ci.name, ci.cskrIce)); + std::make_pair(entry.second.id, fmt::format(FMT_STRING("{}.ICE_{}.CSKR"), ci.name, ci.cskrIce)); } } } @@ -202,7 +202,7 @@ void PAKBridge::addMAPATransforms(PAKRouter& pakRouter, if (mlvl.worldNameId.isValid()) pathOverrides[mlvl.worldNameId] = hecl::ProjectPath(mlvlDirPath, - fmt::format(fmt(_SYS_STR("!name_{}.yaml")), mlvl.worldNameId)); + fmt::format(FMT_STRING(_SYS_STR("!name_{}.yaml")), mlvl.worldNameId)); for (const MLVL::Area& area : mlvl.areas) { { @@ -218,7 +218,7 @@ void PAKBridge::addMAPATransforms(PAKRouter& pakRouter, hecl::ProjectPath areaDirPath = pakRouter.getWorking(area.areaMREAId).getParentPath(); if (area.areaNameId.isValid()) pathOverrides[area.areaNameId] = hecl::ProjectPath(areaDirPath, - fmt::format(fmt(_SYS_STR("!name_{}.yaml")), area.areaNameId)); + fmt::format(FMT_STRING(_SYS_STR("!name_{}.yaml")), area.areaNameId)); } if (mlvl.worldMap.isValid()) { diff --git a/DataSpec/DNAMP2/DeafBabe.cpp b/DataSpec/DNAMP2/DeafBabe.cpp index e1c699914..e33b2893e 100644 --- a/DataSpec/DNAMP2/DeafBabe.cpp +++ b/DataSpec/DNAMP2/DeafBabe.cpp @@ -265,7 +265,7 @@ void DeafBabe::insertNoClimb(hecl::blender::PyOutStream& os) const { if (edgeIdx == -1) continue; const Edge& edge = edgeVertConnections[edgeIdx]; - os.format(fmt( + os.format(FMT_STRING( "edge = col_bm.edges.get((col_bm.verts[{}], col_bm.verts[{}]))\n" "if edge:\n" " edge.seam = True\n"), diff --git a/DataSpec/DNAMP2/MREA.cpp b/DataSpec/DNAMP2/MREA.cpp index a8add1605..57d9f828b 100644 --- a/DataSpec/DNAMP2/MREA.cpp +++ b/DataSpec/DNAMP2/MREA.cpp @@ -13,7 +13,7 @@ namespace DNAMP2 { void MREA::StreamReader::nextBlock() { if (m_nextBlk >= m_blkCount) - Log.report(logvisor::Fatal, fmt("MREA stream overrun")); + Log.report(logvisor::Fatal, FMT_STRING("MREA stream overrun")); BlockInfo& info = m_blockInfos[m_nextBlk++]; @@ -86,7 +86,7 @@ void MREA::StreamReader::seek(atInt64 diff, athena::SeekOrigin whence) { } if (target >= m_totalDecompLen) - Log.report(logvisor::Fatal, fmt("MREA stream seek overrun")); + Log.report(logvisor::Fatal, FMT_STRING("MREA stream seek overrun")); /* Determine which block contains position */ atUint32 dAccum = 0; @@ -225,7 +225,7 @@ bool MREA::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: /* Open Py Stream and read sections */ hecl::blender::PyOutStream os = conn.beginPythonOut(true); - os.format(fmt( + os.format(FMT_STRING( "import bpy\n" "import bmesh\n" "from mathutils import Vector\n" @@ -272,7 +272,7 @@ bool MREA::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: drs.seek(secStart + head.secSizes[curSec++], athena::SeekOrigin::Begin); curSec += DNACMDL::ReadGeomSectionsToBlender, MaterialSet, RigPair, DNACMDL::SurfaceHeader_2>( os, drs, pakRouter, entry, dummy, true, true, vertAttribs, m, head.secCount, 0, &head.secSizes[curSec]); - os.format(fmt( + os.format(FMT_STRING( "obj.retro_disable_enviro_visor = {}\n" "obj.retro_disable_thermal_visor = {}\n" "obj.retro_disable_xray_visor = {}\n" diff --git a/DataSpec/DNAMP2/PAK.cpp b/DataSpec/DNAMP2/PAK.cpp index a3e209702..b7352cadc 100644 --- a/DataSpec/DNAMP2/PAK.cpp +++ b/DataSpec/DNAMP2/PAK.cpp @@ -11,7 +11,7 @@ std::string PAK::bestEntryName(const nod::Node& pakNode, const Entry& entry, std AGSC::Header header; header.read(rs); catalogueName = header.groupName; - return fmt::format(fmt("{}_{}"), header.groupName, entry.id); + return fmt::format(FMT_STRING("{}_{}"), header.groupName, entry.id); } return DNAMP1::PAK::bestEntryName(pakNode, entry, catalogueName); diff --git a/DataSpec/DNAMP2/STRG.cpp b/DataSpec/DNAMP2/STRG.cpp index 30d0cb24a..16c0632f1 100644 --- a/DataSpec/DNAMP2/STRG.cpp +++ b/DataSpec/DNAMP2/STRG.cpp @@ -49,11 +49,11 @@ template <> void STRG::Enumerate(athena::io::IStreamReader& reader) { atUint32 magic = reader.readUint32Big(); if (magic != 0x87654321) - Log.report(logvisor::Error, fmt("invalid STRG magic")); + Log.report(logvisor::Error, FMT_STRING("invalid STRG magic")); atUint32 version = reader.readUint32Big(); if (version != 1) - Log.report(logvisor::Error, fmt("invalid STRG version")); + Log.report(logvisor::Error, FMT_STRING("invalid STRG version")); _read(reader); } @@ -158,22 +158,22 @@ void STRG::Enumerate(athena::io::YAMLDocReader& reader) { if (lang.first == "names") continue; if (lang.first.size() != 4) { - Log.report(logvisor::Warning, fmt("STRG language string '{}' must be exactly 4 characters; skipping"), lang.first); + Log.report(logvisor::Warning, FMT_STRING("STRG language string '{}' must be exactly 4 characters; skipping"), lang.first); return; } if (lang.second->m_type != YAML_SEQUENCE_NODE) { - Log.report(logvisor::Warning, fmt("STRG language string '{}' must contain a sequence; skipping"), lang.first); + Log.report(logvisor::Warning, FMT_STRING("STRG language string '{}' must contain a sequence; skipping"), lang.first); return; } for (const auto& str : lang.second->m_seqChildren) { if (str->m_type != YAML_SCALAR_NODE) { - Log.report(logvisor::Warning, fmt("STRG language '{}' must contain all scalars; skipping"), lang.first); + Log.report(logvisor::Warning, FMT_STRING("STRG language '{}' must contain all scalars; skipping"), lang.first); return; } } } } else { - Log.report(logvisor::Warning, fmt("STRG must have a mapping root node; skipping")); + Log.report(logvisor::Warning, FMT_STRING("STRG must have a mapping root node; skipping")); return; } diff --git a/DataSpec/DNAMP2/STRG.hpp b/DataSpec/DNAMP2/STRG.hpp index 5775a96b9..5ec8fd5e1 100644 --- a/DataSpec/DNAMP2/STRG.hpp +++ b/DataSpec/DNAMP2/STRG.hpp @@ -14,6 +14,7 @@ struct STRG : ISTRG { std::map names; int32_t lookupIdx(std::string_view name) const override { + // TODO: Heterogeneous lookup when C++20 available auto search = names.find(name.data()); if (search == names.end()) return -1; diff --git a/DataSpec/DNAMP3/ANIM.cpp b/DataSpec/DNAMP3/ANIM.cpp index 9abfea7ac..38e91c41a 100644 --- a/DataSpec/DNAMP3/ANIM.cpp +++ b/DataSpec/DNAMP3/ANIM.cpp @@ -9,7 +9,7 @@ using ANIMOutStream = hecl::blender::ANIMOutStream; void ANIM::IANIM::sendANIMToBlender(hecl::blender::PyOutStream& os, const DNAANIM::RigInverter& rig, bool additive) const { - os.format(fmt( + os.format(FMT_STRING( "act.hecl_fps = round({})\n" "act.hecl_additive = {}\n" "act.hecl_looping = {}\n"), @@ -32,7 +32,7 @@ void ANIM::IANIM::sendANIMToBlender(hecl::blender::PyOutStream& os, const DNAANI continue; } - os.format(fmt("bone_string = '{}'\n"), *bName); + os.format(FMT_STRING("bone_string = '{}'\n"), *bName); os << "action_group = act.groups.new(bone_string)\n" "\n"; @@ -138,7 +138,7 @@ void ANIM::Enumerate(typename Read::StreamT& reader) { m_anim->read(reader); break; default: - Log.report(logvisor::Fatal, fmt("unrecognized ANIM version")); + Log.report(logvisor::Fatal, FMT_STRING("unrecognized ANIM version")); break; } } diff --git a/DataSpec/DNAMP3/CMDLMaterials.cpp b/DataSpec/DNAMP3/CMDLMaterials.cpp index f12848b14..3466f1122 100644 --- a/DataSpec/DNAMP3/CMDLMaterials.cpp +++ b/DataSpec/DNAMP3/CMDLMaterials.cpp @@ -61,7 +61,7 @@ static void LoadTexture(Stream& out, const UniqueID64& tex, } hecl::SystemString resPath = pakRouter.getResourceRelativePath(entry, tex); hecl::SystemUTF8Conv resPathView(resPath); - out.format(fmt("if '{}' in bpy.data.images:\n" + out.format(FMT_STRING("if '{}' in bpy.data.images:\n" " image = bpy.data.images['{}']\n" "else:\n" " image = bpy.data.images.load('''//{}''')\n" @@ -71,7 +71,7 @@ static void LoadTexture(Stream& out, const UniqueID64& tex, void MaterialSet::ConstructMaterial(Stream& out, const PAKRouter& pakRouter, const PAK::Entry& entry, const Material& material, unsigned groupIdx, unsigned matIdx) { - out.format(fmt("new_material = bpy.data.materials.new('MAT_{}_{}')\n"), groupIdx, matIdx); + out.format(FMT_STRING("new_material = bpy.data.materials.new('MAT_{}_{}')\n"), groupIdx, matIdx); out << "new_material.use_fake_user = True\n" "new_material.use_nodes = True\n" "new_material.use_backface_culling = True\n" @@ -91,7 +91,7 @@ void MaterialSet::ConstructMaterial(Stream& out, const PAKRouter& pak "\n"; /* Material Flags */ - out.format(fmt( + out.format(FMT_STRING( "new_material.retro_enable_bloom = {}\n" "new_material.retro_force_lighting_stage = {}\n" "new_material.retro_pre_inca_transparency = {}\n" @@ -146,14 +146,14 @@ void MaterialSet::ConstructMaterial(Stream& out, const PAKRouter& pak "tex_links.append(new_nodetree.links.new(tex_uv_node.outputs['Normal'], tex_node.inputs['Vector']))\n"; break; case Material::UVAnimationUVSource::UV: - out.format(fmt("tex_uv_node = new_nodetree.nodes.new('ShaderNodeUVMap')\n" + out.format(FMT_STRING("tex_uv_node = new_nodetree.nodes.new('ShaderNodeUVMap')\n" "tex_links.append(new_nodetree.links.new(tex_uv_node.outputs['UV'], tex_node.inputs['Vector']))\n" "tex_uv_node.uv_map = 'UV_{}'\n"), pass->uvSrc); break; } - out.format(fmt("tex_uv_node.label = 'MTX_{}'\n"), texMtxIdx); + out.format(FMT_STRING("tex_uv_node.label = 'MTX_{}'\n"), texMtxIdx); } else { - out.format(fmt("tex_uv_node = new_nodetree.nodes.new('ShaderNodeUVMap')\n" + out.format(FMT_STRING("tex_uv_node = new_nodetree.nodes.new('ShaderNodeUVMap')\n" "tex_links.append(new_nodetree.links.new(tex_uv_node.outputs['UV'], tex_node.inputs['Vector']))\n" "tex_uv_node.uv_map = 'UV_{}'\n"), pass->uvSrc); } @@ -179,7 +179,7 @@ void MaterialSet::ConstructMaterial(Stream& out, const PAKRouter& pak "separate_node.location[0] += 350\n" "separate_node.location[1] += 350\n" "new_nodetree.links.new(tex_node.outputs['Color'], separate_node.inputs[0])\n"; - out.format(fmt("swap_output = separate_node.outputs[{}]\n"), int(pass->flags.swapColorComponent())); + out.format(FMT_STRING("swap_output = separate_node.outputs[{}]\n"), int(pass->flags.swapColorComponent())); } }; @@ -218,7 +218,7 @@ void MaterialSet::ConstructMaterial(Stream& out, const PAKRouter& pak DoSwap(); out << "new_nodetree.links.new(swap_output, pnode.inputs['INCAA'])\n"; } - out.format(fmt("new_material.retro_inca_color_mod = {}\n"), pass->flags.INCAColorMod() ? "True" : "False"); + out.format(FMT_STRING("new_material.retro_inca_color_mod = {}\n"), pass->flags.INCAColorMod() ? "True" : "False"); break; case Subtype::RFLV: out << "new_nodetree.links.new(tex_node.outputs['Color'], pnode.inputs['RFLV'])\n"; @@ -244,7 +244,7 @@ void MaterialSet::ConstructMaterial(Stream& out, const PAKRouter& pak "new_nodetree.links.new(swap_output, pnode.inputs['XRAYA'])\n"; break; default: - Log.report(logvisor::Fatal, fmt("Unknown PASS subtype")); + Log.report(logvisor::Fatal, FMT_STRING("Unknown PASS subtype")); break; } } else if (const Material::CLR* clr = chunk.get_if()) { @@ -253,39 +253,39 @@ void MaterialSet::ConstructMaterial(Stream& out, const PAKRouter& pak clr->color.toVec4f().simd.copy_to(vec4); switch (Subtype(clr->subtype.toUint32())) { case Subtype::CLR: - out.format(fmt("pnode.inputs['CLR'].default_value = ({}, {}, {}, 1.0)\n" + out.format(FMT_STRING("pnode.inputs['CLR'].default_value = ({}, {}, {}, 1.0)\n" "pnode.inputs['CLRA'].default_value = {}\n"), vec4[0], vec4[1], vec4[2], vec4[3]); break; case Subtype::DIFB: - out.format(fmt("pnode.inputs['DIFBC'].default_value = ({}, {}, {}, 1.0)\n" + out.format(FMT_STRING("pnode.inputs['DIFBC'].default_value = ({}, {}, {}, 1.0)\n" "pnode.inputs['DIFBA'].default_value = {}\n"), vec4[0], vec4[1], vec4[2], vec4[3]); break; default: - Log.report(logvisor::Fatal, fmt("Unknown CLR subtype")); + Log.report(logvisor::Fatal, FMT_STRING("Unknown CLR subtype")); break; } } else if (const Material::INT* val = chunk.get_if()) { using Subtype = Material::INT::Subtype; switch (Subtype(val->subtype.toUint32())) { case Subtype::OPAC: - out.format(fmt("pnode.inputs['OPAC'].default_value = {}\n"), val->value / 255.f); + out.format(FMT_STRING("pnode.inputs['OPAC'].default_value = {}\n"), val->value / 255.f); break; case Subtype::BLOD: - out.format(fmt("pnode.inputs['BLOD'].default_value = {}\n"), val->value / 255.f); + out.format(FMT_STRING("pnode.inputs['BLOD'].default_value = {}\n"), val->value / 255.f); break; case Subtype::BLOI: - out.format(fmt("pnode.inputs['BLOI'].default_value = {}\n"), val->value / 255.f); + out.format(FMT_STRING("pnode.inputs['BLOI'].default_value = {}\n"), val->value / 255.f); break; case Subtype::BNIF: - out.format(fmt("pnode.inputs['BNIF'].default_value = {}\n"), val->value / 255.f); + out.format(FMT_STRING("pnode.inputs['BNIF'].default_value = {}\n"), val->value / 255.f); break; case Subtype::XRBR: - out.format(fmt("pnode.inputs['XRBR'].default_value = {}\n"), val->value / 255.f); + out.format(FMT_STRING("pnode.inputs['XRBR'].default_value = {}\n"), val->value / 255.f); break; default: - Log.report(logvisor::Fatal, fmt("Unknown INT subtype")); + Log.report(logvisor::Fatal, FMT_STRING("Unknown INT subtype")); break; } } diff --git a/DataSpec/DNAMP3/CSKR.cpp b/DataSpec/DNAMP3/CSKR.cpp index b798f7ec7..11711dd5d 100644 --- a/DataSpec/DNAMP3/CSKR.cpp +++ b/DataSpec/DNAMP3/CSKR.cpp @@ -8,7 +8,7 @@ void CSKR::weightVertex(hecl::blender::PyOutStream& os, const CINF& cinf, atInt1 return; const DNAMP2::CSKR::SkinningRule& rule = data.skinningRules[skinIdx]; for (const DNAMP2::CSKR::SkinningRule::Weight& weight : rule.weights) - os.format(fmt("vert[dvert_lay][{}] = {}\n"), cinf.getBoneIdxFromId(weight.boneId), weight.weight); + os.format(FMT_STRING("vert[dvert_lay][{}] = {}\n"), cinf.getBoneIdxFromId(weight.boneId), weight.weight); } } // namespace DataSpec::DNAMP3 diff --git a/DataSpec/DNAMP3/DNAMP3.cpp b/DataSpec/DNAMP3/DNAMP3.cpp index 52efdc8db..60b68b85b 100644 --- a/DataSpec/DNAMP3/DNAMP3.cpp +++ b/DataSpec/DNAMP3/DNAMP3.cpp @@ -124,7 +124,7 @@ void PAKBridge::build() { areaDeps.name = hecl::SystemString(_SYS_STR("MREA_")) + hecl::SystemStringConv(idStr).c_str(); } } - hecl::SystemString num = fmt::format(fmt(_SYS_STR("{:02d} ")), ai); + hecl::SystemString num = fmt::format(FMT_STRING(_SYS_STR("{:02d} ")), ai); areaDeps.name = num + areaDeps.name; const MLVL::LayerFlags& layerFlags = *layerFlagsIt++; @@ -136,7 +136,7 @@ void PAKBridge::build() { layer.name = LayerName(mlvl.layerNames[layerIdx++]); layer.active = layerFlags.flags >> (l - 1) & 0x1; layer.name = hecl::StringUtils::TrimWhitespace(layer.name); - num = fmt::format(fmt(_SYS_STR("{:02d} ")), l - 1); + num = fmt::format(FMT_STRING(_SYS_STR("{:02d} ")), l - 1); layer.name = num + layer.name; } } @@ -170,11 +170,11 @@ void PAKBridge::addCMDLRigPairs(PAKRouter& pakRouter, CharacterAssoci const CHAR::CharacterInfo& ci = aChar.characterInfo; charAssoc.m_cmdlRigs[ci.cmdl] = {ci.cskr, ci.cinf}; charAssoc.m_cskrToCharacter[ci.cskr] = - std::make_pair(entry.second.id, fmt::format(fmt("{}_{}.CSKR"), ci.name, ci.cskr)); + std::make_pair(entry.second.id, fmt::format(FMT_STRING("{}_{}.CSKR"), ci.name, ci.cskr)); for (const CHAR::CharacterInfo::Overlay& overlay : ci.overlays) { charAssoc.m_cmdlRigs[overlay.cmdl] = {overlay.cskr, ci.cinf}; charAssoc.m_cskrToCharacter[overlay.cskr] = - std::make_pair(entry.second.id, fmt::format(fmt("{}.{}_{}.CSKR"), ci.name, overlay.type, overlay.cskr)); + std::make_pair(entry.second.id, fmt::format(FMT_STRING("{}.{}_{}.CSKR"), ci.name, overlay.type, overlay.cskr)); } } } @@ -196,7 +196,7 @@ void PAKBridge::addMAPATransforms(PAKRouter& pakRouter, if (mlvl.worldNameId.isValid()) pathOverrides[mlvl.worldNameId] = hecl::ProjectPath(mlvlDirPath, - fmt::format(fmt(_SYS_STR("!name_{}.yaml")), mlvl.worldNameId)); + fmt::format(FMT_STRING(_SYS_STR("!name_{}.yaml")), mlvl.worldNameId)); for (const MLVL::Area& area : mlvl.areas) { { @@ -212,7 +212,7 @@ void PAKBridge::addMAPATransforms(PAKRouter& pakRouter, hecl::ProjectPath areaDirPath = pakRouter.getWorking(area.areaMREAId).getParentPath(); if (area.areaNameId.isValid()) pathOverrides[area.areaNameId] = hecl::ProjectPath(areaDirPath, - fmt::format(fmt(_SYS_STR("!name_{}.yaml")), area.areaNameId)); + fmt::format(FMT_STRING(_SYS_STR("!name_{}.yaml")), area.areaNameId)); } if (mlvl.worldMap.isValid()) { diff --git a/DataSpec/DNAMP3/MREA.cpp b/DataSpec/DNAMP3/MREA.cpp index 293441c11..474acb865 100644 --- a/DataSpec/DNAMP3/MREA.cpp +++ b/DataSpec/DNAMP3/MREA.cpp @@ -49,7 +49,7 @@ bool MREA::StreamReader::seekToSection(FourCC sec, const std::vector& void MREA::ReadBabeDeadToBlender_3(hecl::blender::PyOutStream& os, athena::io::IStreamReader& rs) { atUint32 bdMagic = rs.readUint32Big(); if (bdMagic != 0xBABEDEAD) - Log.report(logvisor::Fatal, fmt("invalid BABEDEAD magic")); + Log.report(logvisor::Fatal, FMT_STRING("invalid BABEDEAD magic")); os << "bpy.context.scene.world.use_nodes = True\n" "bg_node = bpy.context.scene.world.node_tree.nodes['Background']\n" "bg_node.inputs[1].default_value = 0.0\n"; @@ -100,7 +100,7 @@ bool MREA::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: /* Open Py Stream and read sections */ hecl::blender::PyOutStream os = conn.beginPythonOut(true); - os.format(fmt( + os.format(FMT_STRING( "import bpy\n" "import bmesh\n" "from mathutils import Vector\n" diff --git a/DataSpec/DNAMP3/PAK.cpp b/DataSpec/DNAMP3/PAK.cpp index 2eddb7f08..81a4b016a 100644 --- a/DataSpec/DNAMP3/PAK.cpp +++ b/DataSpec/DNAMP3/PAK.cpp @@ -9,7 +9,7 @@ template <> void PAK::Enumerate(athena::io::IStreamReader& reader) { m_header.read(reader); if (m_header.version != 2) - Log.report(logvisor::Fatal, fmt("unexpected PAK magic")); + Log.report(logvisor::Fatal, FMT_STRING("unexpected PAK magic")); reader.seek(8, athena::SeekOrigin::Current); atUint32 strgSz = reader.readUint32Big(); @@ -141,7 +141,7 @@ std::unique_ptr PAK::Entry::getBuffer(const nod::Node& pak, atUint64& } head; strm->read(&head, 8); if (head.magic != CMPD) { - Log.report(logvisor::Error, fmt("invalid CMPD block")); + Log.report(logvisor::Error, FMT_STRING("invalid CMPD block")); return nullptr; } head.blockCount = hecl::SBig(head.blockCount); @@ -206,6 +206,7 @@ const PAK::Entry* PAK::lookupEntry(const UniqueID64& id) const { } const PAK::Entry* PAK::lookupEntry(std::string_view name) const { + // TODO: Heterogeneous lookup when C++20 available auto result = m_nameMap.find(name.data()); if (result != m_nameMap.end()) { auto result1 = m_entries.find(result->second); @@ -220,11 +221,11 @@ std::string PAK::bestEntryName(const nod::Node& pakNode, const Entry& entry, std for (const NameEntry& nentry : m_nameEntries) if (nentry.id == entry.id) { catalogueName = nentry.name; - return fmt::format(fmt("{}_{}"), nentry.name, entry.id); + return fmt::format(FMT_STRING("{}_{}"), nentry.name, entry.id); } /* Otherwise return ID format string */ - return fmt::format(fmt("{}_{}"), entry.type, entry.id); + return fmt::format(FMT_STRING("{}_{}"), entry.type, entry.id); } } // namespace DataSpec::DNAMP3 diff --git a/DataSpec/DNAMP3/STRG.cpp b/DataSpec/DNAMP3/STRG.cpp index a5de8ac98..b40dd735d 100644 --- a/DataSpec/DNAMP3/STRG.cpp +++ b/DataSpec/DNAMP3/STRG.cpp @@ -59,13 +59,13 @@ template <> void STRG::Enumerate(athena::io::IStreamReader& reader) { atUint32 magic = reader.readUint32Big(); if (magic != 0x87654321) { - Log.report(logvisor::Error, fmt("invalid STRG magic")); + Log.report(logvisor::Error, FMT_STRING("invalid STRG magic")); return; } atUint32 version = reader.readUint32Big(); if (version != 3) { - Log.report(logvisor::Error, fmt("invalid STRG version")); + Log.report(logvisor::Error, FMT_STRING("invalid STRG version")); return; } @@ -82,22 +82,22 @@ void STRG::Enumerate(athena::io::YAMLDocReader& reader) { if (lang.first == "names") continue; if (lang.first.size() != 4) { - Log.report(logvisor::Warning, fmt("STRG language string '{}' must be exactly 4 characters; skipping"), lang.first); + Log.report(logvisor::Warning, FMT_STRING("STRG language string '{}' must be exactly 4 characters; skipping"), lang.first); return; } if (lang.second->m_type != YAML_SEQUENCE_NODE) { - Log.report(logvisor::Warning, fmt("STRG language string '{}' must contain a sequence; skipping"), lang.first); + Log.report(logvisor::Warning, FMT_STRING("STRG language string '{}' must contain a sequence; skipping"), lang.first); return; } for (const auto& str : lang.second->m_seqChildren) { if (str->m_type != YAML_SCALAR_NODE) { - Log.report(logvisor::Warning, fmt("STRG language '{}' must contain all scalars; skipping"), lang.first); + Log.report(logvisor::Warning, FMT_STRING("STRG language '{}' must contain all scalars; skipping"), lang.first); return; } } } } else { - Log.report(logvisor::Warning, fmt("STRG must have a mapping root node; skipping")); + Log.report(logvisor::Warning, FMT_STRING("STRG must have a mapping root node; skipping")); return; } diff --git a/DataSpec/DNAMP3/STRG.hpp b/DataSpec/DNAMP3/STRG.hpp index c43858955..8f8d44f50 100644 --- a/DataSpec/DNAMP3/STRG.hpp +++ b/DataSpec/DNAMP3/STRG.hpp @@ -14,6 +14,7 @@ struct STRG : ISTRG { std::map names; int32_t lookupIdx(std::string_view name) const override { + // TODO: Heterogeneous lookup when C++20 available auto search = names.find(name.data()); if (search == names.end()) return -1; diff --git a/DataSpec/SpecBase.cpp b/DataSpec/SpecBase.cpp index 5d9e23fcc..6d6f5ecaa 100644 --- a/DataSpec/SpecBase.cpp +++ b/DataSpec/SpecBase.cpp @@ -65,7 +65,7 @@ bool SpecBase::canExtract(const ExtractPassInfo& info, std::vector= 0) { const auto& arm = actor.armatures[att.armature]; @@ -355,9 +355,9 @@ void SpecBase::flattenDependenciesBlend(const hecl::ProjectPath& in, std::vector for (const auto& act : actNames) { hecl::SystemStringConv actSysName(act.first); hecl::SystemStringConv actAnimId(act.second); - pathsOut.push_back(asGlob.ensureAuxInfo(fmt::format(fmt(_SYS_STR("{}_{}.ANIM")), actSysName, actAnimId))); + pathsOut.push_back(asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}_{}.ANIM")), actSysName, actAnimId))); hecl::SystemString searchPrefix(asGlob.getWithExtension( - fmt::format(fmt(_SYS_STR(".{}_")), actSysName).c_str(), true).getLastComponent()); + fmt::format(FMT_STRING(_SYS_STR(".{}_")), actSysName).c_str(), true).getLastComponent()); hecl::ProjectPath evntPath; for (const auto& ent : dEnum) { if (hecl::StringUtils::BeginsWith(ent.m_name, searchPrefix.c_str()) && @@ -468,7 +468,7 @@ void SpecBase::copyBuildListData(std::vector>& fileIndex.reserve(buildList.size()); int loadIdx = 0; for (const auto& tag : buildList) { - hecl::SystemString str = fmt::format(fmt(_SYS_STR("Copying {}")), tag); + hecl::SystemString str = fmt::format(FMT_STRING(_SYS_STR("Copying {}")), tag); progress.print(str.c_str(), nullptr, ++loadIdx / float(buildList.size())); auto& [positionOut, sizeOut, compressedOut] = fileIndex.emplace_back(); @@ -476,7 +476,7 @@ void SpecBase::copyBuildListData(std::vector>& if (tag.type == FOURCC('MLVL')) { auto search = mlvlData.find(tag.id); if (search == mlvlData.end()) - Log.report(logvisor::Fatal, fmt(_SYS_STR("Unable to find MLVL {}")), tag.id); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Unable to find MLVL {}")), tag.id); positionOut = pakOut.position(); sizeOut = ROUND_UP_32(search->second.size()); @@ -492,7 +492,7 @@ void SpecBase::copyBuildListData(std::vector>& hecl::ProjectPath cooked = getCookedPath(path, true); athena::io::FileReader r(cooked.getAbsolutePath()); if (r.hasError()) - Log.report(logvisor::Fatal, fmt(_SYS_STR("Unable to open resource {}")), cooked.getRelativePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Unable to open resource {}")), cooked.getRelativePath()); atUint64 size = r.length(); auto data = r.readUBytes(size); auto compData = compressPakData(tag, data.get(), size); @@ -616,7 +616,7 @@ void SpecBase::doPackage(const hecl::ProjectPath& path, const hecl::Database::Da /* Async cook resource list if using ClientProcess */ if (cp) { - Log.report(logvisor::Info, fmt(_SYS_STR("Validating resources"))); + Log.report(logvisor::Info, FMT_STRING(_SYS_STR("Validating resources"))); progress.setMainIndeterminate(true); std::vector cookTags; cookTags.reserve(buildList.size()); @@ -640,7 +640,7 @@ void SpecBase::doPackage(const hecl::ProjectPath& path, const hecl::Database::Da for (auto& tag : cookTags) { hecl::ProjectPath depPath = pathFromTag(tag); if (!depPath) - Log.report(logvisor::Fatal, fmt(_SYS_STR("Unable to resolve {}")), tag); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Unable to resolve {}")), tag); m_project.cookPath(depPath, progress, false, false, fast, entry, cp); } progress.setMainIndeterminate(false); @@ -650,7 +650,7 @@ void SpecBase::doPackage(const hecl::ProjectPath& path, const hecl::Database::Da /* Write resource data and build file index */ std::vector> fileIndex; - Log.report(logvisor::Info, fmt(_SYS_STR("Copying data into {}")), outPath.getRelativePath()); + Log.report(logvisor::Info, FMT_STRING(_SYS_STR("Copying data into {}")), outPath.getRelativePath()); copyBuildListData(fileIndex, buildList, entry, fast, progress, pakOut, mlvlData); /* Write file index */ @@ -688,9 +688,9 @@ hecl::ProjectPath SpecBase::getCookedPath(const hecl::ProjectPath& working, bool return working.getCookedPath(*spec); } -static void PNGErr(png_structp png, png_const_charp msg) { Log.report(logvisor::Error, fmt("{}"), msg); } +static void PNGErr(png_structp png, png_const_charp msg) { Log.report(logvisor::Error, FMT_STRING("{}"), msg); } -static void PNGWarn(png_structp png, png_const_charp msg) { Log.report(logvisor::Warning, fmt("{}"), msg); } +static void PNGWarn(png_structp png, png_const_charp msg) { Log.report(logvisor::Warning, FMT_STRING("{}"), msg); } constexpr uint8_t Convert4To8(uint8_t v) { /* Swizzle bits: 00001234 -> 12341234 */ @@ -703,12 +703,12 @@ void SpecBase::extractRandomStaticEntropy(const uint8_t* buf, const hecl::Projec entropyPath.makeDirChain(false); if (const auto fp = hecl::FopenUnique(catalogPath.getAbsolutePath().data(), _SYS_STR("a"))) { - fmt::print(fp.get(), fmt("RandomStaticEntropy: {}\n"), entropyPath.getRelativePathUTF8()); + fmt::print(fp.get(), FMT_STRING("RandomStaticEntropy: {}\n"), entropyPath.getRelativePathUTF8()); } auto fp = hecl::FopenUnique(entropyPath.getAbsolutePath().data(), _SYS_STR("wb")); if (fp == nullptr) { - Log.report(logvisor::Error, fmt(_SYS_STR("Unable to open '{}' for writing")), entropyPath.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("Unable to open '{}' for writing")), entropyPath.getAbsolutePath()); return; } png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, PNGErr, PNGWarn); @@ -852,7 +852,7 @@ void SpecBase::enumerateNamedResources( static void WriteTag(athena::io::YAMLDocWriter& cacheWriter, const urde::SObjectTag& pathTag, const hecl::ProjectPath& path) { - auto key = fmt::format(fmt("{}"), pathTag.id); + auto key = fmt::format(FMT_STRING("{}"), pathTag.id); if (auto* existing = cacheWriter.getCurNode()->findMapChild(key)) { existing->m_seqChildren.emplace_back(athena::io::ValToNode(path.getEncodableStringUTF8())); } else if (auto v = cacheWriter.enterSubVector(key)) { @@ -863,7 +863,7 @@ static void WriteTag(athena::io::YAMLDocWriter& cacheWriter, const urde::SObject static void WriteNameTag(athena::io::YAMLDocWriter& nameWriter, const urde::SObjectTag& pathTag, std::string_view name) { - nameWriter.writeString(name.data(), fmt::format(fmt("{}"), pathTag.id)); + nameWriter.writeString(name.data(), fmt::format(FMT_STRING("{}"), pathTag.id)); } void SpecBase::readCatalog(const hecl::ProjectPath& catalogPath, athena::io::YAMLDocWriter& nameWriter) { @@ -907,7 +907,7 @@ void SpecBase::readCatalog(const hecl::ProjectPath& catalogPath, athena::io::YAM WriteNameTag(nameWriter, pathTag, p.first); #if 0 - fmt::print(stderr, fmt("{} {} {:08X}\n"), p.first, pathTag.type.toString(), pathTag.id.Value()); + fmt::print(stderr, FMT_STRING("{} {} {:08X}\n"), p.first, pathTag.type.toString(), pathTag.id.Value()); #endif } } @@ -948,7 +948,7 @@ void SpecBase::insertPathTag(athena::io::YAMLDocWriter& cacheWriter, const urde: if (search != m_tagToPath.end() && search->second != path && tag.type != FOURCC('CINF') && tag.type != FOURCC('CSKR') && tag.type != FOURCC('ANIM') && tag.type != FOURCC('EVNT')) { - Log.report(logvisor::Fatal, fmt(_SYS_STR("'{}|{}' already exists for tag {} as '{}|{}'")), + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("'{}|{}' already exists for tag {} as '{}|{}'")), path.getRelativePath(), path.getAuxInfo(), tag, search->second.getRelativePath(), search->second.getAuxInfo()); } @@ -958,7 +958,7 @@ void SpecBase::insertPathTag(athena::io::YAMLDocWriter& cacheWriter, const urde: WriteTag(cacheWriter, tag, path); #if DUMP_CACHE_FILL if (dump) - fmt::print(stderr, fmt("{} {}\n"), tag, path.getRelativePathUTF8()); + fmt::print(stderr, FMT_STRING("{} {}\n"), tag, path.getRelativePathUTF8()); #endif } @@ -997,9 +997,9 @@ bool SpecBase::addFileToIndex(const hecl::ProjectPath& path, athena::io::YAMLDoc hecl::ProjectPath subPath; if (!sub.second.empty()) { hecl::SystemStringConv cskrId(sub.second); - subPath = asGlob.ensureAuxInfo(fmt::format(fmt(_SYS_STR("{}_{}.CSKR")), subName, cskrId)); + subPath = asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}_{}.CSKR")), subName, cskrId)); } else { - subPath = asGlob.ensureAuxInfo(fmt::format(fmt(_SYS_STR("{}.CSKR")), subName)); + subPath = asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}.CSKR")), subName)); } insertPathTag(cacheWriter, buildTagFromPath(subPath), subPath); @@ -1009,10 +1009,10 @@ bool SpecBase::addFileToIndex(const hecl::ProjectPath& path, athena::io::YAMLDoc hecl::SystemStringConv overlayCskrId(overlay.second); if (!overlay.second.empty()) { subPath = - asGlob.ensureAuxInfo(fmt::format(fmt(_SYS_STR("{}.{}_{}.CSKR")), subName, overlaySys, overlayCskrId)); + asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}.{}_{}.CSKR")), subName, overlaySys, overlayCskrId)); } else { subPath = - asGlob.ensureAuxInfo(fmt::format(fmt(_SYS_STR("{}.{}.CSKR")), subName, overlaySys)); + asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}.{}.CSKR")), subName, overlaySys)); } insertPathTag(cacheWriter, buildTagFromPath(subPath), subPath); } @@ -1025,10 +1025,10 @@ bool SpecBase::addFileToIndex(const hecl::ProjectPath& path, athena::io::YAMLDoc hecl::ProjectPath subPath; if (!attachment.second.empty()) { subPath = - asGlob.ensureAuxInfo(fmt::format(fmt(_SYS_STR("ATTACH.{}_{}.CSKR")), attachmentSys, attachmentCskrId)); + asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("ATTACH.{}_{}.CSKR")), attachmentSys, attachmentCskrId)); } else { subPath = - asGlob.ensureAuxInfo(fmt::format(fmt(_SYS_STR("ATTACH.{}.CSKR")), attachmentSys)); + asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("ATTACH.{}.CSKR")), attachmentSys)); } insertPathTag(cacheWriter, buildTagFromPath(subPath), subPath); } @@ -1038,9 +1038,9 @@ bool SpecBase::addFileToIndex(const hecl::ProjectPath& path, athena::io::YAMLDoc hecl::SystemStringConv animId(act.second); hecl::ProjectPath subPath; if (!act.second.empty()) { - subPath = asGlob.ensureAuxInfo(fmt::format(fmt(_SYS_STR("{}_{}.ANIM")), sysStr, animId)); + subPath = asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}_{}.ANIM")), sysStr, animId)); } else { - subPath = asGlob.ensureAuxInfo(fmt::format(fmt(_SYS_STR("{}.ANIM")), sysStr)); + subPath = asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}.ANIM")), sysStr)); } insertPathTag(cacheWriter, buildTagFromPath(subPath), subPath); } @@ -1108,7 +1108,7 @@ void SpecBase::backgroundIndexProc() { if (tagCachePath.isFile()) { athena::io::FileReader reader(tagCachePath.getAbsolutePath()); if (reader.isOpen()) { - Log.report(logvisor::Info, fmt(_SYS_STR("Cache index of '{}' loading")), getOriginalSpec().m_name); + Log.report(logvisor::Info, FMT_STRING(_SYS_STR("Cache index of '{}' loading")), getOriginalSpec().m_name); athena::io::YAMLDocReader cacheReader; if (cacheReader.parse(&reader)) { std::unique_lock lk(m_backgroundIndexMutex); @@ -1134,16 +1134,16 @@ void SpecBase::backgroundIndexProc() { ++loadIdx; if (!(loadIdx % 100)) - fmt::print(stderr, fmt("\r {} / {}"), loadIdx, tagCount); + fmt::print(stderr, FMT_STRING("\r {} / {}"), loadIdx, tagCount); } - fmt::print(stderr, fmt("\r {} / {}\n"), loadIdx, tagCount); + fmt::print(stderr, FMT_STRING("\r {} / {}\n"), loadIdx, tagCount); } - Log.report(logvisor::Info, fmt(_SYS_STR("Cache index of '{}' loaded; {} tags")), getOriginalSpec().m_name, + Log.report(logvisor::Info, FMT_STRING(_SYS_STR("Cache index of '{}' loaded; {} tags")), getOriginalSpec().m_name, m_tagToPath.size()); if (nameCachePath.isFile()) { /* Read in name cache */ - Log.report(logvisor::Info, fmt(_SYS_STR("Name index of '{}' loading")), getOriginalSpec().m_name); + Log.report(logvisor::Info, FMT_STRING(_SYS_STR("Name index of '{}' loading")), getOriginalSpec().m_name); athena::io::FileReader nreader(nameCachePath.getAbsolutePath()); athena::io::YAMLDocReader nameReader; if (nameReader.parse(&nreader)) { @@ -1162,13 +1162,13 @@ void SpecBase::backgroundIndexProc() { } } } - Log.report(logvisor::Info, fmt(_SYS_STR("Name index of '{}' loaded; {} names")), getOriginalSpec().m_name, + Log.report(logvisor::Info, FMT_STRING(_SYS_STR("Name index of '{}' loaded; {} names")), getOriginalSpec().m_name, m_catalogNameToTag.size()); } } } - Log.report(logvisor::Info, fmt(_SYS_STR("Background index of '{}' started")), getOriginalSpec().m_name); + Log.report(logvisor::Info, FMT_STRING(_SYS_STR("Background index of '{}' started")), getOriginalSpec().m_name); backgroundIndexRecursiveProc(specRoot, cacheWriter, nameWriter, 0); tagCachePath.makeDirChain(false); @@ -1179,7 +1179,7 @@ void SpecBase::backgroundIndexProc() { nameWriter.finish(&nwriter); m_backgroundBlender.shutdown(); - Log.report(logvisor::Info, fmt(_SYS_STR("Background index of '{}' complete; {} tags, {} names")), + Log.report(logvisor::Info, FMT_STRING(_SYS_STR("Background index of '{}' complete; {} tags, {} names")), getOriginalSpec().m_name, m_tagToPath.size(), m_catalogNameToTag.size()); m_backgroundRunning = false; } diff --git a/DataSpec/SpecMP1.cpp b/DataSpec/SpecMP1.cpp index 57150d232..02ad59323 100644 --- a/DataSpec/SpecMP1.cpp +++ b/DataSpec/SpecMP1.cpp @@ -69,10 +69,10 @@ struct TextureCache { texturePath.makeDirChain(false); if (const auto fp = hecl::FopenUnique(catalogPath.getAbsolutePath().data(), _SYS_STR("a"))) { - fmt::print(fp.get(), fmt("TextureCache: {}\n"), texturePath.getRelativePathUTF8()); + fmt::print(fp.get(), FMT_STRING("TextureCache: {}\n"), texturePath.getRelativePathUTF8()); } - Log.report(logvisor::Level::Info, fmt("Gathering Texture metadata (this can take up to 10 seconds)...")); + Log.report(logvisor::Level::Info, FMT_STRING("Gathering Texture metadata (this can take up to 10 seconds)...")); std::unordered_map metaMap; pakRouter.enumerateResources([&](const DNAMP1::PAK::Entry* ent) { @@ -92,7 +92,7 @@ struct TextureCache { athena::io::FileWriter fileW(texturePath.getAbsolutePath()); yamlW.finish(&fileW); - Log.report(logvisor::Level::Info, fmt("Done...")); + Log.report(logvisor::Level::Info, FMT_STRING("Done...")); } static void Cook(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outPath) { @@ -740,7 +740,7 @@ struct SpecMP1 : SpecBase { } if (!colMesh) - Log.report(logvisor::Fatal, fmt(_SYS_STR("unable to find mesh named 'CMESH' in {}")), in.getAbsolutePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("unable to find mesh named 'CMESH' in {}")), in.getAbsolutePath()); std::vector lights = ds.compileLights(); @@ -978,7 +978,7 @@ struct SpecMP1 : SpecBase { { athena::io::FileReader r(worldPathCooked.getAbsolutePath()); if (r.hasError()) - Log.report(logvisor::Fatal, fmt(_SYS_STR("Unable to open world {}")), worldPathCooked.getRelativePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Unable to open world {}")), worldPathCooked.getRelativePath()); mlvl.read(r); } @@ -1074,10 +1074,10 @@ struct SpecMP1 : SpecBase { if (hecl::ProjectPath mapCookedPath = getCookedPath(mapPath, true)) { athena::io::FileReader r(mapCookedPath.getAbsolutePath()); if (r.hasError()) - Log.report(logvisor::Fatal, fmt(_SYS_STR("Unable to open {}")), mapCookedPath.getRelativePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Unable to open {}")), mapCookedPath.getRelativePath()); if (r.readUint32Big() != 0xDEADF00D) - Log.report(logvisor::Fatal, fmt(_SYS_STR("Corrupt MAPW {}")), mapCookedPath.getRelativePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Corrupt MAPW {}")), mapCookedPath.getRelativePath()); r.readUint32Big(); atUint32 mapaCount = r.readUint32Big(); for (atUint32 i = 0; i < mapaCount; ++i) { @@ -1100,7 +1100,7 @@ struct SpecMP1 : SpecBase { for (const auto& tex : textures) { urde::SObjectTag texTag = tagFromPath(tex); if (!texTag) - Log.report(logvisor::Fatal, fmt(_SYS_STR("Unable to resolve {}")), tex.getRelativePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Unable to resolve {}")), tex.getRelativePath()); listOut.push_back(texTag); } } diff --git a/DataSpec/SpecMP2.cpp b/DataSpec/SpecMP2.cpp index 1c4614f51..b7789685c 100644 --- a/DataSpec/SpecMP2.cpp +++ b/DataSpec/SpecMP2.cpp @@ -35,10 +35,10 @@ struct TextureCache { texturePath.makeDirChain(false); if (const auto fp = hecl::FopenUnique(catalogPath.getAbsolutePath().data(), _SYS_STR("a"))) { - fmt::print(fp.get(), fmt("TextureCache: {}\n"), texturePath.getRelativePathUTF8()); + fmt::print(fp.get(), FMT_STRING("TextureCache: {}\n"), texturePath.getRelativePathUTF8()); } - Log.report(logvisor::Level::Info, fmt("Gathering Texture metadata (this can take up to 10 seconds)...")); + Log.report(logvisor::Level::Info, FMT_STRING("Gathering Texture metadata (this can take up to 10 seconds)...")); std::unordered_map metaMap; pakRouter.enumerateResources([&](const DNAMP2::PAK::Entry* ent) { @@ -58,7 +58,7 @@ struct TextureCache { athena::io::FileWriter fileW(texturePath.getAbsolutePath()); yamlW.finish(&fileW); - Log.report(logvisor::Level::Info, fmt("Done...")); + Log.report(logvisor::Level::Info, FMT_STRING("Done...")); } static void Cook(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outPath) { diff --git a/DataSpec/SpecMP3.cpp b/DataSpec/SpecMP3.cpp index 4dfd8aaa7..c378bb8c0 100644 --- a/DataSpec/SpecMP3.cpp +++ b/DataSpec/SpecMP3.cpp @@ -32,10 +32,10 @@ struct TextureCache { texturePath.makeDirChain(false); if (const auto fp = hecl::FopenUnique(catalogPath.getAbsolutePath().data(), _SYS_STR("a"))) { - fmt::print(fp.get(), fmt("TextureCache: {}\n"), texturePath.getRelativePathUTF8()); + fmt::print(fp.get(), FMT_STRING("TextureCache: {}\n"), texturePath.getRelativePathUTF8()); } - Log.report(logvisor::Level::Info, fmt("Gathering Texture metadata (this can take up to 10 seconds)...")); + Log.report(logvisor::Level::Info, FMT_STRING("Gathering Texture metadata (this can take up to 10 seconds)...")); std::unordered_map metaMap; pakRouter.enumerateResources([&](const DNAMP3::PAK::Entry* ent) { @@ -55,7 +55,7 @@ struct TextureCache { athena::io::FileWriter fileW(texturePath.getAbsolutePath()); yamlW.finish(&fileW); - Log.report(logvisor::Level::Info, fmt("Done...")); + Log.report(logvisor::Level::Info, FMT_STRING("Done...")); } static void Cook(const hecl::ProjectPath& inPath, const hecl::ProjectPath& outPath) { diff --git a/Editor/ProjectManager.cpp b/Editor/ProjectManager.cpp index a32454488..90ab66886 100644 --- a/Editor/ProjectManager.cpp +++ b/Editor/ProjectManager.cpp @@ -48,7 +48,7 @@ ProjectManager::ProjectManager(ViewManager& vm) bool ProjectManager::newProject(hecl::SystemStringView path) { hecl::ProjectRootPath projPath = hecl::SearchForProject(path); if (projPath) { - Log.report(logvisor::Warning, fmt(_SYS_STR("project already exists at '{}'")), path); + Log.report(logvisor::Warning, FMT_STRING(_SYS_STR("project already exists at '{}'")), path); return false; } @@ -63,7 +63,7 @@ bool ProjectManager::newProject(hecl::SystemStringView path) { m_vm.SetupEditorView(); saveProject(); - m_vm.m_mainWindow->setTitle(fmt::format(fmt(_SYS_STR("{} - URDE [{}]")), + m_vm.m_mainWindow->setTitle(fmt::format(FMT_STRING(_SYS_STR("{} - URDE [{}]")), m_proj->getProjectRootPath().getLastComponent(), m_vm.platformName())); m_vm.DismissSplash(); m_vm.FadeInEditors(); @@ -75,7 +75,7 @@ bool ProjectManager::openProject(hecl::SystemStringView path) { hecl::SystemString subPath; hecl::ProjectRootPath projPath = hecl::SearchForProject(path, subPath); if (!projPath) { - Log.report(logvisor::Warning, fmt(_SYS_STR("project doesn't exist at '{}'")), path); + Log.report(logvisor::Warning, FMT_STRING(_SYS_STR("project doesn't exist at '{}'")), path); return false; } @@ -103,7 +103,7 @@ bool ProjectManager::openProject(hecl::SystemStringView path) { if (needsSave) saveProject(); - m_vm.m_mainWindow->setTitle(fmt::format(fmt(_SYS_STR("{} - URDE [{}]")), + m_vm.m_mainWindow->setTitle(fmt::format(FMT_STRING(_SYS_STR("{} - URDE [{}]")), m_proj->getProjectRootPath().getLastComponent(), m_vm.platformName())); m_vm.DismissSplash(); m_vm.FadeInEditors(); diff --git a/Editor/ProjectResourceFactoryBase.cpp b/Editor/ProjectResourceFactoryBase.cpp index 52a398036..5bf32e6ea 100644 --- a/Editor/ProjectResourceFactoryBase.cpp +++ b/Editor/ProjectResourceFactoryBase.cpp @@ -22,7 +22,7 @@ void ProjectResourceFactoryBase::BeginBackgroundIndex(hecl::Database::Project& p } bool ProjectResourceFactoryBase::SyncCook(const hecl::ProjectPath& working) { - Log.report(logvisor::Warning, fmt(_SYS_STR("sync-cooking {}")), working.getRelativePath()); + Log.report(logvisor::Warning, FMT_STRING(_SYS_STR("sync-cooking {}")), working.getRelativePath()); return m_clientProc.syncCook(working, m_cookSpec.get(), hecl::blender::SharedBlenderToken, false, false); } @@ -38,12 +38,12 @@ CFactoryFnReturn ProjectResourceFactoryBase::BuildSync(const SObjectTag& tag, co u32 length = fr->length(); std::unique_ptr memBuf = fr->readUBytes(length); CFactoryFnReturn ret = m_factoryMgr.MakeObjectFromMemory(tag, std::move(memBuf), length, false, paramXfer, selfRef); - Log.report(logvisor::Info, fmt("sync-built {}"), tag); + Log.report(logvisor::Info, FMT_STRING("sync-built {}"), tag); return ret; } CFactoryFnReturn ret = m_factoryMgr.MakeObject(tag, *fr, paramXfer, selfRef); - Log.report(logvisor::Info, fmt("sync-built {}"), tag); + Log.report(logvisor::Info, FMT_STRING("sync-built {}"), tag); return ret; } @@ -53,7 +53,7 @@ void ProjectResourceFactoryBase::AsyncTask::EnsurePath(const urde::SObjectTag& t /* Ensure requested resource is on the filesystem */ if (!path.isFileOrGlob()) { - Log.report(logvisor::Error, fmt(_SYS_STR("unable to find resource path '{}'")), path.getRelativePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("unable to find resource path '{}'")), path.getRelativePath()); m_failed = true; return; } @@ -66,7 +66,7 @@ void ProjectResourceFactoryBase::AsyncTask::EnsurePath(const urde::SObjectTag& t /* Last chance type validation */ urde::SObjectTag verifyTag = m_parent.TagFromPath(path); if (verifyTag.type != tag.type) { - Log.report(logvisor::Error, fmt(_SYS_STR("{}: expected type '{}', found '{}'")), path.getRelativePath(), + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("{}: expected type '{}', found '{}'")), path.getRelativePath(), tag.type, verifyTag.type); m_failed = true; return; @@ -91,7 +91,7 @@ void ProjectResourceFactoryBase::AsyncTask::CookComplete() { /* Ensure cooked rep is on the filesystem */ athena::io::FileReader fr(m_cookedPath.getAbsolutePath(), 32 * 1024, false); if (fr.hasError()) { - Log.report(logvisor::Error, fmt(_SYS_STR("unable to open cooked resource path '{}'")), m_cookedPath.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("unable to open cooked resource path '{}'")), m_cookedPath.getAbsolutePath()); m_failed = true; return; } @@ -171,7 +171,7 @@ bool ProjectResourceFactoryBase::PrepForReadSync(const SObjectTag& tag, const he std::optional& fr) { /* Ensure requested resource is on the filesystem */ if (!path.isFileOrGlob()) { - Log.report(logvisor::Error, fmt(_SYS_STR("unable to find resource path '{}'")), path.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("unable to find resource path '{}'")), path.getAbsolutePath()); return false; } @@ -183,7 +183,7 @@ bool ProjectResourceFactoryBase::PrepForReadSync(const SObjectTag& tag, const he /* Last chance type validation */ urde::SObjectTag verifyTag = TagFromPath(path); if (verifyTag.type != tag.type) { - Log.report(logvisor::Error, fmt(_SYS_STR("{}: expected type '{}', found '{}'")), path.getRelativePath(), + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("{}: expected type '{}', found '{}'")), path.getRelativePath(), tag.type, verifyTag.type); return false; } @@ -195,7 +195,7 @@ bool ProjectResourceFactoryBase::PrepForReadSync(const SObjectTag& tag, const he if (!cooked.isFile() || cooked.getModtime() < path.getModtime()) { /* Do a blocking cook here */ if (!SyncCook(path)) { - Log.report(logvisor::Error, fmt(_SYS_STR("unable to cook resource path '{}'")), path.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("unable to cook resource path '{}'")), path.getAbsolutePath()); return false; } } @@ -204,7 +204,7 @@ bool ProjectResourceFactoryBase::PrepForReadSync(const SObjectTag& tag, const he /* Ensure cooked rep is on the filesystem */ fr.emplace(cooked.getAbsolutePath(), 32 * 1024, false); if (fr->hasError()) { - Log.report(logvisor::Error, fmt(_SYS_STR("unable to open cooked resource path '{}'")), cooked.getAbsolutePath()); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("unable to open cooked resource path '{}'")), cooked.getAbsolutePath()); return false; } @@ -215,7 +215,7 @@ std::unique_ptr ProjectResourceFactoryBase::Build(const urde::SObjec const urde::CVParamTransfer& paramXfer, CObjectReference* selfRef) { if (!tag.id.IsValid()) - Log.report(logvisor::Fatal, fmt("attempted to access null id on type '{}'"), tag.type); + Log.report(logvisor::Fatal, FMT_STRING("attempted to access null id on type '{}'"), tag.type); const hecl::ProjectPath* resPath = nullptr; if (!WaitForTagReady(tag, resPath)) @@ -243,14 +243,14 @@ std::unique_ptr ProjectResourceFactoryBase::Build(const urde::SObjec } //*task.xc_targetObjPtr = newObj.get(); - Log.report(logvisor::Warning, fmt("spin-built {}"), task.x0_tag); + Log.report(logvisor::Warning, FMT_STRING("spin-built {}"), task.x0_tag); _RemoveTask(asyncSearch); return newObj; } else if (task.m_complete) { - Log.report(logvisor::Error, fmt("unable to spin-build {}; Resource requested as cook-only"), task.x0_tag); + Log.report(logvisor::Error, FMT_STRING("unable to spin-build {}; Resource requested as cook-only"), task.x0_tag); } else { - Log.report(logvisor::Error, fmt("unable to spin-build {}"), task.x0_tag); + Log.report(logvisor::Error, FMT_STRING("unable to spin-build {}"), task.x0_tag); } _RemoveTask(asyncSearch); @@ -273,14 +273,14 @@ std::shared_ptr ProjectResourceFactoryBase::BuildAsyncInternal(const void ProjectResourceFactoryBase::BuildAsync(const urde::SObjectTag& tag, const urde::CVParamTransfer& paramXfer, std::unique_ptr* objOut, CObjectReference* selfRef) { if (!tag.id.IsValid()) - Log.report(logvisor::Fatal, fmt("attempted to access null id on type '{}'"), tag.type); + Log.report(logvisor::Fatal, FMT_STRING("attempted to access null id on type '{}'"), tag.type); BuildAsyncInternal(tag, paramXfer, objOut, selfRef); } u32 ProjectResourceFactoryBase::ResourceSize(const SObjectTag& tag) { if (!tag.id.IsValid()) - Log.report(logvisor::Fatal, fmt("attempted to access null id on type '{}'"), tag.type); + Log.report(logvisor::Fatal, FMT_STRING("attempted to access null id on type '{}'"), tag.type); /* Ensure resource at requested path is indexed and not cooking */ const hecl::ProjectPath* resPath = nullptr; @@ -298,7 +298,7 @@ u32 ProjectResourceFactoryBase::ResourceSize(const SObjectTag& tag) { std::shared_ptr ProjectResourceFactoryBase::LoadResourceAsync(const urde::SObjectTag& tag, void* target) { if (!tag.id.IsValid()) - Log.report(logvisor::Fatal, fmt("attempted to access null id")); + Log.report(logvisor::Fatal, FMT_STRING("attempted to access null id")); if (m_asyncLoadMap.find(tag) != m_asyncLoadMap.end()) return {}; return std::static_pointer_cast( @@ -308,7 +308,7 @@ std::shared_ptr ProjectResourceFactoryBase::LoadResourceAsync std::shared_ptr ProjectResourceFactoryBase::LoadResourcePartAsync(const urde::SObjectTag& tag, u32 off, u32 size, void* target) { if (!tag.id.IsValid()) - Log.report(logvisor::Fatal, fmt("attempted to access null id")); + Log.report(logvisor::Fatal, FMT_STRING("attempted to access null id")); if (m_asyncLoadMap.find(tag) != m_asyncLoadMap.end()) return {}; return std::static_pointer_cast( @@ -317,7 +317,7 @@ std::shared_ptr ProjectResourceFactoryBase::LoadResourcePartA std::unique_ptr ProjectResourceFactoryBase::LoadResourceSync(const urde::SObjectTag& tag) { if (!tag.id.IsValid()) - Log.report(logvisor::Fatal, fmt("attempted to access null id")); + Log.report(logvisor::Fatal, FMT_STRING("attempted to access null id")); /* Ensure resource at requested path is indexed and not cooking */ const hecl::ProjectPath* resPath = nullptr; @@ -335,7 +335,7 @@ std::unique_ptr ProjectResourceFactoryBase::LoadResourceSync(const urde::S std::unique_ptr ProjectResourceFactoryBase::LoadNewResourcePartSync(const urde::SObjectTag& tag, u32 off, u32 size) { if (!tag.id.IsValid()) - Log.report(logvisor::Fatal, fmt("attempted to access null id")); + Log.report(logvisor::Fatal, FMT_STRING("attempted to access null id")); /* Ensure resource at requested path is indexed and not cooking */ const hecl::ProjectPath* resPath = nullptr; @@ -354,7 +354,7 @@ std::unique_ptr ProjectResourceFactoryBase::LoadNewResourcePartSync(const std::shared_ptr ProjectResourceFactoryBase::CookResourceAsync(const urde::SObjectTag& tag) { if (!tag.id.IsValid()) - Log.report(logvisor::Fatal, fmt("attempted to access null id")); + Log.report(logvisor::Fatal, FMT_STRING("attempted to access null id")); if (m_asyncLoadMap.find(tag) != m_asyncLoadMap.end()) return {}; return _AddTask(std::make_shared(*this, tag)); @@ -364,7 +364,7 @@ void ProjectResourceFactoryBase::CancelBuild(const urde::SObjectTag& tag) { _Rem bool ProjectResourceFactoryBase::CanBuild(const urde::SObjectTag& tag) { if (!tag.id.IsValid()) - Log.report(logvisor::Fatal, fmt("attempted to access null id")); + Log.report(logvisor::Fatal, FMT_STRING("attempted to access null id")); const hecl::ProjectPath* resPath = nullptr; if (!WaitForTagReady(tag, resPath)) @@ -400,7 +400,7 @@ bool ProjectResourceFactoryBase::AsyncPumpTask(ItType& it) { hecl::ProjectPath path = static_cast(*m_cookSpec).pathFromTag(task.x0_tag); if (!path) { if (!static_cast(*m_cookSpec).backgroundIndexRunning()) { - Log.report(logvisor::Error, fmt(_SYS_STR("unable to find async load resource ({})")), task.x0_tag); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("unable to find async load resource ({})")), task.x0_tag); it = _RemoveTask(it); } return true; @@ -423,14 +423,14 @@ bool ProjectResourceFactoryBase::AsyncPumpTask(ItType& it) { } *task.xc_targetObjPtr = std::move(newObj); - Log.report(logvisor::Info, fmt("async-built {}"), task.x0_tag); + Log.report(logvisor::Info, FMT_STRING("async-built {}"), task.x0_tag); } else if (task.xc_targetDataPtr) { /* Buffer only */ *task.xc_targetDataPtr = std::move(task.x10_loadBuffer); - Log.report(logvisor::Info, fmt("async-loaded {}"), task.x0_tag); + Log.report(logvisor::Info, FMT_STRING("async-loaded {}"), task.x0_tag); } else if (task.xc_targetDataRawPtr) { /* Buffer only raw */ - Log.report(logvisor::Info, fmt("async-loaded {}"), task.x0_tag); + Log.report(logvisor::Info, FMT_STRING("async-loaded {}"), task.x0_tag); } } diff --git a/Editor/Space.cpp b/Editor/Space.cpp index 02abd50ee..1f1b02a42 100644 --- a/Editor/Space.cpp +++ b/Editor/Space.cpp @@ -100,7 +100,7 @@ specter::View* SplitSpace::buildContentView(specter::ViewResources& res) { void SplitSpace::setChildSlot(unsigned slot, std::unique_ptr&& space) { if (slot > 1) - Log.report(logvisor::Fatal, fmt("invalid slot {} for SplitView"), slot); + Log.report(logvisor::Fatal, FMT_STRING("invalid slot {} for SplitView"), slot); m_slots[slot] = std::move(space); m_slots[slot]->m_parent = this; } @@ -162,7 +162,7 @@ std::unique_ptr RootSpace::exchangeSpaceSplitJoin(Space* removeSpace, std m_spaceTree.swap(ret); m_spaceTree->m_parent = this; } else - Log.report(logvisor::Fatal, fmt("RootSpace::exchangeSpaceSplitJoin() failure")); + Log.report(logvisor::Fatal, FMT_STRING("RootSpace::exchangeSpaceSplitJoin() failure")); return ret; } @@ -177,7 +177,7 @@ std::unique_ptr SplitSpace::exchangeSpaceSplitJoin(Space* removeSpace, st m_slots[1].swap(ret); m_slots[1]->m_parent = this; } else - Log.report(logvisor::Fatal, fmt("SplitSpace::exchangeSpaceSplitJoin() failure")); + Log.report(logvisor::Fatal, FMT_STRING("SplitSpace::exchangeSpaceSplitJoin() failure")); return ret; } diff --git a/Editor/SplashScreen.cpp b/Editor/SplashScreen.cpp index d0469e6e8..712c92f9c 100644 --- a/Editor/SplashScreen.cpp +++ b/Editor/SplashScreen.cpp @@ -36,12 +36,12 @@ SplashScreen::SplashScreen(ViewManager& vm, specter::ViewResources& res) if (GIT_COMMIT_DATE[0] != '\0' && GIT_COMMIT_HASH[0] != '\0' && GIT_BRANCH[0] != '\0') { #ifdef URDE_DLPACKAGE if ((URDE_DLPACKAGE)[0]) - m_buildInfoStr = fmt::format(fmt("{}: {}\n{}: {}\n{}: {}"), vm.translate(), + m_buildInfoStr = fmt::format(FMT_STRING("{}: {}\n{}: {}\n{}: {}"), vm.translate(), URDE_DLPACKAGE, vm.translate(), GIT_COMMIT_HASH, vm.translate(), GIT_COMMIT_DATE); else #endif - m_buildInfoStr = fmt::format(fmt("{}: {}\n{}: {}\n{}: {}"), vm.translate(), GIT_BRANCH, + m_buildInfoStr = fmt::format(FMT_STRING("{}: {}\n{}: {}\n{}: {}"), vm.translate(), GIT_BRANCH, vm.translate(), GIT_COMMIT_HASH, vm.translate(), GIT_COMMIT_DATE); } @@ -65,15 +65,15 @@ void SplashScreen::think() { m_openButt.m_view->think(); if (m_newProjBind.m_deferPath.size()) { - Log.report(logvisor::Info, fmt(_SYS_STR("Making project '{}'")), m_newProjBind.m_deferPath); + Log.report(logvisor::Info, FMT_STRING(_SYS_STR("Making project '{}'")), m_newProjBind.m_deferPath); m_vm.projectManager().newProject(m_newProjBind.m_deferPath); m_newProjBind.m_deferPath.clear(); } else if (m_openProjBind.m_deferPath.size()) { - Log.report(logvisor::Info, fmt(_SYS_STR("Opening project '{}'")), m_openProjBind.m_deferPath); + Log.report(logvisor::Info, FMT_STRING(_SYS_STR("Opening project '{}'")), m_openProjBind.m_deferPath); m_vm.projectManager().openProject(m_openProjBind.m_deferPath); m_openProjBind.m_deferPath.clear(); } else if (m_extractProjBind.m_deferPath.size()) { - Log.report(logvisor::Info, fmt(_SYS_STR("Extracting game '{}'")), m_extractProjBind.m_deferPath); + Log.report(logvisor::Info, FMT_STRING(_SYS_STR("Extracting game '{}'")), m_extractProjBind.m_deferPath); m_vm.projectManager().extractGame(m_extractProjBind.m_deferPath); m_extractProjBind.m_deferPath.clear(); } diff --git a/Editor/ViewManager.cpp b/Editor/ViewManager.cpp index 11b29bfeb..99438caab 100644 --- a/Editor/ViewManager.cpp +++ b/Editor/ViewManager.cpp @@ -70,14 +70,14 @@ void ViewManager::TestGameView::think() { const hecl::CVar* showResourceStats = hecl::CVarManager::instance()->findCVar("debugOverlay.showResourceStats"); if (g_StateManager) { if (showFrameIdx && showFrameIdx->toBoolean()) - overlayText += fmt::format(fmt("Frame: {}\n"), g_StateManager->GetUpdateFrameIndex()); + overlayText += fmt::format(FMT_STRING("Frame: {}\n"), g_StateManager->GetUpdateFrameIndex()); if (showInGameTime && showInGameTime->toBoolean()) { double igt = g_GameState->GetTotalPlayTime(); u32 ms = u64(igt * 1000) % 1000; auto pt = std::div(igt, 3600); overlayText += - fmt::format(fmt("PlayTime: {:02d}:{:02d}:{:02d}.{:03d}\n"), pt.quot, pt.rem / 60, pt.rem % 60, ms); + fmt::format(FMT_STRING("PlayTime: {:02d}:{:02d}:{:02d}.{:03d}\n"), pt.quot, pt.rem / 60, pt.rem % 60, ms); } if (g_StateManager->Player() && playerInfo && playerInfo->toBoolean()) { @@ -85,7 +85,7 @@ void ViewManager::TestGameView::think() { const zeus::CQuaternion plQ = zeus::CQuaternion(pl.GetTransform().getRotation().buildMatrix3f()); const zeus::CTransform camXf = g_StateManager->GetCameraManager()->GetCurrentCameraTransform(*g_StateManager); const zeus::CQuaternion camQ = zeus::CQuaternion(camXf.getRotation().buildMatrix3f()); - overlayText += fmt::format(fmt("Player Position: x {}, y {}, z {}\n" + overlayText += fmt::format(FMT_STRING("Player Position: x {}, y {}, z {}\n" " Roll: {}, Pitch: {}, Yaw: {}\n" " Momentum: x {}, y: {}, z: {}\n" " Velocity: x {}, y: {}, z: {}\n" @@ -102,7 +102,7 @@ void ViewManager::TestGameView::think() { TLockedToken tbl = g_SimplePool->GetObj({FOURCC('STRG'), g_StateManager->GetWorld()->IGetStringTableAssetId()}); const urde::TAreaId aId = g_GameState->CurrentWorldState().GetCurrentAreaId(); - overlayText += fmt::format(fmt("World: 0x{}{}, Area: {}\n"), g_GameState->CurrentWorldAssetId(), + overlayText += fmt::format(FMT_STRING("World: 0x{}{}, Area: {}\n"), g_GameState->CurrentWorldAssetId(), (tbl.IsLoaded() ? (" " + hecl::Char16ToUTF8(tbl->GetString(0))).c_str() : ""), aId); } @@ -119,7 +119,7 @@ void ViewManager::TestGameView::think() { } else layerBits += "0"; } - overlayText += fmt::format(fmt("Area AssetId: 0x{}, Total Objects: {}\n" + overlayText += fmt::format(FMT_STRING("Area AssetId: 0x{}, Total Objects: {}\n" "Active Layer bits: {}\n"), g_StateManager->GetWorld()->GetArea(aId)->GetAreaAssetId(), g_StateManager->GetAllObjectList().size(), layerBits); @@ -127,7 +127,7 @@ void ViewManager::TestGameView::think() { } if (showResourceStats && showResourceStats->toBoolean()) - overlayText += fmt::format(fmt("Resource Objects: {}\n"), g_SimplePool->GetLiveObjects()); + overlayText += fmt::format(FMT_STRING("Resource Objects: {}\n"), g_SimplePool->GetLiveObjects()); if (!overlayText.empty()) m_debugText->typesetGlyphs(overlayText); @@ -200,8 +200,8 @@ ViewManager::ViewManager(hecl::Runtime::FileStoreManager& fileMgr, hecl::CVarMan , m_projManager(*this) , m_fontCache(fileMgr) , m_locale(locale::SystemLocaleOrEnglish()) -, m_recentProjectsPath(fmt::format(fmt(_SYS_STR("{}/recent_projects.txt")), fileMgr.getStoreRoot())) -, m_recentFilesPath(fmt::format(fmt(_SYS_STR("{}/recent_files.txt")), fileMgr.getStoreRoot())) { +, m_recentProjectsPath(fmt::format(FMT_STRING(_SYS_STR("{}/recent_projects.txt")), fileMgr.getStoreRoot())) +, m_recentFilesPath(fmt::format(FMT_STRING(_SYS_STR("{}/recent_files.txt")), fileMgr.getStoreRoot())) { Space::SpaceMenuNode::InitializeStrings(*this); char path[2048]; hecl::Sstat theStat; @@ -246,7 +246,7 @@ void ViewManager::pushRecentProject(hecl::SystemStringView path) { } for (const hecl::SystemString& pPath : m_recentProjects) { - fmt::print(fp.get(), fmt("{}\n"), hecl::SystemUTF8Conv(pPath)); + fmt::print(fp.get(), FMT_STRING("{}\n"), hecl::SystemUTF8Conv(pPath)); } } @@ -263,7 +263,7 @@ void ViewManager::pushRecentFile(hecl::SystemStringView path) { } for (const hecl::SystemString& pPath : m_recentFiles) { - fmt::print(fp.get(), fmt("{}\n"), hecl::SystemUTF8Conv(pPath)); + fmt::print(fp.get(), FMT_STRING("{}\n"), hecl::SystemUTF8Conv(pPath)); } } @@ -278,7 +278,7 @@ void ViewManager::init(boo::IApplication* app) { m_pipelineConv = hecl::NewPipelineConverter(m_mainBooFactory); hecl::conv = m_pipelineConv.get(); m_mainPlatformName = m_mainBooFactory->platformName(); - m_mainWindow->setTitle(fmt::format(fmt(_SYS_STR("URDE [{}]")), m_mainPlatformName)); + m_mainWindow->setTitle(fmt::format(FMT_STRING(_SYS_STR("URDE [{}]")), m_mainPlatformName)); m_mainCommandQueue = m_mainWindow->getCommandQueue(); m_viewResources.init(m_mainBooFactory, &m_fontCache, &m_themeData, pixelFactor); InitializeIcons(m_viewResources); diff --git a/Editor/badging/Badging.cpp b/Editor/badging/Badging.cpp index 43b9b9ee6..45215a55a 100644 --- a/Editor/badging/Badging.cpp +++ b/Editor/badging/Badging.cpp @@ -16,7 +16,7 @@ void InitializeBadging(specter::ViewResources& viewRes) { size_t fmt = r.readUint32Big(); if (fmt != 16) - Log.report(logvisor::Fatal, fmt("incorrect icon texture format")); + Log.report(logvisor::Fatal, FMT_STRING("incorrect icon texture format")); size_t width = r.readUint16Big(); size_t height = r.readUint16Big(); size_t mips = r.readUint32Big(); @@ -26,7 +26,7 @@ void InitializeBadging(specter::ViewResources& viewRes) { uLongf destSz = decompSz; size_t pos = r.position(); if (uncompress(texels.get(), &destSz, URDE_BADGE + pos, URDE_BADGE_SZ - pos) != Z_OK) - Log.report(logvisor::Fatal, fmt("unable to decompress badge")); + Log.report(logvisor::Fatal, FMT_STRING("unable to decompress badge")); viewRes.m_factory->commitTransaction([&](boo::IGraphicsDataFactory::Context& ctx) { specter::IconAtlas<1, 1> atlas; diff --git a/Editor/icons/icons.cpp b/Editor/icons/icons.cpp index 660b635db..4701c20b5 100644 --- a/Editor/icons/icons.cpp +++ b/Editor/icons/icons.cpp @@ -14,7 +14,7 @@ void InitializeIcons(specter::ViewResources& viewRes) { athena::io::MemoryReader r(URDE_ICONS, URDE_ICONS_SZ); size_t fmt = r.readUint32Big(); if (fmt != 16) - Log.report(logvisor::Fatal, fmt("incorrect icon texture format")); + Log.report(logvisor::Fatal, FMT_STRING("incorrect icon texture format")); size_t width = r.readUint16Big(); size_t height = r.readUint16Big(); size_t mips = r.readUint32Big(); @@ -24,7 +24,7 @@ void InitializeIcons(specter::ViewResources& viewRes) { uLongf destSz = decompSz; size_t pos = r.position(); if (uncompress(texels.get(), &destSz, URDE_ICONS + pos, URDE_ICONS_SZ - pos) != Z_OK) - Log.report(logvisor::Fatal, fmt("unable to decompress icons")); + Log.report(logvisor::Fatal, FMT_STRING("unable to decompress icons")); viewRes.m_factory->commitTransaction([&](boo::IGraphicsDataFactory::Context& ctx) { g_IconAtlas.initializeAtlas(ctx.newStaticTexture(width, height, mips, boo::TextureFormat::RGBA8, diff --git a/Editor/locale b/Editor/locale index 9b765b58c..c595cf725 160000 --- a/Editor/locale +++ b/Editor/locale @@ -1 +1 @@ -Subproject commit 9b765b58cf7389014f7e89a9dfb92da98ce89962 +Subproject commit c595cf725f657f3542264d7a244c14716ec41bfa diff --git a/Editor/main.cpp b/Editor/main.cpp index 6fe7f1edb..db97f7188 100644 --- a/Editor/main.cpp +++ b/Editor/main.cpp @@ -94,16 +94,16 @@ struct Application : boo::IApplicationCallback { if (arg.find(_SYS_STR("--verbosity=")) == 0 || arg.find(_SYS_STR("-v=")) == 0) { hecl::SystemUTF8Conv utf8Arg(arg.substr(arg.find_last_of('=') + 1)); hecl::VerbosityLevel = atoi(utf8Arg.c_str()); - hecl::LogModule.report(logvisor::Info, fmt("Set verbosity level to {}"), hecl::VerbosityLevel); + hecl::LogModule.report(logvisor::Info, FMT_STRING("Set verbosity level to {}"), hecl::VerbosityLevel); } } m_cvarManager.parseCommandLine(app->getArgs()); const zeus::CPUInfo& cpuInf = zeus::cpuFeatures(); - Log.report(logvisor::Info, fmt("CPU Name: {}"), cpuInf.cpuBrand); - Log.report(logvisor::Info, fmt("CPU Vendor: {}"), cpuInf.cpuVendor); - Log.report(logvisor::Info, fmt(_SYS_STR("CPU Features: {}")), CPUFeatureString(cpuInf)); + Log.report(logvisor::Info, FMT_STRING("CPU Name: {}"), cpuInf.cpuBrand); + Log.report(logvisor::Info, FMT_STRING("CPU Vendor: {}"), cpuInf.cpuVendor); + Log.report(logvisor::Info, FMT_STRING(_SYS_STR("CPU Features: {}")), CPUFeatureString(cpuInf)); } std::string getGraphicsApi() const { return m_cvarCommons.getGraphicsApi(); } @@ -145,11 +145,11 @@ static void SetupBasics(bool logging) { auto result = zeus::validateCPU(); if (!result.first) { #if _WIN32 && !WINDOWS_STORE - std::wstring msg = fmt::format(fmt(L"ERROR: This build of URDE requires the following CPU features:\n{}\n"), + std::wstring msg = fmt::format(FMT_STRING(L"ERROR: This build of URDE requires the following CPU features:\n{}\n"), urde::CPUFeatureString(result.second)); MessageBoxW(nullptr, msg.c_str(), L"CPU error", MB_OK | MB_ICONERROR); #else - fmt::print(stderr, fmt("ERROR: This build of URDE requires the following CPU features:\n{}\n"), + fmt::print(stderr, FMT_STRING("ERROR: This build of URDE requires the following CPU features:\n{}\n"), urde::CPUFeatureString(result.second)); #endif exit(1); @@ -176,7 +176,7 @@ int main(int argc, const boo::SystemChar** argv) #endif { if (argc > 1 && !hecl::StrCmp(argv[1], _SYS_STR("--dlpackage"))) { - fmt::print(fmt("{}\n"), URDE_DLPACKAGE); + fmt::print(FMT_STRING("{}\n"), URDE_DLPACKAGE); return 100; } diff --git a/NESEmulator/CNESEmulator.cpp b/NESEmulator/CNESEmulator.cpp index fee792896..e408e9e34 100644 --- a/NESEmulator/CNESEmulator.cpp +++ b/NESEmulator/CNESEmulator.cpp @@ -183,7 +183,7 @@ static logvisor::Module Log("CNESEmulator"); CNESEmulator::CNESEmulator() { if (EmulatorConstructed) - Log.report(logvisor::Fatal, fmt("Attempted constructing more than 1 CNESEmulator")); + Log.report(logvisor::Fatal, FMT_STRING("Attempted constructing more than 1 CNESEmulator")); EmulatorConstructed = true; CDvdFile NESEmuFile("NESemuP.rel"); @@ -191,7 +191,7 @@ CNESEmulator::CNESEmulator() { m_nesEmuPBuf.reset(new u8[0x20000]); m_dvdReq = NESEmuFile.AsyncSeekRead(m_nesEmuPBuf.get(), 0x20000, ESeekOrigin::Begin, NESEMUP_ROM_OFFSET); } else { - Log.report(logvisor::Fatal, fmt("Unable to open NESemuP.rel")); + Log.report(logvisor::Fatal, FMT_STRING("Unable to open NESemuP.rel")); } } diff --git a/Runtime/Audio/CAudioSys.cpp b/Runtime/Audio/CAudioSys.cpp index ec1f82722..eb1c03818 100644 --- a/Runtime/Audio/CAudioSys.cpp +++ b/Runtime/Audio/CAudioSys.cpp @@ -22,6 +22,7 @@ s16 s_DefaultVolumeScale = 0x7f; CAudioSys* CAudioSys::g_SharedSys = nullptr; TLockedToken CAudioSys::FindGroupSet(std::string_view name) { + // TODO: Heterogeneous lookup when C++20 available auto search = mpGroupSetDB.find(name.data()); if (search == mpGroupSetDB.cend()) return {}; diff --git a/Runtime/AutoMapper/CAutoMapper.cpp b/Runtime/AutoMapper/CAutoMapper.cpp index 487b48324..d018c6bd6 100644 --- a/Runtime/AutoMapper/CAutoMapper.cpp +++ b/Runtime/AutoMapper/CAutoMapper.cpp @@ -1048,15 +1048,15 @@ void CAutoMapper::ProcessControllerInput(const CFinalInput& input, CStateManager x308_textpane_instructions2->TextSupport().SetText(u""); } else { x2fc_textpane_hint->TextSupport().SetText(u""); - std::u16string str = fmt::format(fmt(u"&image=SI,0.6,1.0,{};"), g_tweakPlayerRes->x24_lStick[x2e4_lStickPos]); + std::u16string str = fmt::format(FMT_STRING(u"&image=SI,0.6,1.0,{};"), g_tweakPlayerRes->x24_lStick[x2e4_lStickPos]); str += g_MainStringTable->GetString(46); // Rotate x300_textpane_instructions->TextSupport().SetText(str); - str = fmt::format(fmt(u"&image=SI,0.6,1.0,{};"), g_tweakPlayerRes->x4c_cStick[x2e8_rStickPos]); + str = fmt::format(FMT_STRING(u"&image=SI,0.6,1.0,{};"), g_tweakPlayerRes->x4c_cStick[x2e8_rStickPos]); str += g_MainStringTable->GetString(47); // Move x304_textpane_instructions1->TextSupport().SetText(str); - str = fmt::format(fmt(u"&image={};"), g_tweakPlayerRes->x74_lTrigger[x2ec_lTriggerPos]); + str = fmt::format(FMT_STRING(u"&image={};"), g_tweakPlayerRes->x74_lTrigger[x2ec_lTriggerPos]); str += g_MainStringTable->GetString(48); // Zoom - str += fmt::format(fmt(u"&image={};"), g_tweakPlayerRes->x80_rTrigger[x2f0_rTriggerPos]); + str += fmt::format(FMT_STRING(u"&image={};"), g_tweakPlayerRes->x80_rTrigger[x2f0_rTriggerPos]); x308_textpane_instructions2->TextSupport().SetText(str); } } @@ -1129,7 +1129,7 @@ void CAutoMapper::Update(float dt, CStateManager& mgr) { std::u16string string; if (x1bc_state == EAutoMapperState::MapScreenUniverse || (x1bc_state == EAutoMapperState::MapScreen && HasCurrentMapUniverseWorld())) - string = fmt::format(fmt(u"&image={};"), g_tweakPlayerRes->x98_aButton[x2f4_aButtonPos]); + string = fmt::format(FMT_STRING(u"&image={};"), g_tweakPlayerRes->x98_aButton[x2f4_aButtonPos]); right1->TextSupport().SetText(string); CGuiTextPane* right = static_cast(x28_frmeMapScreen->FindWidget("textpane_right")); if (x1bc_state == EAutoMapperState::MapScreenUniverse) diff --git a/Runtime/CGameAllocator.cpp b/Runtime/CGameAllocator.cpp index 399ee3610..59b045635 100644 --- a/Runtime/CGameAllocator.cpp +++ b/Runtime/CGameAllocator.cpp @@ -44,7 +44,7 @@ u8* CGameAllocator::Alloc(size_t len) { void CGameAllocator::Free(u8* ptr) { SChunkDescription* info = reinterpret_cast(ptr - sizeof(SChunkDescription)); if (info->magic != 0xE8E8E8E8 || info->sentinal != 0xEFEFEFEF) { - AllocLog.report(logvisor::Fatal, fmt(_SYS_STR("Invalid chunk description, memory corruption!"))); + AllocLog.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Invalid chunk description, memory corruption!"))); return; } diff --git a/Runtime/CInGameTweakManagerBase.hpp b/Runtime/CInGameTweakManagerBase.hpp index 126098f00..32e205ecf 100644 --- a/Runtime/CInGameTweakManagerBase.hpp +++ b/Runtime/CInGameTweakManagerBase.hpp @@ -67,7 +67,7 @@ public: bool ReadFromMemoryCard(std::string_view name) { return true; } static std::string GetIdentifierForMidiEvent(CAssetId world, CAssetId area, std::string_view midiObj) { - return fmt::format(fmt("World {} Area {} MidiObject: {}"), world, area, midiObj); + return fmt::format(FMT_STRING("World {} Area {} MidiObject: {}"), world, area, midiObj); } }; diff --git a/Runtime/CMemoryCardSysNix.cpp b/Runtime/CMemoryCardSysNix.cpp index 8c4921a17..7873df934 100644 --- a/Runtime/CMemoryCardSysNix.cpp +++ b/Runtime/CMemoryCardSysNix.cpp @@ -11,13 +11,13 @@ kabufuda::SystemString CMemoryCardSys::ResolveDolphinCardPath(kabufuda::ECardSlo /* XDG-selected data path */ kabufuda::SystemString path = ((dataHome && dataHome[0] == '/') ? dataHome : hecl::SystemString(home)) + "/.local/share/dolphin-emu"; - path += fmt::format(fmt("/GC/MemoryCard{:c}.USA.raw"), slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); + path += fmt::format(FMT_STRING("/GC/MemoryCard{:c}.USA.raw"), slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); hecl::Sstat theStat; if (hecl::Stat(path.c_str(), &theStat) || !S_ISREG(theStat.st_mode)) { /* legacy case for older dolphin versions */ path = home; - path += fmt::format(fmt("/.dolphin-emu/GC/MemoryCard{:c}.USA.raw"), slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); + path += fmt::format(FMT_STRING("/.dolphin-emu/GC/MemoryCard{:c}.USA.raw"), slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); if (hecl::Stat(path.c_str(), &theStat) || !S_ISREG(theStat.st_mode)) return {}; } @@ -38,7 +38,7 @@ kabufuda::SystemString CMemoryCardSys::_CreateDolphinCard(kabufuda::ECardSlot sl if (hecl::RecursiveMakeDir(path.c_str()) < 0) return {}; - path += fmt::format(fmt("/MemoryCard{:c}.USA.raw"), slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); + path += fmt::format(FMT_STRING("/MemoryCard{:c}.USA.raw"), slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); const auto fp = hecl::FopenUnique(path.c_str(), "wb"); if (fp == nullptr) { return {}; diff --git a/Runtime/CMemoryCardSysOSX.cpp b/Runtime/CMemoryCardSysOSX.cpp index e1e659506..eca7da8d5 100644 --- a/Runtime/CMemoryCardSysOSX.cpp +++ b/Runtime/CMemoryCardSysOSX.cpp @@ -8,7 +8,7 @@ kabufuda::SystemString CMemoryCardSys::ResolveDolphinCardPath(kabufuda::ECardSlo return {}; kabufuda::SystemString path = home; - path += fmt::format(fmt("/Library/Application Support/Dolphin/GC/MemoryCard{:c}.USA.raw"), + path += fmt::format(FMT_STRING("/Library/Application Support/Dolphin/GC/MemoryCard{:c}.USA.raw"), slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); hecl::Sstat theStat; @@ -28,7 +28,7 @@ kabufuda::SystemString CMemoryCardSys::_CreateDolphinCard(kabufuda::ECardSlot sl if (hecl::RecursiveMakeDir(path.c_str()) < 0) return {}; - path += fmt::format(fmt("/MemoryCard{:c}.USA.raw"), slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); + path += fmt::format(FMT_STRING("/MemoryCard{:c}.USA.raw"), slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); const auto fp = hecl::FopenUnique(path.c_str(), "wb"); if (fp == nullptr) { return {}; diff --git a/Runtime/CMemoryCardSysWin.cpp b/Runtime/CMemoryCardSysWin.cpp index bfdd2406f..6f80119c3 100644 --- a/Runtime/CMemoryCardSysWin.cpp +++ b/Runtime/CMemoryCardSysWin.cpp @@ -48,7 +48,7 @@ kabufuda::SystemString CMemoryCardSys::ResolveDolphinCardPath(kabufuda::ECardSlo kabufuda::SystemString path(localFolder->Path->Data()); #endif - path += fmt::format(fmt(_SYS_STR("/GC/MemoryCard{}.USA.raw")), + path += fmt::format(FMT_STRING(_SYS_STR("/GC/MemoryCard{}.USA.raw")), slot == kabufuda::ECardSlot::SlotA ? _SYS_STR('A') : _SYS_STR('B')); hecl::Sstat theStat; @@ -99,7 +99,7 @@ kabufuda::SystemString CMemoryCardSys::_CreateDolphinCard(kabufuda::ECardSlot sl if (hecl::RecursiveMakeDir(path.c_str()) < 0) return {}; - path += fmt::format(fmt(_SYS_STR("/MemoryCard{}.USA.raw")), + path += fmt::format(FMT_STRING(_SYS_STR("/MemoryCard{}.USA.raw")), slot == kabufuda::ECardSlot::SlotA ? _SYS_STR('A') : _SYS_STR('B')); const auto fp = hecl::FopenUnique(path.c_str(), _SYS_STR("wb")); if (fp == nullptr) { diff --git a/Runtime/CObjectList.cpp b/Runtime/CObjectList.cpp index 332d7e4a3..e0c6a89de 100644 --- a/Runtime/CObjectList.cpp +++ b/Runtime/CObjectList.cpp @@ -13,7 +13,7 @@ void CObjectList::AddObject(CEntity& entity) { #ifndef NDEBUG if (x0_list[entity.GetUniqueId().Value()].entity != nullptr && x0_list[entity.GetUniqueId().Value()].entity != &entity) - Log.report(logvisor::Level::Fatal, fmt("INVALID USAGE DETECTED: Attempting to assign entity '{} ({})' to existing node '{}'!!!"), + Log.report(logvisor::Level::Fatal, FMT_STRING("INVALID USAGE DETECTED: Attempting to assign entity '{} ({})' to existing node '{}'!!!"), entity.GetName(), entity.GetEditorId(), entity.GetUniqueId().Value()); #endif s16 prevFirst = -1; diff --git a/Runtime/CPakFile.cpp b/Runtime/CPakFile.cpp index 7cb34c700..92e73081c 100644 --- a/Runtime/CPakFile.cpp +++ b/Runtime/CPakFile.cpp @@ -5,7 +5,7 @@ static logvisor::Module Log("urde::CPakFile"); CPakFile::CPakFile(std::string_view filename, bool buildDepList, bool worldPak, bool override) : CDvdFile(filename) { if (!CDvdFile::operator bool()) - Log.report(logvisor::Fatal, fmt("{}: Unable to open"), GetPath()); + Log.report(logvisor::Fatal, FMT_STRING("{}: Unable to open"), GetPath()); x28_24_buildDepList = buildDepList; //x28_24_buildDepList = true; // Always do this so URDE can rapidly pre-warm shaders x28_25_aramFile = false; @@ -67,7 +67,7 @@ void CPakFile::InitialHeaderLoad() { u32 version = r.readUint32Big(); if (version != 0x80030005) { Log.report(logvisor::Fatal, - fmt("{}: Incompatible pak file version -- Current version is {:08X}, you're using {:08X}"), + FMT_STRING("{}: Incompatible pak file version -- Current version is {:08X}, you're using {:08X}"), GetPath(), 0x80030005, version); return; } diff --git a/Runtime/CResFactory.cpp b/Runtime/CResFactory.cpp index a90a48835..2968b6d02 100644 --- a/Runtime/CResFactory.cpp +++ b/Runtime/CResFactory.cpp @@ -28,7 +28,7 @@ CFactoryFnReturn CResFactory::BuildSync(const SObjectTag& tag, const CVParamTran else ret = std::make_unique(nullptr); } - Log.report(logvisor::Warning, fmt("sync-built {}"), tag); + Log.report(logvisor::Warning, FMT_STRING("sync-built {}"), tag); return ret; } @@ -38,7 +38,7 @@ bool CResFactory::PumpResource(SLoadingData& data) { *data.xc_targetPtr = x5c_factoryMgr.MakeObjectFromMemory(data.x0_tag, std::move(data.x10_loadBuffer), data.x14_resSize, data.m_compressed, data.x18_cvXfer, data.m_selfRef); - Log.report(logvisor::Info, fmt("async-built {}"), data.x0_tag); + Log.report(logvisor::Info, FMT_STRING("async-built {}"), data.x0_tag); return true; } return false; diff --git a/Runtime/CResLoader.cpp b/Runtime/CResLoader.cpp index 075e8288b..24318ad84 100644 --- a/Runtime/CResLoader.cpp +++ b/Runtime/CResLoader.cpp @@ -210,7 +210,7 @@ bool CResLoader::FindResource(CAssetId id) const { return true; } - Log.report(logvisor::Warning, fmt("Unable to find asset {}"), id); + Log.report(logvisor::Warning, FMT_STRING("Unable to find asset {}"), id); return false; } @@ -234,7 +234,7 @@ CPakFile* CResLoader::FindResourceForLoad(CAssetId id) { } } - Log.report(logvisor::Error, fmt("Unable to find asset {}"), id); + Log.report(logvisor::Error, FMT_STRING("Unable to find asset {}"), id); return nullptr; } diff --git a/Runtime/CStateManager.cpp b/Runtime/CStateManager.cpp index 45cad7fc9..e9d9c8521 100644 --- a/Runtime/CStateManager.cpp +++ b/Runtime/CStateManager.cpp @@ -916,7 +916,7 @@ void CStateManager::DrawActorCubeFaces(CActor& actor, int& cubeInst) const { } for (int f = 0; f < 6; ++f) { - SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(fmt("CStateManager::DrawActorCubeFaces [{}] {} {} {}"), f, + SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CStateManager::DrawActorCubeFaces [{}] {} {} {}"), f, actor.GetUniqueId(), actor.GetEditorId(), actor.GetName()) .c_str(), zeus::skOrange); @@ -1211,7 +1211,7 @@ void CStateManager::RecursiveDrawTree(TUniqueId node) { void CStateManager::SendScriptMsg(CEntity* dest, TUniqueId src, EScriptObjectMessage msg) { if (dest && !dest->x30_26_scriptingBlocked) { if (sm_logScripting && sm_logScripting->toBoolean()) - LogModule.report(logvisor::Info, fmt("Sending '{}' to '{}' id= {}"), ScriptObjectMessageToStr(msg), + LogModule.report(logvisor::Info, FMT_STRING("Sending '{}' to '{}' id= {}"), ScriptObjectMessageToStr(msg), dest->GetName(), dest->GetUniqueId()); dest->AcceptScriptMsg(msg, src, *this); } @@ -1226,7 +1226,7 @@ void CStateManager::SendScriptMsgAlways(TUniqueId dest, TUniqueId src, EScriptOb CEntity* dst = ObjectById(dest); if (dst) { if (sm_logScripting && sm_logScripting->toBoolean()) - LogModule.report(logvisor::Info, fmt("Sending '{}' to '{}' id= {}"), ScriptObjectMessageToStr(msg), + LogModule.report(logvisor::Info, FMT_STRING("Sending '{}' to '{}' id= {}"), ScriptObjectMessageToStr(msg), dst->GetName(), dst->GetUniqueId()); dst->AcceptScriptMsg(msg, src, *this); } @@ -1282,7 +1282,7 @@ void CStateManager::FreeScriptObject(TUniqueId id) { } if (sm_logScripting && sm_logScripting->toBoolean()) - LogModule.report(logvisor::Info, fmt("Removed '{}'"), ent->GetName()); + LogModule.report(logvisor::Info, FMT_STRING("Removed '{}'"), ent->GetName()); } std::pair CStateManager::GetBuildForScript(TEditorId id) const { @@ -1374,16 +1374,16 @@ std::pair CStateManager::LoadScriptObject(TAreaId aid, ESc u32 readAmt = in.position() - startPos; if (readAmt > length) - LogModule.report(logvisor::Fatal, fmt("Script object overread while reading {}"), ScriptObjectTypeToStr(type)); + LogModule.report(logvisor::Fatal, FMT_STRING("Script object overread while reading {}"), ScriptObjectTypeToStr(type)); u32 leftover = length - readAmt; for (u32 i = 0; i < leftover; ++i) in.readByte(); if (error || ent == nullptr) { - LogModule.report(logvisor::Error, fmt("Script load error while loading {}"), ScriptObjectTypeToStr(type)); + LogModule.report(logvisor::Error, FMT_STRING("Script load error while loading {}"), ScriptObjectTypeToStr(type)); return {kInvalidEditorId, kInvalidUniqueId}; } else { - LogModule.report(logvisor::Info, fmt("Loaded {} in area {}"), ent->GetName(), ent->GetAreaIdAlways()); + LogModule.report(logvisor::Info, FMT_STRING("Loaded {} in area {}"), ent->GetName(), ent->GetAreaIdAlways()); return {id, ent->GetUniqueId()}; } } @@ -2471,7 +2471,7 @@ void CStateManager::AddObject(CEntity& ent) { } if (sm_logScripting && sm_logScripting->toBoolean()) - LogModule.report(logvisor::Info, fmt("Added '{}'"), ent.GetName()); + LogModule.report(logvisor::Info, FMT_STRING("Added '{}'"), ent.GetName()); } void CStateManager::AddObject(CEntity* ent) { @@ -2516,7 +2516,7 @@ TUniqueId CStateManager::AllocateUniqueId() { ourIndex = x0_nextFreeIndex; x0_nextFreeIndex = (x0_nextFreeIndex + 1) & 0x3ff; if (x0_nextFreeIndex == lastIndex) - LogModule.report(logvisor::Fatal, fmt("Object List Full!")); + LogModule.report(logvisor::Fatal, FMT_STRING("Object List Full!")); } while (GetAllObjectList().GetObjectByIndex(ourIndex) != nullptr); x8_idArr[ourIndex] = (x8_idArr[ourIndex] + 1) & 0x3f; diff --git a/Runtime/CStopwatch.hpp b/Runtime/CStopwatch.hpp index 7f376d21d..301dff669 100644 --- a/Runtime/CStopwatch.hpp +++ b/Runtime/CStopwatch.hpp @@ -13,7 +13,7 @@ public: double t = std::chrono::duration_cast( std::chrono::steady_clock::now() - m_start).count() / 1000000.0; #ifndef NDEBUG - fmt::print(fmt("{} {}\n"), name, t); + fmt::print(FMT_STRING("{} {}\n"), name, t); #endif return t; } @@ -21,7 +21,7 @@ public: std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now(); double t = std::chrono::duration_cast(now - m_start).count() / 1000000.0; #ifndef NDEBUG - fmt::print(fmt("{} {}\n"), name, t); + fmt::print(FMT_STRING("{} {}\n"), name, t); #endif m_start = now; return t; diff --git a/Runtime/Character/CAllFormatsAnimSource.cpp b/Runtime/Character/CAllFormatsAnimSource.cpp index b36b72b7f..025eed532 100644 --- a/Runtime/Character/CAllFormatsAnimSource.cpp +++ b/Runtime/Character/CAllFormatsAnimSource.cpp @@ -21,7 +21,7 @@ void CAnimFormatUnion::SubConstruct(u8* storage, EAnimFormat fmt, CInputStream& new (storage) CFBStreamedCompression(in, store, true); break; default: - Log.report(logvisor::Fatal, fmt("unable to read ANIM format {}"), int(fmt)); + Log.report(logvisor::Fatal, FMT_STRING("unable to read ANIM format {}"), int(fmt)); } } diff --git a/Runtime/Character/CAnimData.cpp b/Runtime/Character/CAnimData.cpp index a4c99ce60..9c6431c96 100644 --- a/Runtime/Character/CAnimData.cpp +++ b/Runtime/Character/CAnimData.cpp @@ -86,7 +86,7 @@ CAnimData::CAnimData(CAssetId id, const CCharacterInfo& character, int defaultAn if (defaultAnim == -1) { defaultAnim = 0; - Log.report(logvisor::Warning, fmt("Character {} has invalid initial animation, so defaulting to first."), + Log.report(logvisor::Warning, FMT_STRING("Character {} has invalid initial animation, so defaulting to first."), character.GetCharacterName()); } diff --git a/Runtime/Character/CModelData.cpp b/Runtime/Character/CModelData.cpp index 98c0119be..a9db25302 100644 --- a/Runtime/Character/CModelData.cpp +++ b/Runtime/Character/CModelData.cpp @@ -29,7 +29,7 @@ CModelData::CModelData(const CStaticRes& res, int instCount) : x0_scale(res.GetScale()), x14_24_renderSorted(false), x14_25_sortThermal(false), m_drawInstCount(instCount) { x1c_normalModel = g_SimplePool->GetObj({SBIG('CMDL'), res.GetId()}); if (!x1c_normalModel) - Log.report(logvisor::Fatal, fmt("unable to find CMDL {}"), res.GetId()); + Log.report(logvisor::Fatal, FMT_STRING("unable to find CMDL {}"), res.GetId()); m_normalModelInst = x1c_normalModel->MakeNewInstance(0, instCount); } @@ -146,7 +146,7 @@ void CModelData::SetXRayModel(const std::pair& modelSkin) { } else { x2c_xrayModel = g_SimplePool->GetObj({SBIG('CMDL'), modelSkin.first}); if (!x2c_xrayModel) - Log.report(logvisor::Fatal, fmt("unable to find CMDL {}"), modelSkin.first); + Log.report(logvisor::Fatal, FMT_STRING("unable to find CMDL {}"), modelSkin.first); m_xrayModelInst = x2c_xrayModel->MakeNewInstance(0, m_drawInstCount); } } @@ -163,7 +163,7 @@ void CModelData::SetInfraModel(const std::pair& modelSkin) { } else { x3c_infraModel = g_SimplePool->GetObj({SBIG('CMDL'), modelSkin.first}); if (!x3c_infraModel) - Log.report(logvisor::Fatal, fmt("unable to find CMDL {}"), modelSkin.first); + Log.report(logvisor::Fatal, FMT_STRING("unable to find CMDL {}"), modelSkin.first); m_infraModelInst = x3c_infraModel->MakeNewInstance(0, m_drawInstCount); } } diff --git a/Runtime/Character/CParticleDatabase.cpp b/Runtime/Character/CParticleDatabase.cpp index 573561484..82df24852 100644 --- a/Runtime/Character/CParticleDatabase.cpp +++ b/Runtime/Character/CParticleDatabase.cpp @@ -273,6 +273,7 @@ void CParticleDatabase::AddToRendererClipped(const zeus::CFrustum& frustum) cons } CParticleGenInfo* CParticleDatabase::GetParticleEffect(std::string_view name) const { + // TODO: Heterogeneous lookup when C++20 available auto search = x3c_rendererDrawLoop.find(name.data()); if (search != x3c_rendererDrawLoop.end()) return search->second.get(); diff --git a/Runtime/Graphics/CBooRenderer.cpp b/Runtime/Graphics/CBooRenderer.cpp index 4b23e81da..c0c5ebee8 100644 --- a/Runtime/Graphics/CBooRenderer.cpp +++ b/Runtime/Graphics/CBooRenderer.cpp @@ -148,7 +148,7 @@ void Buckets::Sort() { if (bucket.size() < bucket.capacity()) bucket.push_back(&drawable); // else - // Log.report(logvisor::Fatal, fmt("Full bucket!!!")); + // Log.report(logvisor::Fatal, FMT_STRING("Full bucket!!!")); } u16 bucketIdx = u16(sBuckets->size()); @@ -183,7 +183,7 @@ void Buckets::InsertPlaneObject(float closeDist, float farDist, const zeus::CAAB void Buckets::Insert(const zeus::CVector3f& pos, const zeus::CAABox& aabb, EDrawableType dtype, void* data, const zeus::CPlane& plane, u16 extraSort) { if (sData->size() == sData->capacity()) { - Log.report(logvisor::Fatal, fmt("Rendering buckets filled to capacity")); + Log.report(logvisor::Fatal, FMT_STRING("Rendering buckets filled to capacity")); return; } diff --git a/Runtime/Graphics/CLineRenderer.cpp b/Runtime/Graphics/CLineRenderer.cpp index d8b4b3472..340377476 100644 --- a/Runtime/Graphics/CLineRenderer.cpp +++ b/Runtime/Graphics/CLineRenderer.cpp @@ -24,7 +24,7 @@ CLineRenderer::CLineRenderer(boo::IGraphicsDataFactory::Context& ctx, EPrimitive const boo::ObjToken& texture, bool additive, bool zTest, bool zGEqual) : m_mode(mode), m_maxVerts(maxVerts) { if (maxVerts < 2) { - LineRendererLog.report(logvisor::Fatal, fmt(_SYS_STR("maxVerts < 2, maxVerts = {}")), maxVerts); + LineRendererLog.report(logvisor::Fatal, FMT_STRING(_SYS_STR("maxVerts < 2, maxVerts = {}")), maxVerts); return; } m_textured = bool(texture); @@ -55,7 +55,7 @@ CLineRenderer::CLineRenderer(EPrimitiveMode mode, u32 maxVerts, const boo::ObjTo bool additive, bool zTest, bool zGEqual) : m_mode(mode), m_maxVerts(maxVerts) { if (maxVerts < 2) { - LineRendererLog.report(logvisor::Fatal, fmt(_SYS_STR("maxVerts < 2, maxVerts = {}")), maxVerts); + LineRendererLog.report(logvisor::Fatal, FMT_STRING(_SYS_STR("maxVerts < 2, maxVerts = {}")), maxVerts); return; } m_textured = bool(texture); diff --git a/Runtime/Graphics/CModelBoo.cpp b/Runtime/Graphics/CModelBoo.cpp index bb30f753e..f40226568 100644 --- a/Runtime/Graphics/CModelBoo.cpp +++ b/Runtime/Graphics/CModelBoo.cpp @@ -268,7 +268,7 @@ CBooModel::ModelInstance* CBooModel::PushNewModelInstance(int sharedLayoutBuf) { } if (m_instances.size() >= 512) { - Log.report(logvisor::Fatal, fmt("Model buffer overflow")); + Log.report(logvisor::Fatal, FMT_STRING("Model buffer overflow")); } ModelInstance& newInst = m_instances.emplace_back(); @@ -640,7 +640,7 @@ static EExtendedShader ResolveExtendedShader(const MaterialSet::Material& data, void CBooModel::DrawSurface(const CBooSurface& surf, const CModelFlags& flags) const { // if (m_uniUpdateCount == 0) - // Log.report(logvisor::Fatal, fmt("UpdateUniformData() not called")); + // Log.report(logvisor::Fatal, FMT_STRING("UpdateUniformData() not called")); if (m_uniUpdateCount == 0 || m_uniUpdateCount > m_instances.size()) return; const ModelInstance& inst = m_instances[m_uniUpdateCount - 1]; @@ -1175,7 +1175,7 @@ CModel::CModel(std::unique_ptr&& in, u32 /* dataLen */, IObjectStore* stor u32 version = hecl::SBig(*reinterpret_cast(data.get() + 0x4)); m_flags = hecl::SBig(*reinterpret_cast(data.get() + 0x8)); if (version != 0x10002) - Log.report(logvisor::Fatal, fmt("invalid CMDL for loading with boo")); + Log.report(logvisor::Fatal, FMT_STRING("invalid CMDL for loading with boo")); u32 secCount = hecl::SBig(*reinterpret_cast(data.get() + 0x24)); u32 matSetCount = hecl::SBig(*reinterpret_cast(data.get() + 0x28)); diff --git a/Runtime/Graphics/CSkinnedModel.cpp b/Runtime/Graphics/CSkinnedModel.cpp index 709a12a22..757859689 100644 --- a/Runtime/Graphics/CSkinnedModel.cpp +++ b/Runtime/Graphics/CSkinnedModel.cpp @@ -12,13 +12,13 @@ CSkinnedModel::CSkinnedModel(TLockedToken model, TLockedToken layoutInfo, int shaderIdx, int drawInsts) : x4_model(std::move(model)), x10_skinRules(std::move(skinRules)), x1c_layoutInfo(std::move(layoutInfo)) { if (!x4_model) { - Log.report(logvisor::Fatal, fmt("bad model token provided to CSkinnedModel")); + Log.report(logvisor::Fatal, FMT_STRING("bad model token provided to CSkinnedModel")); } if (!x10_skinRules) { - Log.report(logvisor::Fatal, fmt("bad skin token provided to CSkinnedModel")); + Log.report(logvisor::Fatal, FMT_STRING("bad skin token provided to CSkinnedModel")); } if (!x1c_layoutInfo) { - Log.report(logvisor::Fatal, fmt("bad character layout token provided to CSkinnedModel")); + Log.report(logvisor::Fatal, FMT_STRING("bad character layout token provided to CSkinnedModel")); } m_modelInst = x4_model->MakeNewInstance(shaderIdx, drawInsts); } diff --git a/Runtime/Graphics/CTextureBoo.cpp b/Runtime/Graphics/CTextureBoo.cpp index 931a497e6..d271c0cad 100644 --- a/Runtime/Graphics/CTextureBoo.cpp +++ b/Runtime/Graphics/CTextureBoo.cpp @@ -552,7 +552,7 @@ void CTexture::BuildRGBA8(const void* data, size_t length) { size_t texelCount = ComputeMippedTexelCount(); size_t expectedSize = texelCount * 4; if (expectedSize > length) - Log.report(logvisor::Fatal, fmt("insufficient TXTR length ({}/{})"), length, expectedSize); + Log.report(logvisor::Fatal, FMT_STRING("insufficient TXTR length ({}/{})"), length, expectedSize); CGraphics::CommitResources([&](boo::IGraphicsDataFactory::Context& ctx) { m_booTex = ctx.newStaticTexture(x4_w, x6_h, x8_mips, boo::TextureFormat::RGBA8, boo::TextureClampMode::Repeat, data, @@ -565,7 +565,7 @@ void CTexture::BuildRGBA8(const void* data, size_t length) { void CTexture::BuildC8(const void* data, size_t length) { size_t texelCount = ComputeMippedTexelCount(); if (texelCount > length) - Log.report(logvisor::Fatal, fmt("insufficient TXTR length ({}/{})"), length, texelCount); + Log.report(logvisor::Fatal, FMT_STRING("insufficient TXTR length ({}/{})"), length, texelCount); CGraphics::CommitResources([&](boo::IGraphicsDataFactory::Context& ctx) { uint32_t nentries = hecl::SBig(*reinterpret_cast(data)); @@ -763,7 +763,7 @@ CTexture::CTexture(std::unique_ptr&& in, u32 length, bool otex, const CTex BuildDXT3(owned.get() + 12, length - 12); break; default: - Log.report(logvisor::Fatal, fmt("invalid texture type {} for boo"), int(x0_fmt)); + Log.report(logvisor::Fatal, FMT_STRING("invalid texture type {} for boo"), int(x0_fmt)); } if (otex) @@ -775,7 +775,7 @@ void CTexture::Load(int slot, EClampMode clamp) const {} std::unique_ptr CTexture::BuildMemoryCardTex(u32& sizeOut, ETexelFormat& fmtOut, std::unique_ptr& paletteOut) const { if (!m_otex) - Log.report(logvisor::Fatal, fmt("MemoryCard TXTR not loaded with 'otex'")); + Log.report(logvisor::Fatal, FMT_STRING("MemoryCard TXTR not loaded with 'otex'")); size_t texelCount = x4_w * x6_h; std::unique_ptr ret; @@ -851,7 +851,7 @@ std::unique_ptr CTexture::BuildMemoryCardTex(u32& sizeOut, ETexelFormat& f } } } else - Log.report(logvisor::Fatal, fmt("MemoryCard texture may only use RGBA8PC or C8PC format")); + Log.report(logvisor::Fatal, FMT_STRING("MemoryCard texture may only use RGBA8PC or C8PC format")); return ret; } diff --git a/Runtime/GuiSys/CAuiEnergyBarT01.cpp b/Runtime/GuiSys/CAuiEnergyBarT01.cpp index 4da50045c..d30345c86 100644 --- a/Runtime/GuiSys/CAuiEnergyBarT01.cpp +++ b/Runtime/GuiSys/CAuiEnergyBarT01.cpp @@ -57,7 +57,7 @@ void CAuiEnergyBarT01::Draw(const CGuiWidgetDrawParms& drawParms) { if (!xbc_tex || !xbc_tex.IsLoaded() || !xd8_coordFunc) { return; } - SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(fmt("CAuiEnergyBarT01::Draw {}"), m_name).c_str(), zeus::skCyan); + SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CAuiEnergyBarT01::Draw {}"), m_name).c_str(), zeus::skCyan); CGraphics::SetModelMatrix(x34_worldXF); m_energyBarShader.updateModelMatrix(); diff --git a/Runtime/GuiSys/CAuiImagePane.cpp b/Runtime/GuiSys/CAuiImagePane.cpp index 996e1ad4f..d8a033087 100644 --- a/Runtime/GuiSys/CAuiImagePane.cpp +++ b/Runtime/GuiSys/CAuiImagePane.cpp @@ -106,7 +106,7 @@ void CAuiImagePane::Draw(const CGuiWidgetDrawParms& params) { if (!GetIsVisible() || !xb8_tex0Tok.IsLoaded()) { return; } - SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(fmt("CAuiImagePane::Draw {}"), m_name).c_str(), zeus::skCyan); + SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CAuiImagePane::Draw {}"), m_name).c_str(), zeus::skCyan); GetIsFinishedLoadingWidgetSpecific(); if (!m_filters || m_filters->m_texId != xb8_tex0Tok.GetObjectTag()->id) { m_filters.emplace(xb8_tex0Tok); diff --git a/Runtime/GuiSys/CCompoundTargetReticle.cpp b/Runtime/GuiSys/CCompoundTargetReticle.cpp index 3f08768fa..c54dc531a 100644 --- a/Runtime/GuiSys/CCompoundTargetReticle.cpp +++ b/Runtime/GuiSys/CCompoundTargetReticle.cpp @@ -65,7 +65,7 @@ CCompoundTargetReticle::CCompoundTargetReticle(const CStateManager& mgr) , x208_lockonTimer(g_tweakTargeting->GetLockonDuration()) { xe0_outerBeamIconSquares.reserve(9); for (u32 i = 0; i < 9; ++i) - xe0_outerBeamIconSquares.emplace_back(fmt::format(fmt("{}{}"), skOuterBeamIconSquareNameBase, i)); + xe0_outerBeamIconSquares.emplace_back(fmt::format(FMT_STRING("{}{}"), skOuterBeamIconSquareNameBase, i)); x34_crosshairs.Lock(); } diff --git a/Runtime/GuiSys/CGuiFrame.cpp b/Runtime/GuiSys/CGuiFrame.cpp index 03dc93daa..9c721067e 100644 --- a/Runtime/GuiSys/CGuiFrame.cpp +++ b/Runtime/GuiSys/CGuiFrame.cpp @@ -133,7 +133,7 @@ void CGuiFrame::Reset() { void CGuiFrame::Update(float dt) { xc_headWidget->Update(dt); } void CGuiFrame::Draw(const CGuiWidgetDrawParms& parms) const { - SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(fmt("CGuiFrame::Draw FRME_{}"), x0_id).c_str(), zeus::skMagenta); + SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CGuiFrame::Draw FRME_{}"), x0_id).c_str(), zeus::skMagenta); CGraphics::SetCullMode(ERglCullMode::None); CGraphics::SetAmbientColor(zeus::skWhite); DisableLights(); diff --git a/Runtime/GuiSys/CGuiModel.cpp b/Runtime/GuiSys/CGuiModel.cpp index 5a3846514..c8d1ef9c3 100644 --- a/Runtime/GuiSys/CGuiModel.cpp +++ b/Runtime/GuiSys/CGuiModel.cpp @@ -51,7 +51,7 @@ void CGuiModel::Draw(const CGuiWidgetDrawParms& parms) { } if (GetIsVisible()) { - SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(fmt("CGuiModel::Draw {}"), m_name).c_str(), zeus::skCyan); + SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CGuiModel::Draw {}"), m_name).c_str(), zeus::skCyan); zeus::CColor moduCol = xa8_color2; moduCol.a() *= parms.x0_alphaMod; xb0_frame->EnableLights(xcc_lightMask, model->GetInstance()); diff --git a/Runtime/GuiSys/CGuiTextPane.cpp b/Runtime/GuiSys/CGuiTextPane.cpp index 681b89cf7..16c7a32c0 100644 --- a/Runtime/GuiSys/CGuiTextPane.cpp +++ b/Runtime/GuiSys/CGuiTextPane.cpp @@ -51,7 +51,7 @@ void CGuiTextPane::Draw(const CGuiWidgetDrawParms& parms) { if (!GetIsVisible()) { return; } - SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(fmt("CGuiTextPane::Draw {}"), m_name).c_str(), zeus::skCyan); + SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CGuiTextPane::Draw {}"), m_name).c_str(), zeus::skCyan); zeus::CVector2f dims = GetDimensions(); diff --git a/Runtime/GuiSys/CGuiTextSupport.cpp b/Runtime/GuiSys/CGuiTextSupport.cpp index a2a6cb993..e190df769 100644 --- a/Runtime/GuiSys/CGuiTextSupport.cpp +++ b/Runtime/GuiSys/CGuiTextSupport.cpp @@ -172,7 +172,7 @@ void CGuiTextSupport::CheckAndRebuildTextBuffer() { std::u16string initStr; if (x5c_fontId.IsValid()) - initStr = fmt::format(fmt(u"&font={};"), x5c_fontId); + initStr = fmt::format(FMT_STRING(u"&font={};"), x5c_fontId); initStr += x0_string; g_TextParser->ParseText(*g_TextExecuteBuf, initStr.c_str(), initStr.size(), x14_props.xc_txtrMap); diff --git a/Runtime/GuiSys/CGuiWidget.cpp b/Runtime/GuiSys/CGuiWidget.cpp index 9d398a4f9..6996ad337 100644 --- a/Runtime/GuiSys/CGuiWidget.cpp +++ b/Runtime/GuiSys/CGuiWidget.cpp @@ -71,7 +71,7 @@ void CGuiWidget::ParseBaseInfo(CGuiFrame* frame, CInputStream& in, const CGuiWid in.readUint16Big(); if (isWorker) { if (!parent->AddWorkerWidget(this)) { - Log.report(logvisor::Warning, fmt("Warning: Discarding useless worker id. Parent is not a compound widget.")); + Log.report(logvisor::Warning, FMT_STRING("Warning: Discarding useless worker id. Parent is not a compound widget.")); xb4_workerId = -1; } } diff --git a/Runtime/GuiSys/CGuiWidgetIdDB.cpp b/Runtime/GuiSys/CGuiWidgetIdDB.cpp index 075534f9b..4455cc85a 100644 --- a/Runtime/GuiSys/CGuiWidgetIdDB.cpp +++ b/Runtime/GuiSys/CGuiWidgetIdDB.cpp @@ -10,6 +10,7 @@ CGuiWidgetIdDB::CGuiWidgetIdDB() { } s16 CGuiWidgetIdDB::FindWidgetID(std::string_view name) const { + // TODO: Heterogeneous lookup when C++20 available auto search = x0_dbMap.find(name.data()); if (search == x0_dbMap.cend()) return -1; diff --git a/Runtime/GuiSys/CGuiWidgetIdDB.hpp b/Runtime/GuiSys/CGuiWidgetIdDB.hpp index 799f6efe1..65197094c 100644 --- a/Runtime/GuiSys/CGuiWidgetIdDB.hpp +++ b/Runtime/GuiSys/CGuiWidgetIdDB.hpp @@ -1,5 +1,7 @@ #pragma once +#include +#include #include #include "Runtime/GCNTypes.hpp" diff --git a/Runtime/GuiSys/CHudBallInterface.cpp b/Runtime/GuiSys/CHudBallInterface.cpp index f2e0a79fd..74677b489 100644 --- a/Runtime/GuiSys/CHudBallInterface.cpp +++ b/Runtime/GuiSys/CHudBallInterface.cpp @@ -18,7 +18,7 @@ CHudBallInterface::CHudBallInterface(CGuiFrame& selHud, int pbAmount, int pbCapa xc_model_bombicon = static_cast(selHud.FindWidget("model_bombicon")); x10_textpane_bombdigits = static_cast(selHud.FindWidget("textpane_bombdigits")); for (int i = 0; i < 3; ++i) { - CGuiGroup* grp = static_cast(selHud.FindWidget(fmt::format(fmt("group_bombcount{}"), i))); + CGuiGroup* grp = static_cast(selHud.FindWidget(fmt::format(FMT_STRING("group_bombcount{}"), i))); CGuiWidget* filled = grp->GetWorkerWidget(1); CGuiWidget* empty = grp->GetWorkerWidget(0); x14_group_bombfilled.push_back(filled); @@ -65,7 +65,7 @@ void CHudBallInterface::UpdatePowerBombReadoutColors() { void CHudBallInterface::SetBombParams(int pbAmount, int pbCapacity, int availableBombs, bool hasBombs, bool hasPb, bool init) { if (pbAmount != x40_pbAmount || init) { - x10_textpane_bombdigits->TextSupport().SetText(fmt::format(fmt("{:02d}"), pbAmount)); + x10_textpane_bombdigits->TextSupport().SetText(fmt::format(FMT_STRING("{:02d}"), pbAmount)); x40_pbAmount = pbAmount; UpdatePowerBombReadoutColors(); } diff --git a/Runtime/GuiSys/CHudEnergyInterface.cpp b/Runtime/GuiSys/CHudEnergyInterface.cpp index 8109e51de..f4275d312 100644 --- a/Runtime/GuiSys/CHudEnergyInterface.cpp +++ b/Runtime/GuiSys/CHudEnergyInterface.cpp @@ -99,7 +99,7 @@ void CHudEnergyInterface::Update(float dt, float energyLowPulse) { x1c_26_barDirty = false; x18_cachedBarEnergy = x2c_energybart01_energybar->GetFilledEnergy(); std::string string = - fmt::format(fmt("{:02d}"), int(std::fmod(x18_cachedBarEnergy, CPlayerState::GetEnergyTankCapacity()))); + fmt::format(FMT_STRING("{:02d}"), int(std::fmod(x18_cachedBarEnergy, CPlayerState::GetEnergyTankCapacity()))); x20_textpane_energydigits->TextSupport().SetText(string); } diff --git a/Runtime/GuiSys/CHudMissileInterface.cpp b/Runtime/GuiSys/CHudMissileInterface.cpp index 6e42b974e..1e3cadd73 100644 --- a/Runtime/GuiSys/CHudMissileInterface.cpp +++ b/Runtime/GuiSys/CHudMissileInterface.cpp @@ -216,7 +216,7 @@ void CHudMissileInterface::SetChargeBeamFactor(float t) { x4c_chargeBeamFactor = void CHudMissileInterface::SetNumMissiles(int numMissiles, const CStateManager& mgr) { numMissiles = zeus::clamp(0, numMissiles, 999); - x60_textpane_missiledigits->TextSupport().SetText(fmt::format(fmt("{:3d}"), numMissiles)); + x60_textpane_missiledigits->TextSupport().SetText(fmt::format(FMT_STRING("{:3d}"), numMissiles)); if (x8_numMissles < numMissiles) { xc_arrowTimer = g_tweakGui->GetMissileArrowVisTime(); diff --git a/Runtime/GuiSys/CHudThreatInterface.cpp b/Runtime/GuiSys/CHudThreatInterface.cpp index 7a4235b19..e5cd207c7 100644 --- a/Runtime/GuiSys/CHudThreatInterface.cpp +++ b/Runtime/GuiSys/CHudThreatInterface.cpp @@ -88,7 +88,7 @@ void CHudThreatInterface::Update(float dt) { if (x70_textpane_threatdigits) { if (x10_threatDist < maxThreatEnergy) { x70_textpane_threatdigits->SetIsVisible(true); - x70_textpane_threatdigits->TextSupport().SetText(fmt::format(fmt("{:01.1f}"), std::max(0.f, x10_threatDist))); + x70_textpane_threatdigits->TextSupport().SetText(fmt::format(FMT_STRING("{:01.1f}"), std::max(0.f, x10_threatDist))); } else { x70_textpane_threatdigits->SetIsVisible(false); } diff --git a/Runtime/GuiSys/CHudVisorBeamMenu.cpp b/Runtime/GuiSys/CHudVisorBeamMenu.cpp index 3153cf848..58748fe84 100644 --- a/Runtime/GuiSys/CHudVisorBeamMenu.cpp +++ b/Runtime/GuiSys/CHudVisorBeamMenu.cpp @@ -68,7 +68,7 @@ CHudVisorBeamMenu::CHudVisorBeamMenu(CGuiFrame& baseHud, EHudVisorBeamMenu type, x18_basewidget_menu = x0_baseHud.FindWidget(BaseMenuNames[size_t(swappedType)]); x24_model_ghost = - static_cast(x0_baseHud.FindWidget(fmt::format(fmt("{}ghost"), ModelNames[size_t(x4_type)]))); + static_cast(x0_baseHud.FindWidget(fmt::format(FMT_STRING("{}ghost"), ModelNames[size_t(x4_type)]))); x28_menuItems.resize(4); for (size_t i = 0; i < x28_menuItems.size(); i++) { @@ -77,9 +77,9 @@ CHudVisorBeamMenu::CHudVisorBeamMenu(CGuiFrame& baseHud, EHudVisorBeamMenu type, SMenuItem& item = x28_menuItems[i]; item.x0_model_loz = - static_cast(x0_baseHud.FindWidget(fmt::format(fmt("{}loz{}"), modelName, menuItemOrder))); + static_cast(x0_baseHud.FindWidget(fmt::format(FMT_STRING("{}loz{}"), modelName, menuItemOrder))); item.x4_model_icon = - static_cast(x0_baseHud.FindWidget(fmt::format(fmt("{}icon{}"), modelName, menuItemOrder))); + static_cast(x0_baseHud.FindWidget(fmt::format(FMT_STRING("{}icon{}"), modelName, menuItemOrder))); item.xc_opacity = enables[i] ? 1.f : 0.f; } diff --git a/Runtime/IOStreams.cpp b/Runtime/IOStreams.cpp index 39ba621a0..2b76b7e67 100644 --- a/Runtime/IOStreams.cpp +++ b/Runtime/IOStreams.cpp @@ -8,7 +8,7 @@ namespace urde { #if DUMP_BITS static void PrintBinary(u32 val, u32 count) { for (u32 i = 0; i < count; ++i) { - fmt::print(fmt("{}"), (val >> (count - i - 1)) & 0x1); + fmt::print(FMT_STRING("{}"), (val >> (count - i - 1)) & 0x1); } } #endif @@ -57,7 +57,7 @@ s32 CBitStreamReader::ReadEncoded(u32 bitCount) { #if DUMP_BITS std::fputs("READ ", stdout); PrintBinary(ret, bitCount); - fmt::print(fmt(" {} {}\n"), pos, boff); + fmt::print(FMT_STRING(" {} {}\n"), pos, boff); #endif return ret; @@ -67,7 +67,7 @@ void CBitStreamWriter::WriteEncoded(u32 val, u32 bitCount) { #if DUMP_BITS std::fputs("WRITE ", stdout); PrintBinary(val, bitCount); - fmt::print(fmt(" {} {}\n"), position(), x18_bitOffset); + fmt::print(FMT_STRING(" {} {}\n"), position(), x18_bitOffset); #endif const s32 shiftAmt = x18_bitOffset - s32(bitCount); diff --git a/Runtime/MP1/CFrontEndUI.cpp b/Runtime/MP1/CFrontEndUI.cpp index 9da2e65db..ae29e8072 100644 --- a/Runtime/MP1/CFrontEndUI.cpp +++ b/Runtime/MP1/CFrontEndUI.cpp @@ -509,7 +509,7 @@ void CFrontEndUI::SNewFileSelectFrame::SetupFrameContents() { // Completion percent if (data) { std::u16string fileStr = g_MainStringTable->GetString((data->x20_hardMode ? 106 : 39) + int(i)); - str = fileStr + fmt::format(fmt(u" {:02d}%"), data->x18_itemPercent); + str = fileStr + fmt::format(FMT_STRING(u" {:02d}%"), data->x18_itemPercent); break; } str = g_MainStringTable->GetString(36); @@ -531,7 +531,7 @@ void CFrontEndUI::SNewFileSelectFrame::SetupFrameContents() { // Formatted time if (data) { auto pt = std::div(data->x0_playTime, 3600); - str = fmt::format(fmt(u"{:02d}:{:02d}:{:02d}"), pt.quot, pt.rem / 60, pt.rem % 60); + str = fmt::format(FMT_STRING(u"{:02d}:{:02d}:{:02d}"), pt.quot, pt.rem / 60, pt.rem % 60); break; } str = g_MainStringTable->GetString(52); @@ -647,11 +647,11 @@ void CFrontEndUI::SNewFileSelectFrame::DoFileMenuAdvance(CGuiTableGroup* caller) CFrontEndUI::SFileMenuOption CFrontEndUI::SNewFileSelectFrame::FindFileSelectOption(CGuiFrame* frame, int idx) { SFileMenuOption ret; - ret.x0_base = frame->FindWidget(fmt::format(fmt("basewidget_file{}"), idx)); - ret.x4_textpanes[0] = FindTextPanePair(frame, fmt::format(fmt("textpane_filename{}"), idx)); - ret.x4_textpanes[1] = FindTextPanePair(frame, fmt::format(fmt("textpane_world{}"), idx)); - ret.x4_textpanes[2] = FindTextPanePair(frame, fmt::format(fmt("textpane_playtime{}"), idx)); - ret.x4_textpanes[3] = FindTextPanePair(frame, fmt::format(fmt("textpane_date{}"), idx)); + ret.x0_base = frame->FindWidget(fmt::format(FMT_STRING("basewidget_file{}"), idx)); + ret.x4_textpanes[0] = FindTextPanePair(frame, fmt::format(FMT_STRING("textpane_filename{}"), idx)); + ret.x4_textpanes[1] = FindTextPanePair(frame, fmt::format(FMT_STRING("textpane_world{}"), idx)); + ret.x4_textpanes[2] = FindTextPanePair(frame, fmt::format(FMT_STRING("textpane_playtime{}"), idx)); + ret.x4_textpanes[3] = FindTextPanePair(frame, fmt::format(FMT_STRING("textpane_date{}"), idx)); return ret; } @@ -1111,14 +1111,14 @@ void CFrontEndUI::SGuiTextPair::SetPairText(std::u16string_view str) { CFrontEndUI::SGuiTextPair CFrontEndUI::FindTextPanePair(CGuiFrame* frame, std::string_view name) { SGuiTextPair ret; ret.x0_panes[0] = static_cast(frame->FindWidget(name)); - ret.x0_panes[1] = static_cast(frame->FindWidget(fmt::format(fmt("{}b"), name))); + ret.x0_panes[1] = static_cast(frame->FindWidget(fmt::format(FMT_STRING("{}b"), name))); return ret; } void CFrontEndUI::FindAndSetPairText(CGuiFrame* frame, std::string_view name, std::u16string_view str) { CGuiTextPane* w1 = static_cast(frame->FindWidget(name)); w1->TextSupport().SetText(str); - CGuiTextPane* w2 = static_cast(frame->FindWidget(fmt::format(fmt("{}b"), name))); + CGuiTextPane* w2 = static_cast(frame->FindWidget(fmt::format(FMT_STRING("{}b"), name))); w2->TextSupport().SetText(str); } @@ -1532,7 +1532,7 @@ void CFrontEndUI::SOptionsFrontEndFrame::SetRightUIText() { const auto& options = GameOptionsRegistry[userSel]; for (int i = 0; i < 5; ++i) { - std::string name = fmt::format(fmt("textpane_right{}"), i); + std::string name = fmt::format(FMT_STRING("textpane_right{}"), i); if (i < static_cast(options.first)) { FindTextPanePair(x1c_loadedFrame, name).SetPairText(x20_loadedPauseStrg->GetString(options.second[i].stringId)); x28_tablegroup_rightmenu->GetWorkerWidget(i)->SetIsSelectable(true); @@ -1594,7 +1594,7 @@ void CFrontEndUI::SOptionsFrontEndFrame::FinishedLoading() { // Visor, Display, Sound, Controller for (int i = 0; i < 4; ++i) { - const std::string name = fmt::format(fmt("textpane_filename{}"), i); + const std::string name = fmt::format(FMT_STRING("textpane_filename{}"), i); FindTextPanePair(x1c_loadedFrame, name).SetPairText(x20_loadedPauseStrg->GetString(16 + i)); } @@ -1766,7 +1766,7 @@ void CFrontEndUI::StartSlideShow(CArchitectureQueue& queue) { queue.Push(MakeMsg::CreateCreateIOWin(EArchMsgTarget::IOWinManager, 12, 11, std::make_shared())); } -std::string CFrontEndUI::GetAttractMovieFileName(int idx) { return fmt::format(fmt("Video/attract{}.thp"), idx); } +std::string CFrontEndUI::GetAttractMovieFileName(int idx) { return fmt::format(FMT_STRING("Video/attract{}.thp"), idx); } std::string CFrontEndUI::GetNextAttractMovieFileName() { std::string ret = GetAttractMovieFileName(xbc_nextAttract); diff --git a/Runtime/MP1/CMemoryCardDriver.cpp b/Runtime/MP1/CMemoryCardDriver.cpp index 0cf7076e4..a8a1b2669 100644 --- a/Runtime/MP1/CMemoryCardDriver.cpp +++ b/Runtime/MP1/CMemoryCardDriver.cpp @@ -667,7 +667,7 @@ void CMemoryCardDriver::InitializeFileInfo() { ExportPersistentOptions(); OSCalendarTime time = CBasics::ToCalendarTime(std::chrono::system_clock::now()); - std::string timeString = fmt::format(fmt("{:02d}.{:02d}.{:02d} {:02d}:{:02d}"), + std::string timeString = fmt::format(FMT_STRING("{:02d}.{:02d}.{:02d} {:02d}:{:02d}"), time.x10_mon + 1, time.xc_mday, time.x14_year % 100, time.x8_hour, time.x4_min); std::string comment("Metroid Prime "); diff --git a/Runtime/MP1/CPauseScreen.cpp b/Runtime/MP1/CPauseScreen.cpp index 706156aa2..0d1af0369 100644 --- a/Runtime/MP1/CPauseScreen.cpp +++ b/Runtime/MP1/CPauseScreen.cpp @@ -224,17 +224,17 @@ void CPauseScreen::ProcessControllerInput(const CStateManager& mgr, const CFinal } x38_textpane_l1->TextSupport().SetText( - fmt::format(fmt("&image={};"), g_tweakPlayerRes->x74_lTrigger[ + fmt::format(FMT_STRING("&image={};"), g_tweakPlayerRes->x74_lTrigger[ ControlMapper::GetDigitalInput(ControlMapper::ECommands::PreviousPauseScreen, useInput) || m_lDown])); x3c_textpane_r->TextSupport().SetText( - fmt::format(fmt("&image={};"), g_tweakPlayerRes->x80_rTrigger[ + fmt::format(FMT_STRING("&image={};"), g_tweakPlayerRes->x80_rTrigger[ ControlMapper::GetDigitalInput(ControlMapper::ECommands::NextPauseScreen, useInput) || m_rDown])); x48_textpane_return->TextSupport().SetText( - fmt::format(fmt("&image={};"), g_tweakPlayerRes->x8c_startButton[useInput.DStart() || m_returnDown])); + fmt::format(FMT_STRING("&image={};"), g_tweakPlayerRes->x8c_startButton[useInput.DStart() || m_returnDown])); x50_textpane_back->TextSupport().SetText( - fmt::format(fmt("&image={};"), g_tweakPlayerRes->x98_aButton[useInput.DA() || m_backDown])); + fmt::format(FMT_STRING("&image={};"), g_tweakPlayerRes->x98_aButton[useInput.DA() || m_backDown])); x4c_textpane_next->TextSupport().SetText( - fmt::format(fmt("&image={};"), g_tweakPlayerRes->xa4_bButton[useInput.DB() || m_nextDown])); + fmt::format(FMT_STRING("&image={};"), g_tweakPlayerRes->xa4_bButton[useInput.DB() || m_nextDown])); } void CPauseScreen::TransitionComplete() { diff --git a/Runtime/MP1/CPauseScreenBase.cpp b/Runtime/MP1/CPauseScreenBase.cpp index f8d4adde5..0351a5c81 100644 --- a/Runtime/MP1/CPauseScreenBase.cpp +++ b/Runtime/MP1/CPauseScreenBase.cpp @@ -79,7 +79,7 @@ void CPauseScreenBase::InitializeFrameGlue() { x17c_model_textalpha = static_cast(x8_frame.FindWidget("model_textalpha")); x184_textpane_yicon = static_cast(x8_frame.FindWidget("textpane_yicon")); x188_textpane_ytext = static_cast(x8_frame.FindWidget("textpane_ytext")); - x184_textpane_yicon->TextSupport().SetText(fmt::format(fmt(u"&image={};"), g_tweakPlayerRes->xbc_yButton[0])); + x184_textpane_yicon->TextSupport().SetText(fmt::format(FMT_STRING(u"&image={};"), g_tweakPlayerRes->xbc_yButton[0])); x188_textpane_ytext->TextSupport().SetText(xc_pauseStrg.GetString(99)); x188_textpane_ytext->SetColor(g_tweakGuiColors->GetPauseItemAmberColor()); x18c_slidergroup_slider = static_cast(x8_frame.FindWidget("slidergroup_slider")); @@ -105,18 +105,18 @@ void CPauseScreenBase::InitializeFrameGlue() { for (int i = 0; i < 5; ++i) { xd8_textpane_titles.push_back( - static_cast(x8_frame.FindWidget(fmt::format(fmt("textpane_title{}"), i + 1)))); + static_cast(x8_frame.FindWidget(fmt::format(FMT_STRING("textpane_title{}"), i + 1)))); xd8_textpane_titles.back()->TextSupport().SetText(u""); - x144_model_titles.push_back(static_cast(x8_frame.FindWidget(fmt::format(fmt("model_title{}"), i + 1)))); + x144_model_titles.push_back(static_cast(x8_frame.FindWidget(fmt::format(FMT_STRING("model_title{}"), i + 1)))); m_model_lefttitledecos.push_back( - static_cast(x8_frame.FindWidget(fmt::format(fmt("model_lefttitledeco{}"), i)))); + static_cast(x8_frame.FindWidget(fmt::format(FMT_STRING("model_lefttitledeco{}"), i)))); m_model_lefttitledecos.back()->SetMouseActive(true); x15c_model_righttitledecos.push_back( - static_cast(x8_frame.FindWidget(fmt::format(fmt("model_righttitledeco{}"), i + 1)))); + static_cast(x8_frame.FindWidget(fmt::format(FMT_STRING("model_righttitledeco{}"), i + 1)))); x15c_model_righttitledecos.back()->SetMouseActive(true); xa8_textpane_categories.push_back( - static_cast(x8_frame.FindWidget(fmt::format(fmt("textpane_category{}"), i)))); - xc0_model_categories.push_back(static_cast(x8_frame.FindWidget(fmt::format(fmt("model_category{}"), i)))); + static_cast(x8_frame.FindWidget(fmt::format(FMT_STRING("textpane_category{}"), i)))); + xc0_model_categories.push_back(static_cast(x8_frame.FindWidget(fmt::format(FMT_STRING("model_category{}"), i)))); } for (int i = 0; i < 20; ++i) @@ -542,7 +542,7 @@ std::string CPauseScreenBase::GetImagePaneName(u32 i) { "4", "5", "6", "7", "45", "56", "67", "456", "567", "4567", }; - return fmt::format(fmt("imagepane_pane{}"), PaneSuffixes[i]); + return fmt::format(FMT_STRING("imagepane_pane{}"), PaneSuffixes[i]); } } // namespace urde::MP1 diff --git a/Runtime/MP1/CSamusHud.cpp b/Runtime/MP1/CSamusHud.cpp index 8d003aa98..8fe61b2b3 100644 --- a/Runtime/MP1/CSamusHud.cpp +++ b/Runtime/MP1/CSamusHud.cpp @@ -116,7 +116,7 @@ void CSamusHud::InitializeFrameGluePermanent(const CStateManager& mgr) { for (size_t i = 0; i < x5a4_videoBands.size(); ++i) { SVideoBand& band = x5a4_videoBands[i]; band.x0_videoband = - static_cast(x274_loadedFrmeBaseHud->FindWidget(fmt::format(fmt("model_videoband{}"), i))); + static_cast(x274_loadedFrmeBaseHud->FindWidget(fmt::format(FMT_STRING("model_videoband{}"), i))); band.x4_randA = 6 + (std::rand() % ((66 - 6) + 1)); band.x8_randB = 16 + (std::rand() % ((256 - 16) + 1)); } @@ -1301,7 +1301,7 @@ void CSamusHud::Update(float dt, const CStateManager& mgr, CInGameGuiManager::EH int minutes = mgr.GetEscapeSequenceTimer() / 60.f; int seconds = std::fmod(mgr.GetEscapeSequenceTimer(), 60.f); int hundredths = std::fmod(mgr.GetEscapeSequenceTimer() * 100.f, 100.f); - std::string timeStr = fmt::format(fmt("{:02d}:{:02d}:{:02d}"), int(minutes), int(seconds), int(hundredths)); + std::string timeStr = fmt::format(FMT_STRING("{:02d}:{:02d}:{:02d}"), int(minutes), int(seconds), int(hundredths)); x594_base_textpane_counter->TextSupport().SetText(timeStr); x594_base_textpane_counter->SetIsVisible(true); diff --git a/Runtime/MP1/CSlideShow.cpp b/Runtime/MP1/CSlideShow.cpp index 9c588f7cd..50338b7ab 100644 --- a/Runtime/MP1/CSlideShow.cpp +++ b/Runtime/MP1/CSlideShow.cpp @@ -101,7 +101,7 @@ CIOWin::EMessageReturn CSlideShow::OnMessage(const CArchitectureMessage& msg, CA if (x18_galleryTXTRDeps.empty()) { x18_galleryTXTRDeps.reserve(5); for (int i = 1; true; ++i) { - std::string depResName = fmt::format(fmt("Gallery{:02d}_DGRP"), i); + std::string depResName = fmt::format(FMT_STRING("Gallery{:02d}_DGRP"), i); if (!LoadTXTRDep(depResName)) break; } diff --git a/Runtime/MP1/MP1.cpp b/Runtime/MP1/MP1.cpp index eb89c9578..ee5eb0094 100644 --- a/Runtime/MP1/MP1.cpp +++ b/Runtime/MP1/MP1.cpp @@ -371,7 +371,7 @@ void CMain::AddOverridePaks() { * the higher the number the higer the priority, e.g: Override0 has less priority than Override1 etc. */ for (size_t i = 999; i > 0; --i) { - const std::string path = fmt::format(fmt("Override{}"), i); + const std::string path = fmt::format(FMT_STRING("Override{}"), i); if (CDvdFile::FileExists(path + ".upak")) { loader->AddPakFileAsync(path, false, false, true); } @@ -459,13 +459,13 @@ void CMain::Give(hecl::Console* console, const std::vector& args) { } else { CPlayerState::EItemType eType = CPlayerState::ItemNameToType(type); if (eType == CPlayerState::EItemType::Invalid) { - console->report(hecl::Console::Level::Info, fmt("Invalid item {}"), type); + console->report(hecl::Console::Level::Info, FMT_STRING("Invalid item {}"), type); return; } if (eType == CPlayerState::EItemType::HealthRefill) { pState->IncrPickup(eType, 9999); console->report(hecl::Console::Level::Info, - fmt("Cheater....., Greatly increasing Metroid encounters, have fun!")); + FMT_STRING("Cheater....., Greatly increasing Metroid encounters, have fun!")); if (g_StateManager) g_StateManager->Player()->AsyncLoadSuit(*g_StateManager); return; @@ -495,7 +495,7 @@ void CMain::Give(hecl::Console* console, const std::vector& args) { } if (g_StateManager) g_StateManager->Player()->AsyncLoadSuit(*g_StateManager); - console->report(hecl::Console::Level::Info, fmt("Cheater....., Greatly increasing Metroid encounters, have fun!")); + console->report(hecl::Console::Level::Info, FMT_STRING("Cheater....., Greatly increasing Metroid encounters, have fun!")); } // namespace MP1 void CMain::Remove(hecl::Console*, const std::vector& args) { @@ -523,9 +523,9 @@ void CMain::God(hecl::Console* con, const std::vector&) { if (g_GameState && g_GameState->GetPlayerState()) { g_GameState->GetPlayerState()->SetCanTakeDamage(!g_GameState->GetPlayerState()->CanTakeDamage()); if (!g_GameState->GetPlayerState()->CanTakeDamage()) - con->report(hecl::Console::Level::Info, fmt("God Mode Enabled")); + con->report(hecl::Console::Level::Info, FMT_STRING("God Mode Enabled")); else - con->report(hecl::Console::Level::Info, fmt("God Mode Disabled")); + con->report(hecl::Console::Level::Info, FMT_STRING("God Mode Disabled")); } } @@ -556,7 +556,7 @@ void CMain::ListWorlds(hecl::Console* con, const std::vector&) { if (pak->IsWorldPak()) { for (const auto& named : pak->GetNameList()) if (named.second.type == SBIG('MLVL')) { - con->report(hecl::Console::Level::Info, fmt("{} '{}'"), named.first, named.second.id); + con->report(hecl::Console::Level::Info, FMT_STRING("{} '{}'"), named.first, named.second.id); } } } @@ -674,7 +674,7 @@ void CMain::UpdateDiscordPresence(CAssetId worldSTRG) { u32 itemPercent = pState->CalculateItemCollectionRate() * 100 / pState->GetPickupTotal(); if (DiscordItemPercent != itemPercent) { DiscordItemPercent = itemPercent; - DiscordState = fmt::format(fmt("{}%"), itemPercent); + DiscordState = fmt::format(FMT_STRING("{}%"), itemPercent); updated = true; } } @@ -690,14 +690,14 @@ void CMain::UpdateDiscordPresence(CAssetId worldSTRG) { } } -void CMain::HandleDiscordReady(const DiscordUser* request) { DiscordLog.report(logvisor::Info, fmt("Discord Ready")); } +void CMain::HandleDiscordReady(const DiscordUser* request) { DiscordLog.report(logvisor::Info, FMT_STRING("Discord Ready")); } void CMain::HandleDiscordDisconnected(int errorCode, const char* message) { - DiscordLog.report(logvisor::Warning, fmt("Discord Disconnected: {}"), message); + DiscordLog.report(logvisor::Warning, FMT_STRING("Discord Disconnected: {}"), message); } void CMain::HandleDiscordErrored(int errorCode, const char* message) { - DiscordLog.report(logvisor::Error, fmt("Discord Error: {}"), message); + DiscordLog.report(logvisor::Error, FMT_STRING("Discord Error: {}"), message); } void CMain::Init(const hecl::Runtime::FileStoreManager& storeMgr, hecl::CVarManager* cvarMgr, boo::IWindow* window, @@ -825,7 +825,7 @@ void CMain::WarmupShaders() { m_warmupIt = m_warmupTags.begin(); - WarmupLog.report(logvisor::Info, fmt("Began warmup of {} objects"), m_warmupTags.size()); + WarmupLog.report(logvisor::Info, FMT_STRING("Began warmup of {} objects"), m_warmupTags.size()); } bool CMain::Proc() { @@ -882,7 +882,7 @@ void CMain::Draw() { } auto startTime = std::chrono::steady_clock::now(); while (m_warmupIt != m_warmupTags.end()) { - WarmupLog.report(logvisor::Info, fmt("[{} / {}] Warming {}"), int(m_warmupIt - m_warmupTags.begin() + 1), + WarmupLog.report(logvisor::Info, FMT_STRING("[{} / {}] Warming {}"), int(m_warmupIt - m_warmupTags.begin() + 1), int(m_warmupTags.size()), *m_warmupIt); if (m_warmupIt->type == FOURCC('CMDL')) @@ -898,7 +898,7 @@ void CMain::Draw() { } if (m_warmupIt == m_warmupTags.end()) { m_warmupTags = std::vector(); - WarmupLog.report(logvisor::Info, fmt("Finished warmup")); + WarmupLog.report(logvisor::Info, FMT_STRING("Finished warmup")); } return; } diff --git a/Runtime/MP1/MP1.hpp b/Runtime/MP1/MP1.hpp index f805dff6a..eea752799 100644 --- a/Runtime/MP1/MP1.hpp +++ b/Runtime/MP1/MP1.hpp @@ -204,7 +204,7 @@ class CMain : public IMain int appMain(boo::IApplication* app); void appQuitting(boo::IApplication*) { xe8_b24_finished = true; } void appFilesOpen(boo::IApplication*, const std::vector& paths) { - fmt::print(stderr, fmt("OPENING: ")); + fmt::print(stderr, FMT_STRING("OPENING: ")); for (const std::string& path : paths) fprintf(stderr, "%s ", path.c_str()); fprintf(stderr, "\n"); diff --git a/Runtime/MP1/World/CSpankWeed.cpp b/Runtime/MP1/World/CSpankWeed.cpp index 223d1dc20..2bdb9bff0 100644 --- a/Runtime/MP1/World/CSpankWeed.cpp +++ b/Runtime/MP1/World/CSpankWeed.cpp @@ -29,7 +29,7 @@ CSpankWeed::CSpankWeed(TUniqueId uid, std::string_view name, const CEntityInfo& GetModelData()->SetScale(zeus::CVector3f(scale)); SpankLog.report(logvisor::Level::Warning, - fmt("WARNING: Non-uniform scale {} applied to Spank Weed" + FMT_STRING("WARNING: Non-uniform scale {} applied to Spank Weed" "...changing scale to ({} {} {})\n"), modelScale, scale, scale, scale); } diff --git a/Runtime/MP1/World/CThardus.cpp b/Runtime/MP1/World/CThardus.cpp index ae6c743a9..0961b8c14 100644 --- a/Runtime/MP1/World/CThardus.cpp +++ b/Runtime/MP1/World/CThardus.cpp @@ -920,7 +920,7 @@ void CThardus::sub801dae2c(CStateManager& mgr, u32 rockIndex) { void CThardus::sub801dc444(CStateManager& mgr, const zeus::CVector3f& pos, CAssetId particle) { u32 w = x6f4_; ++x6f4_; - std::string particleName = fmt::format(fmt("ROCK_EFFECT{}-{}"), particle.Value(), w); + std::string particleName = fmt::format(FMT_STRING("ROCK_EFFECT{}-{}"), particle.Value(), w); GetModelData()->GetAnimationData()->GetParticleDB().AddAuxiliaryParticleEffect( particleName, 0x40, CAuxiliaryParticleData(0, {FOURCC('PART'), particle}, pos, 1.f), 2.f * GetModelData()->GetScale(), mgr, GetAreaIdAlways(), 0); diff --git a/Runtime/Particle/CDecalDataFactory.cpp b/Runtime/Particle/CDecalDataFactory.cpp index 48ea6300a..edb35b7f2 100644 --- a/Runtime/Particle/CDecalDataFactory.cpp +++ b/Runtime/Particle/CDecalDataFactory.cpp @@ -85,7 +85,7 @@ bool CDecalDataFactory::CreateDPSM(CDecalDescription* desc, CInputStream& in, CS desc->x5c_25_DMOO = CPF::GetBool(in); break; default: { - Log.report(logvisor::Fatal, fmt("Unknown DPSC class {} @{}"), clsId, in.position()); + Log.report(logvisor::Fatal, FMT_STRING("Unknown DPSC class {} @{}"), clsId, in.position()); return false; } } diff --git a/Runtime/Particle/CElementGen.cpp b/Runtime/Particle/CElementGen.cpp index 479d44e56..8aece4666 100644 --- a/Runtime/Particle/CElementGen.cpp +++ b/Runtime/Particle/CElementGen.cpp @@ -255,7 +255,7 @@ bool CElementGen::Update(double t) { if (pswtElem && !x26d_25_warmedUp) { int pswt = 0; pswtElem->GetValue(x74_curFrame, pswt); - //Log.report(logvisor::Info, fmt("Running warmup on particle system 0x%08x for %d ticks."), desc, pswt); + //Log.report(logvisor::Info, FMT_STRING("Running warmup on particle system 0x%08x for %d ticks."), desc, pswt); InternalUpdate((1.f / 60.f) * pswt); x26d_25_warmedUp = true; } @@ -813,7 +813,7 @@ u32 CElementGen::GetSystemCount() const { } void CElementGen::Render(const CActorLights* actorLights) { - SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(fmt("CElementGen::Render {}"), + SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CElementGen::Render {}"), *x1c_genDesc.GetObjectTag()).c_str(), zeus::skYellow); CGenDescription* desc = x1c_genDesc.GetObj(); @@ -898,7 +898,7 @@ void CElementGen::RenderModels(const CActorLights* actorLights) { g_instNoTexData.reserve(x30_particles.size()); break; default: - Log.report(logvisor::Fatal, fmt("unexpected particle shader class")); + Log.report(logvisor::Fatal, FMT_STRING("unexpected particle shader class")); break; } @@ -1310,7 +1310,7 @@ void CElementGen::RenderParticles() { g_instNoTexData.reserve(x30_particles.size()); break; default: - Log.report(logvisor::Fatal, fmt("unexpected particle shader class")); + Log.report(logvisor::Fatal, FMT_STRING("unexpected particle shader class")); break; } @@ -1499,7 +1499,7 @@ void CElementGen::RenderParticles() { g_instNoTexData.reserve(x30_particles.size() * mbspVal); break; default: - Log.report(logvisor::Fatal, fmt("unexpected particle shader class")); + Log.report(logvisor::Fatal, FMT_STRING("unexpected particle shader class")); break; } const float mbspFac = 1.f / float(mbspVal); diff --git a/Runtime/Particle/CParticleDataFactory.cpp b/Runtime/Particle/CParticleDataFactory.cpp index cf0b89f2b..ae6c5eedf 100644 --- a/Runtime/Particle/CParticleDataFactory.cpp +++ b/Runtime/Particle/CParticleDataFactory.cpp @@ -18,7 +18,7 @@ s32 CParticleDataFactory::GetInt(CInputStream& in) { return in.readInt32Big(); } bool CParticleDataFactory::GetBool(CInputStream& in) { FourCC cid = GetClassID(in); if (cid != FOURCC('CNST')) - Log.report(logvisor::Fatal, fmt("bool element does not begin with CNST")); + Log.report(logvisor::Fatal, FMT_STRING("bool element does not begin with CNST")); return in.readBool(); } @@ -984,7 +984,7 @@ bool CParticleDataFactory::CreateGPSM(CGenDescription* fillDesc, CInputStream& i fillDesc->xec_xd8_SELC = GetElectricGeneratorDesc(in, resPool); break; default: { - Log.report(logvisor::Fatal, fmt("Unknown GPSM class {} @{}"), clsId, in.position()); + Log.report(logvisor::Fatal, FMT_STRING("Unknown GPSM class {} @{}"), clsId, in.position()); return false; } } diff --git a/Runtime/Particle/CParticleElectric.cpp b/Runtime/Particle/CParticleElectric.cpp index 679f6a773..777c83593 100644 --- a/Runtime/Particle/CParticleElectric.cpp +++ b/Runtime/Particle/CParticleElectric.cpp @@ -556,7 +556,7 @@ bool CParticleElectric::Update(double dt) { } void CParticleElectric::Render(const CActorLights* lights) { - SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(fmt("CParticleElectric::Render {}"), + SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CParticleElectric::Render {}"), *x1c_elecDesc.GetObjectTag()).c_str(), zeus::skYellow); if (x3e8_electricManagers.size()) { diff --git a/Runtime/Particle/CParticleElectricDataFactory.cpp b/Runtime/Particle/CParticleElectricDataFactory.cpp index fe366b70a..dc88cb621 100644 --- a/Runtime/Particle/CParticleElectricDataFactory.cpp +++ b/Runtime/Particle/CParticleElectricDataFactory.cpp @@ -107,7 +107,7 @@ bool CParticleElectricDataFactory::CreateELSM(CElectricDescription* desc, CInput desc->x70_ZERY = CPF::GetBool(in); break; default: { - Log.report(logvisor::Fatal, fmt("Unknown ELSM class {} @{}"), clsId, in.position()); + Log.report(logvisor::Fatal, FMT_STRING("Unknown ELSM class {} @{}"), clsId, in.position()); return false; } } diff --git a/Runtime/Particle/CParticleSwoosh.cpp b/Runtime/Particle/CParticleSwoosh.cpp index 2017a328d..3e7f341a8 100644 --- a/Runtime/Particle/CParticleSwoosh.cpp +++ b/Runtime/Particle/CParticleSwoosh.cpp @@ -882,7 +882,7 @@ void CParticleSwoosh::Render2SidedNoSplineNoGaps() { void CParticleSwoosh::Render(const CActorLights*) { if (x1b4_LENG < 2 || x1ac_particleCount <= 1) return; - SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(fmt("CParticleSwoosh::Render {}"), + SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CParticleSwoosh::Render {}"), *x1c_desc.GetObjectTag()).c_str(), zeus::skYellow); m_cachedVerts.clear(); diff --git a/Runtime/Particle/CParticleSwooshDataFactory.cpp b/Runtime/Particle/CParticleSwooshDataFactory.cpp index 122d93b02..76ef71e19 100644 --- a/Runtime/Particle/CParticleSwooshDataFactory.cpp +++ b/Runtime/Particle/CParticleSwooshDataFactory.cpp @@ -122,7 +122,7 @@ bool CParticleSwooshDataFactory::CreateWPSM(CSwooshDescription* desc, CInputStre desc->x45_26_CRND = CPF::GetBool(in); break; default: { - Log.report(logvisor::Fatal, fmt("Unknown SWSH class {} @{}"), clsId, in.position()); + Log.report(logvisor::Fatal, FMT_STRING("Unknown SWSH class {} @{}"), clsId, in.position()); return false; } } diff --git a/Runtime/Particle/CProjectileWeaponDataFactory.cpp b/Runtime/Particle/CProjectileWeaponDataFactory.cpp index 6727f4295..3eae8c2e4 100644 --- a/Runtime/Particle/CProjectileWeaponDataFactory.cpp +++ b/Runtime/Particle/CProjectileWeaponDataFactory.cpp @@ -150,7 +150,7 @@ bool CProjectileWeaponDataFactory::CreateWPSM(CWeaponDescription* desc, CInputSt desc->xb0_FOFF = CPF::GetRealElement(in); break; default: { - Log.report(logvisor::Fatal, fmt("Unknown WPSM class {} @{}"), clsId, in.position()); + Log.report(logvisor::Fatal, FMT_STRING("Unknown WPSM class {} @{}"), clsId, in.position()); return false; } } diff --git a/Runtime/RetroTypes.cpp b/Runtime/RetroTypes.cpp index d9fc73d5d..3a94df7d5 100644 --- a/Runtime/RetroTypes.cpp +++ b/Runtime/RetroTypes.cpp @@ -15,9 +15,9 @@ CAssetId::CAssetId(CInputStream& in) { else if (g_Main->GetExpectedIdSize() == sizeof(u64)) Assign(in.readUint64Big()); else - Log.report(logvisor::Fatal, fmt("Unsupported id length {}"), g_Main->GetExpectedIdSize()); + Log.report(logvisor::Fatal, FMT_STRING("Unsupported id length {}"), g_Main->GetExpectedIdSize()); } else - Log.report(logvisor::Fatal, fmt("Input constructor called before runtime Main entered!")); + Log.report(logvisor::Fatal, FMT_STRING("Input constructor called before runtime Main entered!")); } void CAssetId::PutTo(COutputStream& out) { @@ -27,9 +27,9 @@ void CAssetId::PutTo(COutputStream& out) { else if (g_Main->GetExpectedIdSize() == sizeof(u64)) out.writeUint64Big(id); else - Log.report(logvisor::Fatal, fmt("Unsupported id length {}"), g_Main->GetExpectedIdSize()); + Log.report(logvisor::Fatal, FMT_STRING("Unsupported id length {}"), g_Main->GetExpectedIdSize()); } else - Log.report(logvisor::Fatal, fmt("PutTo called before runtime Main entered!")); + Log.report(logvisor::Fatal, FMT_STRING("PutTo called before runtime Main entered!")); } } // namespace urde \ No newline at end of file diff --git a/Runtime/Weapon/CEnergyProjectile.cpp b/Runtime/Weapon/CEnergyProjectile.cpp index bd0c83d8f..e829d3c13 100644 --- a/Runtime/Weapon/CEnergyProjectile.cpp +++ b/Runtime/Weapon/CEnergyProjectile.cpp @@ -190,7 +190,7 @@ void CEnergyProjectile::Think(float dt, CStateManager& mgr) { } void CEnergyProjectile::Render(CStateManager& mgr) { - SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(fmt("CEnergyProjectile::Render WPSC_{}"), x2cc_wpscId).c_str(), zeus::skOrange); + SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CEnergyProjectile::Render WPSC_{}"), x2cc_wpscId).c_str(), zeus::skOrange); CPlayerState::EPlayerVisor visor = mgr.GetPlayerState()->GetActiveVisor(mgr); if (visor == CPlayerState::EPlayerVisor::Combat) { diff --git a/Runtime/World/CActor.cpp b/Runtime/World/CActor.cpp index cf6b100e5..ee78f3806 100644 --- a/Runtime/World/CActor.cpp +++ b/Runtime/World/CActor.cpp @@ -222,7 +222,7 @@ void CActor::DrawTouchBounds() const { void CActor::RenderInternal(const CStateManager& mgr) const { SCOPED_GRAPHICS_DEBUG_GROUP( - fmt::format(fmt("CActor::RenderInternal {} {} {}"), x8_uid, xc_editorId, x10_name).c_str(), zeus::skOrange); + fmt::format(FMT_STRING("CActor::RenderInternal {} {} {}"), x8_uid, xc_editorId, x10_name).c_str(), zeus::skOrange); CModelData::EWhichModel which = CModelData::GetRenderingModel(mgr); if (which == CModelData::EWhichModel::ThermalHot) { diff --git a/Runtime/World/CFishCloud.cpp b/Runtime/World/CFishCloud.cpp index 80d16c219..1a0b5635a 100644 --- a/Runtime/World/CFishCloud.cpp +++ b/Runtime/World/CFishCloud.cpp @@ -530,7 +530,7 @@ void CFishCloud::RenderBoid(int idx, const CBoid& boid, u32& drawMask, void CFishCloud::Render(CStateManager& mgr) { if (!GetActive()) return; - SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(fmt("CFishCloud::Render {} {} {}"), + SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CFishCloud::Render {} {} {}"), x8_uid, xc_editorId, x10_name).c_str(), zeus::skOrange); bool thermalHot = mgr.GetThermalDrawFlag() == EThermalDrawFlag::Hot; CModelFlags flags(0, 0, 3, zeus::skWhite); diff --git a/Runtime/World/CGameArea.cpp b/Runtime/World/CGameArea.cpp index 050adf9f7..28c5f04d2 100644 --- a/Runtime/World/CGameArea.cpp +++ b/Runtime/World/CGameArea.cpp @@ -253,7 +253,7 @@ std::pair, s32> GetScriptingMemoryAlways(const IGameArea& CMemoryInStream r(data.get() + 4, 96 - 4); u32 version = r.readUint32Big(); if (!(version & 0x10000)) - Log.report(logvisor::Fatal, fmt("Attempted to load non-URDE MREA")); + Log.report(logvisor::Fatal, FMT_STRING("Attempted to load non-URDE MREA")); version &= ~0x10000; header.version = (version >= 12 && version <= 15) ? version : 0; @@ -1148,7 +1148,7 @@ SMREAHeader CGameArea::VerifyHeader() const { CMemoryInStream r(x110_mreaSecBufs[0].first.get() + 4, x110_mreaSecBufs[0].second - 4); u32 version = r.readUint32Big(); if (!(version & 0x10000)) - Log.report(logvisor::Fatal, fmt("Attempted to load non-URDE MREA")); + Log.report(logvisor::Fatal, FMT_STRING("Attempted to load non-URDE MREA")); version &= ~0x10000; header.version = (version >= 12 && version <= 15) ? version : 0; if (!header.version) diff --git a/Runtime/World/CPathFindArea.cpp b/Runtime/World/CPathFindArea.cpp index 568dcbd85..ec3aae84b 100644 --- a/Runtime/World/CPathFindArea.cpp +++ b/Runtime/World/CPathFindArea.cpp @@ -123,7 +123,7 @@ CPFArea::CPFArea(std::unique_ptr&& buf, u32 len) { u32 version = r.readUint32Big(); if (version != 4) - Log.report(logvisor::Fatal, fmt("Unexpected PATH version {}, should be 4"), version); + Log.report(logvisor::Fatal, FMT_STRING("Unexpected PATH version {}, should be 4"), version); u32 numNodes = r.readUint32Big(); x140_nodes.reserve(numNodes); diff --git a/Runtime/World/CPlayer.cpp b/Runtime/World/CPlayer.cpp index ea281b5e8..4df145607 100644 --- a/Runtime/World/CPlayer.cpp +++ b/Runtime/World/CPlayer.cpp @@ -3948,7 +3948,7 @@ void CPlayer::SetOrbitState(EPlayerOrbitState state, CStateManager& mgr) { #ifndef NDEBUG if (x310_orbitTargetId != kInvalidUniqueId) { if (const CEntity* ent = mgr.GetObjectById(x310_orbitTargetId)) { - Log.report(logvisor::Info, fmt("Orbiting {} {}"), ent->GetEditorId(), ent->GetName()); + Log.report(logvisor::Info, FMT_STRING("Orbiting {} {}"), ent->GetEditorId(), ent->GetName()); } } #endif diff --git a/Runtime/World/CScriptGunTurret.cpp b/Runtime/World/CScriptGunTurret.cpp index 596a52c27..134ce33f8 100644 --- a/Runtime/World/CScriptGunTurret.cpp +++ b/Runtime/World/CScriptGunTurret.cpp @@ -395,7 +395,7 @@ void CScriptGunTurret::SetTurretState(ETurretState state, CStateManager& mgr) { if (state != ETurretState::Invalid && x520_state != state) { #ifndef NDEBUG - fmt::print(fmt("{} {} {} - {}\n"), GetUniqueId(), GetEditorId(), GetName(), StateNames[size_t(state)]); + fmt::print(FMT_STRING("{} {} {} - {}\n"), GetUniqueId(), GetEditorId(), GetName(), StateNames[size_t(state)]); #endif } diff --git a/Runtime/World/CScriptStreamedMusic.cpp b/Runtime/World/CScriptStreamedMusic.cpp index 841861bf4..0cf0e9e2e 100644 --- a/Runtime/World/CScriptStreamedMusic.cpp +++ b/Runtime/World/CScriptStreamedMusic.cpp @@ -27,7 +27,7 @@ void CScriptStreamedMusic::StartStream(CStateManager& mgr) { void CScriptStreamedMusic::TweakOverride(CStateManager& mgr) { const CWorld* wld = mgr.GetWorld(); const CGameArea* area = wld->GetAreaAlways(x4_areaId); - std::string twkName = fmt::format(fmt("Area {} MusicObject: {}"), area->GetAreaAssetId(), x10_name); + std::string twkName = fmt::format(FMT_STRING("Area {} MusicObject: {}"), area->GetAreaAssetId(), x10_name); if (g_TweakManager->HasTweakValue(twkName)) { const CTweakValue::Audio& audio = g_TweakManager->GetTweakValue(twkName)->GetAudio(); x34_fileName = audio.GetFileName(); diff --git a/Runtime/World/CStateMachine.cpp b/Runtime/World/CStateMachine.cpp index 14ddf2e4e..a0274536d 100644 --- a/Runtime/World/CStateMachine.cpp +++ b/Runtime/World/CStateMachine.cpp @@ -79,7 +79,7 @@ void CStateMachineState::Update(CStateManager& mgr, CAi& ai, float delta) { x4_state->CallFunc(mgr, ai, EStateMsg::Deactivate, 0.f); x4_state = state; #ifndef NDEBUG - fmt::print(fmt("{} {} {} - {} {}\n"), ai.GetUniqueId(), ai.GetEditorId(), ai.GetName(), + fmt::print(FMT_STRING("{} {} {} - {} {}\n"), ai.GetUniqueId(), ai.GetEditorId(), ai.GetName(), state->xc_name, int(state - x0_machine->GetStateVector().data())); #endif x8_time = 0.f; diff --git a/Runtime/World/CWallCrawlerSwarm.cpp b/Runtime/World/CWallCrawlerSwarm.cpp index 5faec5c3f..d6295dc53 100644 --- a/Runtime/World/CWallCrawlerSwarm.cpp +++ b/Runtime/World/CWallCrawlerSwarm.cpp @@ -1083,7 +1083,7 @@ void CWallCrawlerSwarm::RenderBoid(const CBoid* boid, u32& drawMask, bool therma } void CWallCrawlerSwarm::Render(CStateManager& mgr) { - SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(fmt("CWallCrawlerSwarm::Render {} {} {}"), + SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CWallCrawlerSwarm::Render {} {} {}"), x8_uid, xc_editorId, x10_name).c_str(), zeus::skOrange); u32 drawMask = 0xffffffff; const bool r24 = x560_24_enableLighting; diff --git a/Runtime/World/CWorld.cpp b/Runtime/World/CWorld.cpp index 3566ac5d7..7d38acbf7 100644 --- a/Runtime/World/CWorld.cpp +++ b/Runtime/World/CWorld.cpp @@ -350,7 +350,7 @@ bool CWorld::CheckWorldComplete(CStateManager* mgr, TAreaId id, CAssetId mreaId) if (version > 12) { x84_defAudioTrack = r.readString(); - std::string trackKey = fmt::format(fmt("WorldDefault: {}"), x8_mlvlId); + std::string trackKey = fmt::format(FMT_STRING("WorldDefault: {}"), x8_mlvlId); if (g_TweakManager->HasTweakValue(trackKey)) x84_defAudioTrack = g_TweakManager->GetTweakValue(trackKey)->GetAudio().GetFileName(); } diff --git a/Runtime/World/ScriptLoader.cpp b/Runtime/World/ScriptLoader.cpp index 1f2ad0087..68dde9d09 100644 --- a/Runtime/World/ScriptLoader.cpp +++ b/Runtime/World/ScriptLoader.cpp @@ -132,7 +132,7 @@ constexpr int skElitePiratePropCount = 41; static bool EnsurePropertyCount(int count, int expected, const char* structName) { if (count < expected) { - Log.report(logvisor::Warning, fmt("Insufficient number of props ({}/{}) for {} entity"), count, expected, + Log.report(logvisor::Warning, FMT_STRING("Insufficient number of props ({}/{}) for {} entity"), count, expected, structName); return false; } @@ -698,7 +698,7 @@ CEntity* ScriptLoader::LoadSound(CStateManager& mgr, CInputStream& in, int propC s32 pitch = in.readInt32Big(); if (soundId < 0) { - Log.report(logvisor::Warning, fmt("Invalid sound ID specified in Sound {} ({}), dropping..."), head.x0_name, + Log.report(logvisor::Warning, FMT_STRING("Invalid sound ID specified in Sound {} ({}), dropping..."), head.x0_name, info.GetEditorId()); return nullptr; } @@ -854,7 +854,7 @@ CEntity* ScriptLoader::LoadSpawnPoint(CStateManager& mgr, CInputStream& in, int CEntity* ScriptLoader::LoadCameraHint(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info) { if (propCount > 25) { - Log.report(logvisor::Warning, fmt("Too many props ({} > 25) for CameraHint entity"), propCount); + Log.report(logvisor::Warning, FMT_STRING("Too many props ({} > 25) for CameraHint entity"), propCount); return nullptr; } @@ -1362,7 +1362,7 @@ CEntity* ScriptLoader::LoadSpacePirate(CStateManager& mgr, CInputStream& in, int if (animParms.GetCharacter() == 0) { Log.report(logvisor::Warning, - fmt("SpacePirate <{}> has AnimationInformation property with invalid character selected"), head.x0_name); + FMT_STRING("SpacePirate <{}> has AnimationInformation property with invalid character selected"), head.x0_name); animParms.SetCharacter(2); } @@ -1591,7 +1591,7 @@ CEntity* ScriptLoader::LoadFlickerBat(CStateManager& mgr, CInputStream& in, int CEntity* ScriptLoader::LoadPathCamera(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info) { if (propCount > 15) { - Log.report(logvisor::Warning, fmt("Too many props ({} > 15) for PathCamera entity"), propCount); + Log.report(logvisor::Warning, FMT_STRING("Too many props ({} > 15) for PathCamera entity"), propCount); return nullptr; } @@ -2382,7 +2382,7 @@ CEntity* ScriptLoader::LoadVisorFlare(CStateManager& mgr, CInputStream& in, int CEntity* ScriptLoader::LoadWorldTeleporter(CStateManager& mgr, CInputStream& in, int propCount, const CEntityInfo& info) { if (propCount < 4 || propCount > 26) { - Log.report(logvisor::Warning, fmt("Incorrect number of props for WorldTeleporter")); + Log.report(logvisor::Warning, FMT_STRING("Incorrect number of props for WorldTeleporter")); return nullptr; } diff --git a/Runtime/rstl.hpp b/Runtime/rstl.hpp index eaf42903e..d1ceb77b3 100644 --- a/Runtime/rstl.hpp +++ b/Runtime/rstl.hpp @@ -363,7 +363,7 @@ public: void push_back(const T& d) { #ifndef NDEBUG if (x0_size == N) { - Log.report(logvisor::Fatal, fmt("push_back() called on full rstl::reserved_vector.")); + Log.report(logvisor::Fatal, FMT_STRING("push_back() called on full rstl::reserved_vector.")); } #endif @@ -374,7 +374,7 @@ public: void push_back(T&& d) { #ifndef NDEBUG if (x0_size == N) { - Log.report(logvisor::Fatal, fmt("push_back() called on full rstl::reserved_vector.")); + Log.report(logvisor::Fatal, FMT_STRING("push_back() called on full rstl::reserved_vector.")); } #endif @@ -386,7 +386,7 @@ public: T& emplace_back(_Args&&... args) { #ifndef NDEBUG if (x0_size == N) { - Log.report(logvisor::Fatal, fmt("emplace_back() called on full rstl::reserved_vector.")); + Log.report(logvisor::Fatal, FMT_STRING("emplace_back() called on full rstl::reserved_vector.")); } #endif @@ -400,7 +400,7 @@ public: void pop_back() { #ifndef NDEBUG if (x0_size == 0) { - Log.report(logvisor::Fatal, fmt("pop_back() called on empty rstl::reserved_vector.")); + Log.report(logvisor::Fatal, FMT_STRING("pop_back() called on empty rstl::reserved_vector.")); } #endif @@ -411,7 +411,7 @@ public: iterator insert(const_iterator pos, const T& value) { #ifndef NDEBUG if (x0_size == N) { - Log.report(logvisor::Fatal, fmt("insert() called on full rstl::reserved_vector.")); + Log.report(logvisor::Fatal, FMT_STRING("insert() called on full rstl::reserved_vector.")); } #endif @@ -432,7 +432,7 @@ public: iterator insert(const_iterator pos, T&& value) { #ifndef NDEBUG if (x0_size == N) - Log.report(logvisor::Fatal, fmt("insert() called on full rstl::reserved_vector.")); + Log.report(logvisor::Fatal, FMT_STRING("insert() called on full rstl::reserved_vector.")); #endif auto target_it = base::_const_cast_iterator(pos); if (pos == cend()) { @@ -451,7 +451,7 @@ public: void resize(size_t size) { #ifndef NDEBUG if (size > N) { - Log.report(logvisor::Fatal, fmt("resize() call overflows rstl::reserved_vector.")); + Log.report(logvisor::Fatal, FMT_STRING("resize() call overflows rstl::reserved_vector.")); } #endif @@ -473,7 +473,7 @@ public: void resize(size_t size, const T& value) { #ifndef NDEBUG if (size > N) { - Log.report(logvisor::Fatal, fmt("resize() call overflows rstl::reserved_vector.")); + Log.report(logvisor::Fatal, FMT_STRING("resize() call overflows rstl::reserved_vector.")); } #endif @@ -495,7 +495,7 @@ public: iterator erase(const_iterator pos) { #ifndef NDEBUG if (x0_size == 0) { - Log.report(logvisor::Fatal, fmt("erase() called on empty rstl::reserved_vector.")); + Log.report(logvisor::Fatal, FMT_STRING("erase() called on empty rstl::reserved_vector.")); } #endif @@ -554,7 +554,7 @@ public: [[nodiscard]] T& operator[](size_t idx) { #ifndef NDEBUG if (idx >= x0_size) { - Log.report(logvisor::Fatal, fmt("out of bounds access on reserved_vector.")); + Log.report(logvisor::Fatal, FMT_STRING("out of bounds access on reserved_vector.")); } #endif return _value(idx); @@ -562,7 +562,7 @@ public: [[nodiscard]] const T& operator[](size_t idx) const { #ifndef NDEBUG if (idx >= x0_size) { - Log.report(logvisor::Fatal, fmt("out of bounds access on reserved_vector.")); + Log.report(logvisor::Fatal, FMT_STRING("out of bounds access on reserved_vector.")); } #endif return _value(idx); diff --git a/Shaders/shader_CFluidPlaneShaderGLSL.cpp b/Shaders/shader_CFluidPlaneShaderGLSL.cpp index 9a2646d0c..7e7e218f4 100644 --- a/Shaders/shader_CFluidPlaneShaderGLSL.cpp +++ b/Shaders/shader_CFluidPlaneShaderGLSL.cpp @@ -332,19 +332,19 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { out << "#define TEXTURE_DECLS "; if (info.m_hasPatternTex1) - fmt::print(out, fmt("TBINDING{} uniform sampler2D patternTex1;"), nextTex++); + fmt::print(out, FMT_STRING("TBINDING{} uniform sampler2D patternTex1;"), nextTex++); if (info.m_hasPatternTex2) - fmt::print(out, fmt("TBINDING{} uniform sampler2D patternTex2;"), nextTex++); + fmt::print(out, FMT_STRING("TBINDING{} uniform sampler2D patternTex2;"), nextTex++); if (info.m_hasColorTex) - fmt::print(out, fmt("TBINDING{} uniform sampler2D colorTex;"), nextTex++); + fmt::print(out, FMT_STRING("TBINDING{} uniform sampler2D colorTex;"), nextTex++); if (info.m_hasBumpMap) - fmt::print(out, fmt("TBINDING{} uniform sampler2D bumpMap;"), nextTex++); + fmt::print(out, FMT_STRING("TBINDING{} uniform sampler2D bumpMap;"), nextTex++); if (info.m_hasEnvMap) - fmt::print(out, fmt("TBINDING{} uniform sampler2D envMap;"), nextTex++); + fmt::print(out, FMT_STRING("TBINDING{} uniform sampler2D envMap;"), nextTex++); if (info.m_hasEnvBumpMap) - fmt::print(out, fmt("TBINDING{} uniform sampler2D envBumpMap;"), nextTex++); + fmt::print(out, FMT_STRING("TBINDING{} uniform sampler2D envBumpMap;"), nextTex++); if (info.m_hasLightmap) - fmt::print(out, fmt("TBINDING{} uniform sampler2D lightMap;"), nextTex++); + fmt::print(out, FMT_STRING("TBINDING{} uniform sampler2D lightMap;"), nextTex++); out << '\n'; if (info.m_hasBumpMap) @@ -362,7 +362,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { case EFluidType::PhazonFluid: case EFluidType::Four: if (info.m_hasLightmap) { - fmt::print(out, fmt("vec4 lightMapTexel = texture(lightMap, vtf.uvs[{}]);"), lightmapUv); + fmt::print(out, FMT_STRING("vec4 lightMapTexel = texture(lightMap, vtf.uvs[{}]);"), lightmapUv); // 0: Tex4TCG, Tex4, doubleLightmapBlend ? NULL : GX_COLOR1A1 // ZERO, TEX, KONST, doubleLightmapBlend ? ZERO : RAS // Output reg 2 @@ -407,7 +407,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { if (info.m_hasColorTex && !info.m_hasEnvMap && info.m_hasEnvBumpMap) { // Make previous stage indirect, mtx0 - fmt::print(out, fmt( + fmt::print(out, FMT_STRING( "vec2 indUvs = (texture(envBumpMap, vtf.uvs[{}]).ra - vec2(0.5, 0.5)) * " "vec2(fog.indScale, -fog.indScale);"), envBumpMapUv); @@ -421,11 +421,11 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { // Make previous stage indirect, mtx0 if (info.m_hasColorTex) out << "colorOut += texture(colorTex, vtf.uvs[2]) * lighting;"; - fmt::print(out, fmt( + fmt::print(out, FMT_STRING( "vec2 indUvs = (texture(envBumpMap, vtf.uvs[{}]).ra - vec2(0.5, 0.5)) * " "vec2(fog.indScale, -fog.indScale);"), envBumpMapUv); - fmt::print(out, fmt("colorOut = mix(colorOut, texture(envMap, indUvs + vtf.uvs[{}]), kColor1);"), envMapUv); + fmt::print(out, FMT_STRING("colorOut = mix(colorOut, texture(envMap, indUvs + vtf.uvs[{}]), kColor1);"), envMapUv); } else if (info.m_hasColorTex) { out << "colorOut += texture(colorTex, vtf.uvs[2]) * lighting;"; } @@ -434,7 +434,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { case EFluidType::PoisonWater: if (info.m_hasLightmap) { - fmt::print(out, fmt("vec4 lightMapTexel = texture(lightMap, vtf.uvs[{}]);"), lightmapUv); + fmt::print(out, FMT_STRING("vec4 lightMapTexel = texture(lightMap, vtf.uvs[{}]);"), lightmapUv); // 0: Tex4TCG, Tex4, doubleLightmapBlend ? NULL : GX_COLOR1A1 // ZERO, TEX, KONST, doubleLightmapBlend ? ZERO : RAS // Output reg 2 @@ -480,7 +480,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { if (info.m_hasColorTex) { if (info.m_hasEnvBumpMap) { // Make previous stage indirect, mtx0 - fmt::print(out, fmt( + fmt::print(out, FMT_STRING( "vec2 indUvs = (texture(envBumpMap, vtf.uvs[{}]).ra - vec2(0.5, 0.5)) * " "vec2(fog.indScale, -fog.indScale);"), envBumpMapUv); @@ -534,7 +534,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { "vec3 lightVec = lights[3].pos.xyz - vtf.mvPos.xyz;" "float lx = dot(vtf.mvTangent.xyz, lightVec);" "float ly = dot(vtf.mvBinorm.xyz, lightVec);"; - fmt::print(out, fmt( + fmt::print(out, FMT_STRING( "vec4 emboss1 = texture(bumpMap, vtf.uvs[{}]) + vec4(0.5);" "vec4 emboss2 = texture(bumpMap, vtf.uvs[{}] + vec2(lx, ly));"), bumpMapUv, bumpMapUv); @@ -582,7 +582,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { // 3: bumpMapTCG, bumpMap, NULL // ZERO, TEX, PREV, ZERO // Output reg prev, scale 2 - fmt::print(out, fmt("vec4 emboss1 = texture(bumpMap, vtf.uvs[{}]) + vec4(0.5);"), bumpMapUv); + fmt::print(out, FMT_STRING("vec4 emboss1 = texture(bumpMap, vtf.uvs[{}]) + vec4(0.5);"), bumpMapUv); out << "colorOut *= emboss1 * vec4(2.0);"; } @@ -602,13 +602,13 @@ static void _BuildAdditionalTCGs(std::stringstream& out, const SFluidPlaneShader out << "#define ADDITIONAL_TCGS "; if (info.m_hasBumpMap) - fmt::print(out, fmt("vtf.uvs[{}] = (texMtxs[0] * pos).xy;"), nextTCG++); + fmt::print(out, FMT_STRING("vtf.uvs[{}] = (texMtxs[0] * pos).xy;"), nextTCG++); if (info.m_hasEnvBumpMap) - fmt::print(out, fmt("vtf.uvs[{}] = (texMtxs[3] * vec4(normalIn.xyz, 1.0)).xy;"), nextTCG++); + fmt::print(out, FMT_STRING("vtf.uvs[{}] = (texMtxs[3] * vec4(normalIn.xyz, 1.0)).xy;"), nextTCG++); if (info.m_hasEnvMap) - fmt::print(out, fmt("vtf.uvs[{}] = (texMtxs[{}] * pos).xy;"), nextTCG++, nextMtx++); + fmt::print(out, FMT_STRING("vtf.uvs[{}] = (texMtxs[{}] * pos).xy;"), nextTCG++, nextMtx++); if (info.m_hasLightmap) - fmt::print(out, fmt("vtf.uvs[{}] = (texMtxs[{}] * pos).xy;"), nextTCG, nextMtx); + fmt::print(out, FMT_STRING("vtf.uvs[{}] = (texMtxs[{}] * pos).xy;"), nextTCG, nextMtx); out << '\n'; } @@ -721,11 +721,11 @@ static std::string _BuildFS(const SFluidPlaneDoorShaderInfo& info) { out << "#define TEXTURE_DECLS "; if (info.m_hasPatternTex1) - fmt::print(out, fmt("TBINDING{} uniform sampler2D patternTex1;"), nextTex++); + fmt::print(out, FMT_STRING("TBINDING{} uniform sampler2D patternTex1;"), nextTex++); if (info.m_hasPatternTex2) - fmt::print(out, fmt("TBINDING{} uniform sampler2D patternTex2;"), nextTex++); + fmt::print(out, FMT_STRING("TBINDING{} uniform sampler2D patternTex2;"), nextTex++); if (info.m_hasColorTex) - fmt::print(out, fmt("TBINDING{} uniform sampler2D colorTex;"), nextTex++); + fmt::print(out, FMT_STRING("TBINDING{} uniform sampler2D colorTex;"), nextTex++); out << '\n'; // Tex0 * kColor0 * Tex1 + Tex2 diff --git a/Shaders/shader_CFluidPlaneShaderHLSL.cpp b/Shaders/shader_CFluidPlaneShaderHLSL.cpp index 32eff6cae..ebf81e869 100644 --- a/Shaders/shader_CFluidPlaneShaderHLSL.cpp +++ b/Shaders/shader_CFluidPlaneShaderHLSL.cpp @@ -368,37 +368,37 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { out << "#define TEXTURE_DECLS "; if (info.m_hasPatternTex1) - fmt::print(out, fmt("Texture2D patternTex1 : register(t{});"), nextTex++); + fmt::print(out, FMT_STRING("Texture2D patternTex1 : register(t{});"), nextTex++); if (info.m_hasPatternTex2) - fmt::print(out, fmt("Texture2D patternTex2 : register(t{});"), nextTex++); + fmt::print(out, FMT_STRING("Texture2D patternTex2 : register(t{});"), nextTex++); if (info.m_hasColorTex) - fmt::print(out, fmt("Texture2D colorTex : register(t{});"), nextTex++); + fmt::print(out, FMT_STRING("Texture2D colorTex : register(t{});"), nextTex++); if (info.m_hasBumpMap) - fmt::print(out, fmt("Texture2D bumpMap : register(t{});"), nextTex++); + fmt::print(out, FMT_STRING("Texture2D bumpMap : register(t{});"), nextTex++); if (info.m_hasEnvMap) - fmt::print(out, fmt("Texture2D envMap : register(t{});"), nextTex++); + fmt::print(out, FMT_STRING("Texture2D envMap : register(t{});"), nextTex++); if (info.m_hasEnvBumpMap) - fmt::print(out, fmt("Texture2D envBumpMap : register(t{});"), nextTex++); + fmt::print(out, FMT_STRING("Texture2D envBumpMap : register(t{});"), nextTex++); if (info.m_hasLightmap) - fmt::print(out, fmt("Texture2D lightMap : register(t{});"), nextTex++); + fmt::print(out, FMT_STRING("Texture2D lightMap : register(t{});"), nextTex++); out << '\n'; out << "#define ADDITIONAL_TCGS "; if (info.m_hasBumpMap) { bumpMapUv = nextTCG; - fmt::print(out, fmt("vtf.uvs[{}] = mul(texMtxs[0], pos).xy;"), nextTCG++); + fmt::print(out, FMT_STRING("vtf.uvs[{}] = mul(texMtxs[0], pos).xy;"), nextTCG++); } if (info.m_hasEnvBumpMap) { envBumpMapUv = nextTCG; - fmt::print(out, fmt("vtf.uvs[{}] = mul(texMtxs[3], float4(normalIn.xyz, 1.0)).xy;"), nextTCG++); + fmt::print(out, FMT_STRING("vtf.uvs[{}] = mul(texMtxs[3], float4(normalIn.xyz, 1.0)).xy;"), nextTCG++); } if (info.m_hasEnvMap) { envMapUv = nextTCG; - fmt::print(out, fmt("vtf.uvs[{}] = mul(texMtxs[{}], pos).xy;"), nextTCG++, nextMtx++); + fmt::print(out, FMT_STRING("vtf.uvs[{}] = mul(texMtxs[{}], pos).xy;"), nextTCG++, nextMtx++); } if (info.m_hasLightmap) { lightmapUv = nextTCG; - fmt::print(out, fmt("vtf.uvs[{}] = mul(texMtxs[{}], pos).xy;"), nextTCG++, nextMtx++); + fmt::print(out, FMT_STRING("vtf.uvs[{}] = mul(texMtxs[{}], pos).xy;"), nextTCG++, nextMtx++); } out << '\n'; @@ -408,7 +408,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { case EFluidType::PhazonFluid: case EFluidType::Four: if (info.m_hasLightmap) { - fmt::print(out, fmt("float4 lightMapTexel = lightMap.Sample(samp, vtf.uvs[{}]);"), lightmapUv); + fmt::print(out, FMT_STRING("float4 lightMapTexel = lightMap.Sample(samp, vtf.uvs[{}]);"), lightmapUv); // 0: Tex4TCG, Tex4, doubleLightmapBlend ? NULL : GX_COLOR1A1 // ZERO, TEX, KONST, doubleLightmapBlend ? ZERO : RAS // Output reg 2 @@ -453,7 +453,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { if (info.m_hasColorTex && !info.m_hasEnvMap && info.m_hasEnvBumpMap) { // Make previous stage indirect, mtx0 - fmt::print(out, fmt( + fmt::print(out, FMT_STRING( "float2 indUvs = (envBumpMap.Sample(samp, vtf.uvs[{}]).ra - float2(0.5, 0.5)) * " "float2(fog.indScale, -fog.indScale);"), envBumpMapUv); @@ -467,11 +467,11 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { // Make previous stage indirect, mtx0 if (info.m_hasColorTex) out << "colorOut += colorTex.Sample(samp, vtf.uvs[2]) * lighting;"; - fmt::print(out, fmt( + fmt::print(out, FMT_STRING( "float2 indUvs = (envBumpMap.Sample(samp, vtf.uvs[{}]).ra - float2(0.5, 0.5)) * " "float2(fog.indScale, -fog.indScale);"), envBumpMapUv); - fmt::print(out, fmt("colorOut = lerp(colorOut, envMap.Sample(samp, indUvs + vtf.uvs[{}]), kColor1);"), envMapUv); + fmt::print(out, FMT_STRING("colorOut = lerp(colorOut, envMap.Sample(samp, indUvs + vtf.uvs[{}]), kColor1);"), envMapUv); } else if (info.m_hasColorTex) { out << "colorOut += colorTex.Sample(samp, vtf.uvs[2]) * lighting;"; } @@ -480,7 +480,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { case EFluidType::PoisonWater: if (info.m_hasLightmap) { - fmt::print(out, fmt("float4 lightMapTexel = lightMap.Sample(samp, vtf.uvs[{}]);"), lightmapUv); + fmt::print(out, FMT_STRING("float4 lightMapTexel = lightMap.Sample(samp, vtf.uvs[{}]);"), lightmapUv); // 0: Tex4TCG, Tex4, doubleLightmapBlend ? NULL : GX_COLOR1A1 // ZERO, TEX, KONST, doubleLightmapBlend ? ZERO : RAS // Output reg 2 @@ -526,7 +526,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { if (info.m_hasColorTex) { if (info.m_hasEnvBumpMap) { // Make previous stage indirect, mtx0 - fmt::print(out, fmt( + fmt::print(out, FMT_STRING( "float2 indUvs = (envBumpMap.Sample(samp, vtf.uvs[{}]).ra - float2(0.5, 0.5)) * " "float2(fog.indScale, -fog.indScale);"), envBumpMapUv); @@ -580,7 +580,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { "float3 lightVec = lights[3].pos.xyz - vtf.mvPos.xyz;" "float lx = dot(vtf.mvTangent.xyz, lightVec);" "float ly = dot(vtf.mvBinorm.xyz, lightVec);"; - fmt::print(out, fmt( + fmt::print(out, FMT_STRING( "float4 emboss1 = bumpMap.Sample(samp, vtf.uvs[{}]) + float4(0.5);" "float4 emboss2 = bumpMap.Sample(samp, vtf.uvs[{}] + float2(lx, ly));"), bumpMapUv, bumpMapUv); @@ -628,7 +628,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { // 3: bumpMapTCG, bumpMap, NULL // ZERO, TEX, PREV, ZERO // Output reg prev, scale 2 - fmt::print(out, fmt("float4 emboss1 = bumpMap.Sample(samp, vtf.uvs[{}]) + float4(0.5);"), bumpMapUv); + fmt::print(out, FMT_STRING("float4 emboss1 = bumpMap.Sample(samp, vtf.uvs[{}]) + float4(0.5);"), bumpMapUv); out << "colorOut *= emboss1 * float4(2.0);"; } @@ -648,13 +648,13 @@ static void _BuildAdditionalTCGs(std::stringstream& out, const SFluidPlaneShader out << "#define ADDITIONAL_TCGS "; if (info.m_hasBumpMap) - fmt::print(out, fmt("vtf.uvs[{}] = mul(texMtxs[0], pos).xy;"), nextTCG++); + fmt::print(out, FMT_STRING("vtf.uvs[{}] = mul(texMtxs[0], pos).xy;"), nextTCG++); if (info.m_hasEnvBumpMap) - fmt::print(out, fmt("vtf.uvs[{}] = mul(texMtxs[3], float4(normalIn.xyz, 1.0)).xy;"), nextTCG++); + fmt::print(out, FMT_STRING("vtf.uvs[{}] = mul(texMtxs[3], float4(normalIn.xyz, 1.0)).xy;"), nextTCG++); if (info.m_hasEnvMap) - fmt::print(out, fmt("vtf.uvs[{}] = mul(texMtxs[{}], pos).xy;"), nextTCG++, nextMtx++); + fmt::print(out, FMT_STRING("vtf.uvs[{}] = mul(texMtxs[{}], pos).xy;"), nextTCG++, nextMtx++); if (info.m_hasLightmap) - fmt::print(out, fmt("vtf.uvs[{}] = mul(texMtxs[{}], pos).xy;"), nextTCG, nextMtx); + fmt::print(out, FMT_STRING("vtf.uvs[{}] = mul(texMtxs[{}], pos).xy;"), nextTCG, nextMtx); out << '\n'; } @@ -727,11 +727,11 @@ static std::string _BuildFS(const SFluidPlaneDoorShaderInfo& info) { out << "#define TEXTURE_DECLS "; if (info.m_hasPatternTex1) - fmt::print(out, fmt("Texture2D patternTex1 : register(t{});"), nextTex++); + fmt::print(out, FMT_STRING("Texture2D patternTex1 : register(t{});"), nextTex++); if (info.m_hasPatternTex2) - fmt::print(out, fmt("Texture2D patternTex2 : register(t{});"), nextTex++); + fmt::print(out, FMT_STRING("Texture2D patternTex2 : register(t{});"), nextTex++); if (info.m_hasColorTex) - fmt::print(out, fmt("Texture2D colorTex : register(t{});"), nextTex++); + fmt::print(out, FMT_STRING("Texture2D colorTex : register(t{});"), nextTex++); out << '\n'; // Tex0 * kColor0 * Tex1 + Tex2 diff --git a/Shaders/shader_CFluidPlaneShaderMetal.cpp b/Shaders/shader_CFluidPlaneShaderMetal.cpp index cc988a511..f8bda5069 100644 --- a/Shaders/shader_CFluidPlaneShaderMetal.cpp +++ b/Shaders/shader_CFluidPlaneShaderMetal.cpp @@ -366,19 +366,19 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { out << "#define TEXTURE_PARAMS "; if (info.m_hasPatternTex1) - fmt::print(out, fmt(",texture2d patternTex1 [[ texture({}) ]]"), nextTex++); + fmt::print(out, FMT_STRING(",texture2d patternTex1 [[ texture({}) ]]"), nextTex++); if (info.m_hasPatternTex2) - fmt::print(out, fmt(",texture2d patternTex2 [[ texture({}) ]]"), nextTex++); + fmt::print(out, FMT_STRING(",texture2d patternTex2 [[ texture({}) ]]"), nextTex++); if (info.m_hasColorTex) - fmt::print(out, fmt(",texture2d colorTex [[ texture({}) ]]"), nextTex++); + fmt::print(out, FMT_STRING(",texture2d colorTex [[ texture({}) ]]"), nextTex++); if (info.m_hasBumpMap) - fmt::print(out, fmt(",texture2d bumpMap [[ texture({}) ]]"), nextTex++); + fmt::print(out, FMT_STRING(",texture2d bumpMap [[ texture({}) ]]"), nextTex++); if (info.m_hasEnvMap) - fmt::print(out, fmt(",texture2d envMap [[ texture({}) ]]"), nextTex++); + fmt::print(out, FMT_STRING(",texture2d envMap [[ texture({}) ]]"), nextTex++); if (info.m_hasEnvBumpMap) - fmt::print(out, fmt(",exture2d envBumpMap [[ texture({}) ]]"), nextTex++); + fmt::print(out, FMT_STRING(",exture2d envBumpMap [[ texture({}) ]]"), nextTex++); if (info.m_hasLightmap) - fmt::print(out, fmt(",texture2d lightMap [[ texture({}) ]]"), nextTex++); + fmt::print(out, FMT_STRING(",texture2d lightMap [[ texture({}) ]]"), nextTex++); out << '\n'; if (info.m_hasBumpMap) { @@ -400,7 +400,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { case EFluidType::PhazonFluid: case EFluidType::Four: if (info.m_hasLightmap) { - fmt::print(out, fmt("float4 lightMapTexel = lightMap.sample(samp, vtf.uv{});"), lightmapUv); + fmt::print(out, FMT_STRING("float4 lightMapTexel = lightMap.sample(samp, vtf.uv{});"), lightmapUv); // 0: Tex4TCG, Tex4, doubleLightmapBlend ? NULL : GX_COLOR1A1 // ZERO, TEX, KONST, doubleLightmapBlend ? ZERO : RAS // Output reg 2 @@ -445,7 +445,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { if (info.m_hasColorTex && !info.m_hasEnvMap && info.m_hasEnvBumpMap) { // Make previous stage indirect, mtx0 - fmt::print(out, fmt( + fmt::print(out, FMT_STRING( "float2 indUvs = (envBumpMap.sample(samp, vtf.uv{}).ra - float2(0.5, 0.5)) * " "float2(lu.fog.indScale, -lu.fog.indScale);"), envBumpMapUv); @@ -459,11 +459,11 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { // Make previous stage indirect, mtx0 if (info.m_hasColorTex) out << "colorOut += colorTex.sample(samp, vtf.uv2) * lighting;"; - fmt::print(out, fmt( + fmt::print(out, FMT_STRING( "float2 indUvs = (envBumpMap.sample(samp, vtf.uv{}).ra - float2(0.5, 0.5)) * " "float2(lu.fog.indScale, -lu.fog.indScale);"), envBumpMapUv); - fmt::print(out, fmt( + fmt::print(out, FMT_STRING( "colorOut = mix(colorOut, envMap.sample(samp, indUvs + vtf.uv{}), lu.kColor1);"), envMapUv); } else if (info.m_hasColorTex) { out << "colorOut += colorTex.sample(samp, vtf.uv2) * lighting;"; @@ -473,7 +473,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { case EFluidType::PoisonWater: if (info.m_hasLightmap) { - fmt::print(out, fmt("float4 lightMapTexel = lightMap.sample(samp, vtf.uv{});"), lightmapUv); + fmt::print(out, FMT_STRING("float4 lightMapTexel = lightMap.sample(samp, vtf.uv{});"), lightmapUv); // 0: Tex4TCG, Tex4, doubleLightmapBlend ? NULL : GX_COLOR1A1 // ZERO, TEX, KONST, doubleLightmapBlend ? ZERO : RAS // Output reg 2 @@ -519,7 +519,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { if (info.m_hasColorTex) { if (info.m_hasEnvBumpMap) { // Make previous stage indirect, mtx0 - fmt::print(out, fmt( + fmt::print(out, FMT_STRING( "float2 indUvs = (envBumpMap.sample(samp, vtf.uv{}).ra - float2(0.5, 0.5)) * " "float2(lu.fog.indScale, -lu.fog.indScale);"), envBumpMapUv); @@ -573,7 +573,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { "float3 lightVec = lu.lights[3].pos.xyz - vtf.mvPos.xyz;" "float lx = dot(vtf.mvTangent.xyz, lightVec);" "float ly = dot(vtf.mvBinorm.xyz, lightVec);"; - fmt::print(out, fmt( + fmt::print(out, FMT_STRING( "float4 emboss1 = bumpMap.sample(samp, vtf.uv{}) + float4(0.5);" "float4 emboss2 = bumpMap.sample(samp, vtf.uv{} + float2(lx, ly));"), bumpMapUv, bumpMapUv); @@ -621,7 +621,7 @@ static std::string _BuildFS(const SFluidPlaneShaderInfo& info) { // 3: bumpMapTCG, bumpMap, NULL // ZERO, TEX, PREV, ZERO // Output reg prev, scale 2 - fmt::print(out, fmt("float4 emboss1 = bumpMap.sample(samp, vtf.uv{}) + float4(0.5);"), bumpMapUv); + fmt::print(out, FMT_STRING("float4 emboss1 = bumpMap.sample(samp, vtf.uv{}) + float4(0.5);"), bumpMapUv); out << "colorOut *= emboss1 * float4(2.0);"; } @@ -641,13 +641,13 @@ static void _BuildAdditionalTCGs(std::stringstream& out, const SFluidPlaneShader out << "#define ADDITIONAL_TCGS "; if (info.m_hasBumpMap) - fmt::print(out, fmt("vtf.uv{} = (fu.texMtxs[0] * pos).xy;"), nextTCG++); + fmt::print(out, FMT_STRING("vtf.uv{} = (fu.texMtxs[0] * pos).xy;"), nextTCG++); if (info.m_hasEnvBumpMap) - fmt::print(out, fmt("vtf.uv{} = (fu.texMtxs[3] * float4(normalIn.xyz, 1.0)).xy;"), nextTCG++); + fmt::print(out, FMT_STRING("vtf.uv{} = (fu.texMtxs[3] * float4(normalIn.xyz, 1.0)).xy;"), nextTCG++); if (info.m_hasEnvMap) - fmt::print(out, fmt("vtf.uv{} = (fu.texMtxs[{}] * pos).xy;"), nextTCG++, nextMtx++); + fmt::print(out, FMT_STRING("vtf.uv{} = (fu.texMtxs[{}] * pos).xy;"), nextTCG++, nextMtx++); if (info.m_hasLightmap) - fmt::print(out, fmt("vtf.uv{} = (fu.texMtxs[{}] * pos).xy;"), nextTCG++, nextMtx++); + fmt::print(out, FMT_STRING("vtf.uv{} = (fu.texMtxs[{}] * pos).xy;"), nextTCG++, nextMtx++); out << '\n'; } @@ -718,11 +718,11 @@ static std::string _BuildFS(const SFluidPlaneDoorShaderInfo& info) { out << "#define TEXTURE_PARAMS "; if (info.m_hasPatternTex1) - fmt::print(out, fmt(",texture2d patternTex1 [[ texture({}) ]]"), nextTex++); + fmt::print(out, FMT_STRING(",texture2d patternTex1 [[ texture({}) ]]"), nextTex++); if (info.m_hasPatternTex2) - fmt::print(out, fmt(",texture2d patternTex2 [[ texture({}) ]]"), nextTex++); + fmt::print(out, FMT_STRING(",texture2d patternTex2 [[ texture({}) ]]"), nextTex++); if (info.m_hasColorTex) - fmt::print(out, fmt(",texture2d colorTex [[ texture({}) ]]"), nextTex++); + fmt::print(out, FMT_STRING(",texture2d colorTex [[ texture({}) ]]"), nextTex++); out << '\n'; // Tex0 * kColor0 * Tex1 + Tex2 diff --git a/amuse b/amuse index 40efdcc38..5112228ab 160000 --- a/amuse +++ b/amuse @@ -1 +1 @@ -Subproject commit 40efdcc38cc59dbb66a8c12d96583f2133d534f7 +Subproject commit 5112228abd4d2a468f36ee4289a789fb2c2a921c diff --git a/assetnameparser/main.cpp b/assetnameparser/main.cpp index 7f4eaa0c1..839488da3 100644 --- a/assetnameparser/main.cpp +++ b/assetnameparser/main.cpp @@ -180,7 +180,7 @@ int main(int argc, const char* argv[]) logvisor::RegisterStandardExceptions(); logvisor::RegisterConsoleLogger(); if (argc < 3) { - Log.report(logvisor::Error, fmt(_SYS_STR("Usage: {} ")), argv[0]); + Log.report(logvisor::Error, FMT_STRING(_SYS_STR("Usage: {} ")), argv[0]); return 1; } @@ -193,13 +193,13 @@ int main(int argc, const char* argv[]) if (!doc.LoadFile(docF)) { const tinyxml2::XMLElement* elm = doc.RootElement(); if (strcmp(elm->Name(), "AssetNameMap")) { - Log.report(logvisor::Fatal, fmt(_SYS_STR("Invalid database supplied"))); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Invalid database supplied"))); return 1; } elm = elm->FirstChildElement("AssetNameMap"); if (elm == nullptr) { - Log.report(logvisor::Fatal, fmt(_SYS_STR("Malformed AssetName database"))); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Malformed AssetName database"))); return 1; } @@ -210,7 +210,7 @@ int main(int argc, const char* argv[]) const tinyxml2::XMLElement* valueElm = elm->FirstChildElement("Value"); if (!keyElm || !valueElm) { - Log.report(logvisor::Fatal, fmt(_SYS_STR("Malformed Asset entry, [Key,Value] required"))); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Malformed Asset entry, [Key,Value] required"))); return 0; } @@ -219,7 +219,7 @@ int main(int argc, const char* argv[]) const tinyxml2::XMLElement* typeElm = valueElm->FirstChildElement("Type"); if (!nameElm || !dirElm || !typeElm) { - Log.report(logvisor::Fatal, fmt(_SYS_STR("Malformed Value entry, [Name,Directory,Type] required"))); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Malformed Value entry, [Name,Directory,Type] required"))); return 0; } assets.emplace_back(); @@ -233,7 +233,7 @@ int main(int argc, const char* argv[]) FILE* f = Fopen(outPath.c_str(), _SYS_STR("wb")); if (!f) { - Log.report(logvisor::Fatal, fmt(_SYS_STR("Unable to open destination"))); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("Unable to open destination"))); return 0; } @@ -261,6 +261,6 @@ int main(int argc, const char* argv[]) if (docF) fclose(docF); - Log.report(logvisor::Fatal, fmt(_SYS_STR("failed to load"))); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("failed to load"))); return 1; } diff --git a/hecl b/hecl index 8f31e8bb7..f64ed44fe 160000 --- a/hecl +++ b/hecl @@ -1 +1 @@ -Subproject commit 8f31e8bb7d5f3d0fde26e17824456d1b88fb084d +Subproject commit f64ed44fe8164b06ed5bef6344d9f743e2c5d638 diff --git a/nod b/nod index dffcac50c..2783337c3 160000 --- a/nod +++ b/nod @@ -1 +1 @@ -Subproject commit dffcac50c5fe3eb67fdee222553fc508cd241579 +Subproject commit 2783337c36bacdf832f78182340e4aa6063dece9 diff --git a/specter b/specter index a2c154db8..fc0d79ace 160000 --- a/specter +++ b/specter @@ -1 +1 @@ -Subproject commit a2c154db8fde276206ae87628d6baa40f1e399a9 +Subproject commit fc0d79ace7063f24efaeaf8153753855eb3e2b95 diff --git a/visigen/MainMac.mm b/visigen/MainMac.mm index ddd0cb276..aba699c1a 100644 --- a/visigen/MainMac.mm +++ b/visigen/MainMac.mm @@ -113,7 +113,7 @@ int main(int argc, const char** argv) { if (argc > 1 && !strcmp(argv[1], "--dlpackage")) { - fmt::print(fmt("{}\n"), URDE_DLPACKAGE); + fmt::print(FMT_STRING("{}\n"), URDE_DLPACKAGE); return 100; } diff --git a/visigen/MainWin.cpp b/visigen/MainWin.cpp index fe347a85c..34ce7cd5a 100644 --- a/visigen/MainWin.cpp +++ b/visigen/MainWin.cpp @@ -41,7 +41,7 @@ static LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l int wmain(int argc, const hecl::SystemChar** argv) { if (argc > 1 && !wcscmp(argv[1], L"--dlpackage")) { - fmt::print(fmt("{}\n"), URDE_DLPACKAGE); + fmt::print(FMT_STRING("{}\n"), URDE_DLPACKAGE); return 100; } @@ -125,7 +125,7 @@ int wmain(int argc, const hecl::SystemChar** argv) { continue; case WM_USER + 1: { /* Update window title from client thread */ - std::wstring title = fmt::format(fmt(L"VISIGen [{:g}%]"), s_Percent * 100.f); + std::wstring title = fmt::format(FMT_STRING(L"VISIGen [{:g}%]"), s_Percent * 100.f); SetWindowTextW(window, title.c_str()); continue; } diff --git a/visigen/MainXlib.cpp b/visigen/MainXlib.cpp index 333d3920d..90a3a04f4 100644 --- a/visigen/MainXlib.cpp +++ b/visigen/MainXlib.cpp @@ -64,7 +64,7 @@ static Window windowId; static void UpdatePercent(float percent) { XLockDisplay(xDisp); - std::string title = fmt::format(fmt("VISIGen [{:g}%]"), double(percent * 100.f)); + std::string title = fmt::format(FMT_STRING("VISIGen [{:g}%]"), double(percent * 100.f)); XChangeProperty(xDisp, windowId, XA_WM_NAME, XA_STRING, 8, PropModeReplace, reinterpret_cast(title.c_str()), int(title.size())); XUnlockDisplay(xDisp); @@ -75,7 +75,7 @@ static void _sigint(int) {} int main(int argc, const char** argv) { if (argc > 1 && !strcmp(argv[1], "--dlpackage")) { - fmt::print(fmt("{}\n"), URDE_DLPACKAGE); + fmt::print(FMT_STRING("{}\n"), URDE_DLPACKAGE); return 100; } @@ -88,14 +88,14 @@ int main(int argc, const char** argv) { VISIRenderer renderer(argc, argv); if (!XInitThreads()) { - Log.report(logvisor::Error, fmt("X doesn't support multithreading")); + Log.report(logvisor::Error, FMT_STRING("X doesn't support multithreading")); return 1; } /* Open Xlib Display */ xDisp = XOpenDisplay(nullptr); if (!xDisp) { - Log.report(logvisor::Error, fmt("Can't open X display")); + Log.report(logvisor::Error, FMT_STRING("Can't open X display")); return 1; } @@ -108,7 +108,7 @@ int main(int argc, const char** argv) { int numFBConfigs = 0; fbConfigs = glXGetFBConfigs(xDisp, xDefaultScreen, &numFBConfigs); if (!fbConfigs || numFBConfigs == 0) { - Log.report(logvisor::Error, fmt("glXGetFBConfigs failed")); + Log.report(logvisor::Error, FMT_STRING("glXGetFBConfigs failed")); return 1; } @@ -135,7 +135,7 @@ int main(int argc, const char** argv) { XFree(fbConfigs); if (!selFBConfig) { - Log.report(logvisor::Error, fmt("unable to find suitable pixel format")); + Log.report(logvisor::Error, FMT_STRING("unable to find suitable pixel format")); return 1; } @@ -179,7 +179,7 @@ int main(int argc, const char** argv) { glXCreateContextAttribsARB = reinterpret_cast( glXGetProcAddressARB(reinterpret_cast("glXCreateContextAttribsARB"))); if (!glXCreateContextAttribsARB) { - Log.report(logvisor::Error, fmt("unable to resolve glXCreateContextAttribsARB")); + Log.report(logvisor::Error, FMT_STRING("unable to resolve glXCreateContextAttribsARB")); return 1; } } @@ -194,12 +194,12 @@ int main(int argc, const char** argv) { } XSetErrorHandler(oldHandler); if (!glxCtx) { - Log.report(logvisor::Fatal, fmt("unable to make new GLX context")); + Log.report(logvisor::Fatal, FMT_STRING("unable to make new GLX context")); return 1; } GLXWindow glxWindow = glXCreateWindow(xDisp, selFBConfig, windowId, nullptr); if (!glxWindow) { - Log.report(logvisor::Fatal, fmt("unable to make new GLX window")); + Log.report(logvisor::Fatal, FMT_STRING("unable to make new GLX window")); return 1; } @@ -251,7 +251,7 @@ int main(int argc, const char** argv) { XLockDisplay(xDisp); if (!glXMakeContextCurrent(xDisp, glxWindow, glxWindow, glxCtx)) - Log.report(logvisor::Fatal, fmt("unable to make GLX context current")); + Log.report(logvisor::Fatal, FMT_STRING("unable to make GLX context current")); XUnlockDisplay(xDisp); UpdatePercent(0); diff --git a/visigen/VISIBuilder.cpp b/visigen/VISIBuilder.cpp index 3aa472f87..b9a90effe 100644 --- a/visigen/VISIBuilder.cpp +++ b/visigen/VISIBuilder.cpp @@ -18,11 +18,11 @@ static std::unique_ptr RGBABuf(new VISIRenderer::RGBA8[25 const VISIBuilder::Leaf& VISIBuilder::PVSRenderCache::GetLeaf(const zeus::CVector3f& vec) { auto search = m_cache.find(vec); if (search != m_cache.cend()) { - // Log.report(logvisor::Info, fmt("Cache hit")); + // Log.report(logvisor::Info, FMT_STRING("Cache hit")); return *search->second; } - // Log.report(logvisor::Info, fmt("Rendering")); + // Log.report(logvisor::Info, FMT_STRING("Rendering")); bool needsTransparent = false; m_renderer.RenderPVSOpaque(RGBABuf.get(), vec, needsTransparent); std::unique_ptr leafOut = std::make_unique(); @@ -107,19 +107,19 @@ void VISIBuilder::Node::buildChildren(int level, int divisions, const zeus::CAAB if (flags & 0x4 && childNodes[0] == childNodes[4] && (!(flags & 0x1) || childNodes[1] == childNodes[5]) && (!(flags & 0x2) || childNodes[2] == childNodes[6]) && (!(flags & 0x3) || childNodes[3] == childNodes[7])) { flags &= ~0x4; - // Log.report(logvisor::Info, fmt("Unsub Z")); + // Log.report(logvisor::Info, FMT_STRING("Unsub Z")); continue; } if (flags & 0x2 && childNodes[0] == childNodes[2] && (!(flags & 0x1) || childNodes[1] == childNodes[3]) && (!(flags & 0x4) || childNodes[4] == childNodes[6]) && (!(flags & 0x5) || childNodes[5] == childNodes[7])) { flags &= ~0x2; - // Log.report(logvisor::Info, fmt("Unsub Y")); + // Log.report(logvisor::Info, FMT_STRING("Unsub Y")); continue; } if (flags & 0x1 && childNodes[0] == childNodes[1] && (!(flags & 0x2) || childNodes[2] == childNodes[3]) && (!(flags & 0x4) || childNodes[4] == childNodes[5]) && (!(flags & 0x6) || childNodes[6] == childNodes[7])) { flags &= ~0x1; - // Log.report(logvisor::Info, fmt("Unsub X")); + // Log.report(logvisor::Info, FMT_STRING("Unsub X")); continue; } break; @@ -129,7 +129,7 @@ void VISIBuilder::Node::buildChildren(int level, int divisions, const zeus::CAAB // This is now a leaf node for (int i = 0; i < 8; ++i) leaf |= childNodes[i].leaf; - // Log.report(logvisor::Info, fmt("Leaf Promote")); + // Log.report(logvisor::Info, FMT_STRING("Leaf Promote")); return; } } @@ -258,7 +258,7 @@ std::vector VISIBuilder::build(const zeus::CAABox& fullAabb, size_t mod const std::vector& entities, const std::vector& lights, size_t layer2LightCount, FPercent updatePercent, ProcessType parentPid) { - // Log.report(logvisor::Info, fmt("Started!")); + // Log.report(logvisor::Info, FMT_STRING("Started!")); size_t featureCount = modelCount + entities.size(); renderCache.m_lightMetaBit = featureCount; @@ -322,6 +322,6 @@ std::vector VISIBuilder::build(const zeus::CAABox& fullAabb, size_t mod w.seekAlign32(); - // Log.report(logvisor::Info, fmt("Finished!")); + // Log.report(logvisor::Info, FMT_STRING("Finished!")); return dataOut; } diff --git a/visigen/VISIRenderer.cpp b/visigen/VISIRenderer.cpp index 95cb38262..a95463e27 100644 --- a/visigen/VISIRenderer.cpp +++ b/visigen/VISIRenderer.cpp @@ -59,7 +59,7 @@ bool VISIRenderer::SetupShaders() { glGetShaderiv(m_vtxShader, GL_INFO_LOG_LENGTH, &logLen); char* log = (char*)malloc(logLen); glGetShaderInfoLog(m_vtxShader, logLen, nullptr, log); - Log.report(logvisor::Error, fmt("unable to compile vert source\n{}\n{}\n"), log, VS); + Log.report(logvisor::Error, FMT_STRING("unable to compile vert source\n{}\n{}\n"), log, VS); free(log); return false; } @@ -72,7 +72,7 @@ bool VISIRenderer::SetupShaders() { glGetShaderiv(m_fragShader, GL_INFO_LOG_LENGTH, &logLen); char* log = (char*)malloc(logLen); glGetShaderInfoLog(m_fragShader, logLen, nullptr, log); - Log.report(logvisor::Error, fmt("unable to compile frag source\n{}\n{}\n"), log, FS); + Log.report(logvisor::Error, FMT_STRING("unable to compile frag source\n{}\n{}\n"), log, FS); free(log); return false; } @@ -87,7 +87,7 @@ bool VISIRenderer::SetupShaders() { glGetProgramiv(m_program, GL_INFO_LOG_LENGTH, &logLen); char* log = (char*)malloc(logLen); glGetProgramInfoLog(m_program, logLen, nullptr, log); - Log.report(logvisor::Error, fmt("unable to link shader program\n{}\n"), log); + Log.report(logvisor::Error, FMT_STRING("unable to link shader program\n{}\n"), log); free(log); return false; } @@ -414,13 +414,13 @@ void VISIRenderer::Run(FPercent updatePercent) { CalculateProjMatrix(); if (glewInit() != GLEW_OK) { - Log.report(logvisor::Error, fmt("unable to init glew")); + Log.report(logvisor::Error, FMT_STRING("unable to init glew")); m_return = 1; return; } if (!GLEW_ARB_occlusion_query2) { - Log.report(logvisor::Error, fmt("GL_ARB_occlusion_query2 extension not present")); + Log.report(logvisor::Error, FMT_STRING("GL_ARB_occlusion_query2 extension not present")); m_return = 1; return; } @@ -431,7 +431,7 @@ void VISIRenderer::Run(FPercent updatePercent) { } if (m_argc < 3) { - Log.report(logvisor::Error, fmt("Missing input/output file args")); + Log.report(logvisor::Error, FMT_STRING("Missing input/output file args")); m_return = 1; return; } From ff6c1fdd3da6add4a31000d2d5485a1791086bf4 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 19:23:25 -0400 Subject: [PATCH 067/224] IOStreams: Make constructors for CBitStreamReader and CZipInputStream explicit Same behavior minus the error prone implicit constructions. --- Runtime/IOStreams.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Runtime/IOStreams.hpp b/Runtime/IOStreams.hpp index 8837e61fe..1fe75f4bd 100644 --- a/Runtime/IOStreams.hpp +++ b/Runtime/IOStreams.hpp @@ -43,7 +43,7 @@ class CBitStreamWriter : public athena::io::MemoryWriter { public: static constexpr u32 GetBitCount(u32 maxVal) { return CBitStreamReader::GetBitCount(maxVal); } - CBitStreamWriter(atUint8* data = nullptr, atUint64 length = 0x10) : MemoryWriter(data, length) {} + explicit CBitStreamWriter(atUint8* data = nullptr, atUint64 length = 0x10) : MemoryWriter(data, length) {} void WriteEncoded(u32 val, u32 bitCount); @@ -62,7 +62,7 @@ class CZipInputStream : public CInputStream { z_stream x30_zstrm = {}; public: - CZipInputStream(std::unique_ptr&& strm); + explicit CZipInputStream(std::unique_ptr&& strm); ~CZipInputStream() override; atUint64 readUBytesToBuf(void* buf, atUint64 len) override; void seek(atInt64, athena::SeekOrigin) override {} From fa0dcf5b121c5b4722ab2bac801d6cd337f24145 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 19:32:58 -0400 Subject: [PATCH 068/224] WeaponCommon: Use string_view with get_asset_id_from_name() Internal functions expect a std::string_view, so we can just make the parameter a string_view as well to push the responsibility outwards into the caller. --- Runtime/Weapon/WeaponCommon.cpp | 5 +++-- Runtime/Weapon/WeaponCommon.hpp | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Runtime/Weapon/WeaponCommon.cpp b/Runtime/Weapon/WeaponCommon.cpp index 7c448a2e4..ef6ade659 100644 --- a/Runtime/Weapon/WeaponCommon.cpp +++ b/Runtime/Weapon/WeaponCommon.cpp @@ -134,10 +134,11 @@ void do_sound_event(std::pair& sfxHandle, float& pitch, bool do } } -CAssetId get_asset_id_from_name(const char* name) { +CAssetId get_asset_id_from_name(std::string_view name) { const SObjectTag* tag = g_ResFactory->GetResourceIdByName(name); - if (!tag) + if (!tag) { return {}; + } return tag->id; } diff --git a/Runtime/Weapon/WeaponCommon.hpp b/Runtime/Weapon/WeaponCommon.hpp index 599911708..74c183927 100644 --- a/Runtime/Weapon/WeaponCommon.hpp +++ b/Runtime/Weapon/WeaponCommon.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include "DataSpec/DNACommon/Tweaks/ITweakPlayerGun.hpp" @@ -83,7 +84,7 @@ void get_token_vector(const CAnimData& animData, int animIdx, std::vector& sfxHandle, float& pitch, bool doPitchBend, u32 soundId, float weight, u32 flags, float falloff, float maxDist, float minVol, float maxVol, const zeus::CVector3f& posToCam, const zeus::CVector3f& pos, TAreaId aid, CStateManager& mgr); -CAssetId get_asset_id_from_name(const char* name); +CAssetId get_asset_id_from_name(std::string_view name); CPlayerState::EPlayerSuit get_current_suit(const CStateManager& mgr); CSfxHandle play_sfx(u16 sfx, bool underwater, bool looped, float pan); From 54dededb9b051ce8069df114fd2162c0a4af3433 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 19:36:52 -0400 Subject: [PATCH 069/224] CNewFlameThrower: Make constructor take a std::array by reference Same behavior, but enforces the size requirement instead of accepting any arbitrary const CAssetId* pointer. --- Runtime/Weapon/CAuxWeapon.cpp | 26 ++++++++++++++------------ Runtime/Weapon/CNewFlameThrower.cpp | 6 +++--- Runtime/Weapon/CNewFlameThrower.hpp | 3 ++- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/Runtime/Weapon/CAuxWeapon.cpp b/Runtime/Weapon/CAuxWeapon.cpp index 64722caf8..6764dec90 100644 --- a/Runtime/Weapon/CAuxWeapon.cpp +++ b/Runtime/Weapon/CAuxWeapon.cpp @@ -210,19 +210,21 @@ void CAuxWeapon::CreateFlameThrower(const zeus::CTransform& xf, CStateManager& m if (x6e_flameThrowerId != kInvalidUniqueId) return; - CAssetId resInfo[] = {NWeaponTypes::get_asset_id_from_name("NFTMainFire"), - NWeaponTypes::get_asset_id_from_name("NFTMainSmoke"), - NWeaponTypes::get_asset_id_from_name("NFTSwooshCenter"), - NWeaponTypes::get_asset_id_from_name("NFTSwooshFire"), - NWeaponTypes::get_asset_id_from_name("NFTSecondarySmoke"), - NWeaponTypes::get_asset_id_from_name("NFTSecondaryFire"), - NWeaponTypes::get_asset_id_from_name("NFTSecondarySparks"), - {}}; + const std::array resInfo{ + NWeaponTypes::get_asset_id_from_name("NFTMainFire"), + NWeaponTypes::get_asset_id_from_name("NFTMainSmoke"), + NWeaponTypes::get_asset_id_from_name("NFTSwooshCenter"), + NWeaponTypes::get_asset_id_from_name("NFTSwooshFire"), + NWeaponTypes::get_asset_id_from_name("NFTSecondarySmoke"), + NWeaponTypes::get_asset_id_from_name("NFTSecondaryFire"), + NWeaponTypes::get_asset_id_from_name("NFTSecondarySparks"), + {}, + }; x6e_flameThrowerId = mgr.AllocateUniqueId(); - CNewFlameThrower* ft = new CNewFlameThrower( - x28_combos[3], "Player_FlameThrower", EWeaponType::Plasma, resInfo, xf, EMaterialTypes::Player, - CGunWeapon::GetShotDamageInfo(g_tweakPlayerGun->GetComboShotInfo(3), mgr), x6e_flameThrowerId, kInvalidAreaId, - x6c_playerId, EProjectileAttrib::None); + auto* ft = new CNewFlameThrower(x28_combos[3], "Player_FlameThrower", EWeaponType::Plasma, resInfo, xf, + EMaterialTypes::Player, + CGunWeapon::GetShotDamageInfo(g_tweakPlayerGun->GetComboShotInfo(3), mgr), + x6e_flameThrowerId, kInvalidAreaId, x6c_playerId, EProjectileAttrib::None); mgr.AddObject(ft); ft->Think(dt, mgr); ft->StartFiring(xf, mgr); diff --git a/Runtime/Weapon/CNewFlameThrower.cpp b/Runtime/Weapon/CNewFlameThrower.cpp index f2c86609f..2e8bdaac0 100644 --- a/Runtime/Weapon/CNewFlameThrower.cpp +++ b/Runtime/Weapon/CNewFlameThrower.cpp @@ -8,9 +8,9 @@ namespace urde { CNewFlameThrower::CNewFlameThrower(const TToken& desc, std::string_view name, EWeaponType wType, - const CAssetId resInfo[8], const zeus::CTransform& xf, EMaterialTypes matType, - const CDamageInfo& dInfo, TUniqueId uid, TAreaId aid, TUniqueId owner, - EProjectileAttrib attribs) + const std::array& resInfo, const zeus::CTransform& xf, + EMaterialTypes matType, const CDamageInfo& dInfo, TUniqueId uid, TAreaId aid, + TUniqueId owner, EProjectileAttrib attribs) : CGameProjectile(false, desc, name, wType, xf, matType, dInfo, uid, aid, owner, kInvalidUniqueId, attribs, false, zeus::skOne3f, {}, -1, false) , x304_mainFire(g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), resInfo[0]})) diff --git a/Runtime/Weapon/CNewFlameThrower.hpp b/Runtime/Weapon/CNewFlameThrower.hpp index 953a86615..4c2353f58 100644 --- a/Runtime/Weapon/CNewFlameThrower.hpp +++ b/Runtime/Weapon/CNewFlameThrower.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -53,7 +54,7 @@ public: // NFTSecondarySparks // CNewFlameThrower(const TToken& desc, std::string_view name, EWeaponType wType, - const CAssetId resInfo[8], const zeus::CTransform& xf, EMaterialTypes matType, + const std::array& resInfo, const zeus::CTransform& xf, EMaterialTypes matType, const CDamageInfo& dInfo, TUniqueId uid, TAreaId aid, TUniqueId owner, EProjectileAttrib attribs); void StartFiring(const zeus::CTransform& xf, CStateManager& mgr); bool CanRenderAuxEffects() const { return x37c_24_renderAuxEffects; } From e72507b20cc694f2efaee56ee3b271828079ba6e Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 19:50:47 -0400 Subject: [PATCH 070/224] CWorldTransManager: Make use of std::array where applicable Provides stronger typing, and eliminates any potential implicit array to pointer decay. --- Runtime/World/CWorldTransManager.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Runtime/World/CWorldTransManager.hpp b/Runtime/World/CWorldTransManager.hpp index 92f09bed9..02567d3c8 100644 --- a/Runtime/World/CWorldTransManager.hpp +++ b/Runtime/World/CWorldTransManager.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -31,7 +32,7 @@ public: CModelData x1c_samusModelData; CModelData x68_beamModelData; CModelData xb4_platformModelData; - CModelData x100_bgModelData[3]; + std::array x100_bgModelData; TLockedToken x14c_beamModel; TLockedToken x158_suitModel; TLockedToken x164_suitSkin; From 58fdb64ab5552352ab60ab71399e2671899dee6d Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 19:53:27 -0400 Subject: [PATCH 071/224] CWorldTransManager: Initialize all members on construction Provides a deterministic initial state upon construction, making debugging easier. --- Runtime/World/CWorldTransManager.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Runtime/World/CWorldTransManager.hpp b/Runtime/World/CWorldTransManager.hpp index 02567d3c8..5e4fe37e4 100644 --- a/Runtime/World/CWorldTransManager.hpp +++ b/Runtime/World/CWorldTransManager.hpp @@ -58,18 +58,18 @@ private: std::unique_ptr x8_textData; TLockedToken xc_strTable; u8 x14_ = 0; - float x18_bgOffset; - float x1c_bgHeight; + float x18_bgOffset = 0.0f; + float x1c_bgHeight = 0.0f; CRandom16 x20_random = CRandom16(99); u16 x24_sfx = 1189; CSfxHandle x28_sfxHandle; u8 x2c_volume = 127; u8 x2d_panning = 64; ETransType x30_type = ETransType::Disabled; - float x34_stopTime; + float x34_stopTime = 0.0f; float x38_textStartTime = 0.f; - float x3c_sfxInterval; - bool x40_strIdx; + float x3c_sfxInterval = 0.0f; + bool x40_strIdx = false; bool x44_24_transFinished : 1; bool x44_25_stopSoon : 1; bool x44_26_goingUp : 1; From 76e226f83121d2610f6d5364270c470e6828e808 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 19:55:23 -0400 Subject: [PATCH 072/224] CWorldTransManager: Convert one missed array over to std::array --- Runtime/World/CWorldTransManager.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/World/CWorldTransManager.hpp b/Runtime/World/CWorldTransManager.hpp index 5e4fe37e4..105d23ce8 100644 --- a/Runtime/World/CWorldTransManager.hpp +++ b/Runtime/World/CWorldTransManager.hpp @@ -81,7 +81,7 @@ private: CWideScreenFilter m_widescreen{EFilterType::Blend}; CCameraBlurFilter m_camblur; - boo::ObjToken m_reflectionCube[2]; + std::array, 2> m_reflectionCube; static int GetSuitCharIdx(); void DrawFirstPass(CActorLights* lights); From 9d6b9142bb5c4a2c2f1170b02b78f1a7d3ef78ac Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 20:20:45 -0400 Subject: [PATCH 073/224] CParticleSwoosh: Make use of std::array where applicable Same behavior, no implicit array to pointer decay. --- Runtime/Graphics/Shaders/CParticleSwooshShaders.cpp | 2 +- Runtime/Particle/CParticleSwoosh.cpp | 6 +++--- Runtime/Particle/CParticleSwoosh.hpp | 3 ++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Runtime/Graphics/Shaders/CParticleSwooshShaders.cpp b/Runtime/Graphics/Shaders/CParticleSwooshShaders.cpp index 02e56af04..8d83479e6 100644 --- a/Runtime/Graphics/Shaders/CParticleSwooshShaders.cpp +++ b/Runtime/Graphics/Shaders/CParticleSwooshShaders.cpp @@ -96,7 +96,7 @@ void CParticleSwooshShaders::BuildShaderDataBinding(boo::IGraphicsDataFactory::C }; const std::array, 1> uniforms{gen.m_uniformBuf.get()}; - for (size_t i = 0; i < std::size(gen.m_dataBind); ++i) { + for (size_t i = 0; i < gen.m_dataBind.size(); ++i) { gen.m_dataBind[i] = ctx.newShaderDataBinding((*pipeline)[i], gen.m_vertBuf.get(), nullptr, nullptr, uniforms.size(), uniforms.data(), nullptr, texr ? 1 : 0, textures.data(), nullptr, nullptr); diff --git a/Runtime/Particle/CParticleSwoosh.cpp b/Runtime/Particle/CParticleSwoosh.cpp index 2017a328d..00501a7bf 100644 --- a/Runtime/Particle/CParticleSwoosh.cpp +++ b/Runtime/Particle/CParticleSwoosh.cpp @@ -586,9 +586,9 @@ void CParticleSwoosh::Render3SidedSolidNoSplineNoGaps() { if (x15c_swooshes.size() < 2) return; - zeus::CVector3f p0[2]; - zeus::CVector3f p1[2]; - zeus::CVector3f p2[2]; + std::array p0; + std::array p1; + std::array p2; int curIdx = x158_curParticle; bool lastActive = false; diff --git a/Runtime/Particle/CParticleSwoosh.hpp b/Runtime/Particle/CParticleSwoosh.hpp index e913e1ec8..626e976a5 100644 --- a/Runtime/Particle/CParticleSwoosh.hpp +++ b/Runtime/Particle/CParticleSwoosh.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -102,7 +103,7 @@ class CParticleSwoosh : public CParticleGen { float x208_maxRadius = 0.f; zeus::CColor x20c_moduColor = zeus::skWhite; - boo::ObjToken m_dataBind[2]; + std::array, 2> m_dataBind; boo::ObjToken m_vertBuf; boo::ObjToken m_uniformBuf; std::unique_ptr m_lineRenderer; From 7d42b2d76343cc3ab0652451f4230b70bc599900 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 20:23:38 -0400 Subject: [PATCH 074/224] CParticleGlobals: Initialize all data members Provides a deterministic initial state. --- Runtime/Particle/CParticleGlobals.hpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Runtime/Particle/CParticleGlobals.hpp b/Runtime/Particle/CParticleGlobals.hpp index ac55d5996..3a2ae8e44 100644 --- a/Runtime/Particle/CParticleGlobals.hpp +++ b/Runtime/Particle/CParticleGlobals.hpp @@ -13,8 +13,9 @@ namespace urde { class CElementGen; class CParticleGlobals { - CParticleGlobals()=default; + CParticleGlobals() = default; static std::unique_ptr g_ParticleGlobals; + public: int m_EmitterTime = 0; float m_EmitterTimeReal = 0.f; @@ -48,7 +49,7 @@ public: CElementGen* x4_system; }; - SParticleSystem* m_currentParticleSystem; + SParticleSystem* m_currentParticleSystem = nullptr; static CParticleGlobals* instance() { if (!g_ParticleGlobals) From d6f2e27d8a161c5014be10d13859b234ff290971 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 20:29:36 -0400 Subject: [PATCH 075/224] CParticleGlobals: Make use of std::array where applicable --- Runtime/Particle/CParticleGlobals.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Runtime/Particle/CParticleGlobals.hpp b/Runtime/Particle/CParticleGlobals.hpp index 3a2ae8e44..12b89d65b 100644 --- a/Runtime/Particle/CParticleGlobals.hpp +++ b/Runtime/Particle/CParticleGlobals.hpp @@ -60,22 +60,22 @@ public: }; struct SParticleInstanceTex { - zeus::CVector4f pos[4]; + std::array pos; zeus::CColor color; - zeus::CVector2f uvs[4]; + std::array uvs; }; extern std::vector g_instTexData; struct SParticleInstanceIndTex { - zeus::CVector4f pos[4]; + std::array pos; zeus::CColor color; - zeus::CVector4f texrTindUVs[4]; + std::array texrTindUVs; zeus::CVector4f sceneUVs; }; extern std::vector g_instIndTexData; struct SParticleInstanceNoTex { - zeus::CVector4f pos[4]; + std::array pos; zeus::CColor color; }; extern std::vector g_instNoTexData; From 1b42bda711be3c826dd8b5d68353d41bfb2f668d Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 20:33:00 -0400 Subject: [PATCH 076/224] CParticleDataFactory: Make operator bool() instances explicit Gets rid of implicit error-prone conversions to bool --- Runtime/Particle/CParticleDataFactory.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Runtime/Particle/CParticleDataFactory.hpp b/Runtime/Particle/CParticleDataFactory.hpp index 6b37cc4b2..7cf3527aa 100644 --- a/Runtime/Particle/CParticleDataFactory.hpp +++ b/Runtime/Particle/CParticleDataFactory.hpp @@ -30,7 +30,7 @@ struct SParticleModel { CModel* m_model = nullptr; SParticleModel() = default; SParticleModel(CToken&& tok, bool found) : m_token(std::move(tok)), m_found(found) {} - operator bool() const { return m_found; } + explicit operator bool() const { return m_found; } }; struct SChildGeneratorDesc { @@ -39,7 +39,7 @@ struct SChildGeneratorDesc { CGenDescription* m_gen = nullptr; SChildGeneratorDesc() = default; SChildGeneratorDesc(CToken&& tok, bool found) : m_token(std::move(tok)), m_found(found) {} - operator bool() const { return m_found; } + explicit operator bool() const { return m_found; } }; struct SSwooshGeneratorDesc { @@ -48,7 +48,7 @@ struct SSwooshGeneratorDesc { CSwooshDescription* m_swoosh = nullptr; SSwooshGeneratorDesc() = default; SSwooshGeneratorDesc(CToken&& tok, bool found) : m_token(std::move(tok)), m_found(found) {} - operator bool() const { return m_found; } + explicit operator bool() const { return m_found; } }; struct SElectricGeneratorDesc { @@ -57,7 +57,7 @@ struct SElectricGeneratorDesc { CElectricDescription* m_electric = nullptr; SElectricGeneratorDesc() = default; SElectricGeneratorDesc(CToken&& tok, bool found) : m_token(std::move(tok)), m_found(found) {} - operator bool() const { return m_found; } + explicit operator bool() const { return m_found; } }; class CParticleDataFactory { From fef6711ce827e50fa54f189a10f964852740912a Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 20:41:49 -0400 Subject: [PATCH 077/224] CMorphBall: Make use of constexpr on file-scope arrays Same behavior, but allows elision of runtime initializers. --- Runtime/World/CMorphBall.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Runtime/World/CMorphBall.cpp b/Runtime/World/CMorphBall.cpp index d00d29429..256b70c96 100644 --- a/Runtime/World/CMorphBall.cpp +++ b/Runtime/World/CMorphBall.cpp @@ -204,7 +204,7 @@ constexpr std::array BallSwooshColorsJaggy{{ }}; } // Anonymous namespace -const std::array CMorphBall::BallGlowColors{{ +constexpr std::array CMorphBall::BallGlowColors{{ {0xff, 0xff, 0xff}, {0xff, 0xff, 0xff}, {0xff, 0xff, 0xff}, @@ -216,7 +216,7 @@ const std::array CMorphBall::BallGlowColors{{ {0xff, 0xff, 0xff}, }}; -const std::array CMorphBall::BallTransFlashColors{{ +constexpr std::array CMorphBall::BallTransFlashColors{{ {0xc2, 0x7e, 0x10}, {0x66, 0xc4, 0xff}, {0x60, 0xff, 0x90}, @@ -228,7 +228,7 @@ const std::array CMorphBall::BallTransFlashColors{{ {0xfb, 0x98, 0x21}, }}; -const std::array CMorphBall::BallAuxGlowColors{{ +constexpr std::array CMorphBall::BallAuxGlowColors{{ {0xc2, 0x7e, 0x10}, {0x66, 0xc4, 0xff}, {0x6c, 0xff, 0x61}, From 1fff5401024a3437cd5d56d4e240d80021044c42 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sat, 11 Apr 2020 20:49:56 -0400 Subject: [PATCH 078/224] CAnimPlaybackParms: Make class constexpr constructible Allows for removal of some trivial runtime initializers. --- Runtime/Character/CAnimPlaybackParms.hpp | 33 ++++++++++++------------ Runtime/MP1/CSamusDoll.cpp | 4 +-- Runtime/MP1/CSamusFaceReflection.cpp | 2 +- Runtime/Weapon/CGrappleArm.cpp | 12 ++++----- Runtime/World/CMorphBall.cpp | 8 +++--- Runtime/World/CPlayer.cpp | 2 +- 6 files changed, 31 insertions(+), 30 deletions(-) diff --git a/Runtime/Character/CAnimPlaybackParms.hpp b/Runtime/Character/CAnimPlaybackParms.hpp index 988e55242..0515185d1 100644 --- a/Runtime/Character/CAnimPlaybackParms.hpp +++ b/Runtime/Character/CAnimPlaybackParms.hpp @@ -20,28 +20,29 @@ class CAnimPlaybackParms { const zeus::CVector3f* x24_objectScale = nullptr; public: - CAnimPlaybackParms() = default; - CAnimPlaybackParms(s32 animA, s32 animB, float blendWeight, bool animating) + constexpr CAnimPlaybackParms() = default; + constexpr CAnimPlaybackParms(s32 animA, s32 animB, float blendWeight, bool animating) : x0_animA(animA), x4_animB(animB), x8_blendWeight(blendWeight), xc_animating(animating) {} - CAnimPlaybackParms(s32 anim, const zeus::CQuaternion* deltaOrient, const zeus::CVector3f* targetPos, - const zeus::CTransform* xf, const zeus::CVector3f* scale, bool useLocator) + constexpr CAnimPlaybackParms(s32 anim, const zeus::CQuaternion* deltaOrient, const zeus::CVector3f* targetPos, + const zeus::CTransform* xf, const zeus::CVector3f* scale, bool useLocator) : x0_animA(anim) , x14_targetPos(targetPos) , x18_useLocator(useLocator) , x1c_deltaOrient(deltaOrient) , x20_objectXf(xf) , x24_objectScale(scale) {} - const zeus::CTransform* GetObjectXform() const { return x20_objectXf; } - const zeus::CQuaternion* GetDeltaOrient() const { return x1c_deltaOrient; } - const zeus::CVector3f* GetTargetPos() const { return x14_targetPos; } - bool GetIsUseLocator() const { return x18_useLocator; } - const zeus::CVector3f* GetObjectScale() const { return x24_objectScale; } - s32 GetAnimationId() const { return x0_animA; } - s32 GetSecondAnimationId() const { return x4_animB; } - float GetBlendFactor() const { return x8_blendWeight; } - void SetAnimationId(s32 id) { x0_animA = id; } - void SetSecondAnimationId(s32 id) { x4_animB = id; } - void SetBlendFactor(float f) { x8_blendWeight = f; } - bool GetIsPlayAnimation() const { return xc_animating; } + + constexpr const zeus::CTransform* GetObjectXform() const { return x20_objectXf; } + constexpr const zeus::CQuaternion* GetDeltaOrient() const { return x1c_deltaOrient; } + constexpr const zeus::CVector3f* GetTargetPos() const { return x14_targetPos; } + constexpr bool GetIsUseLocator() const { return x18_useLocator; } + constexpr const zeus::CVector3f* GetObjectScale() const { return x24_objectScale; } + constexpr s32 GetAnimationId() const { return x0_animA; } + constexpr s32 GetSecondAnimationId() const { return x4_animB; } + constexpr float GetBlendFactor() const { return x8_blendWeight; } + constexpr void SetAnimationId(s32 id) { x0_animA = id; } + constexpr void SetSecondAnimationId(s32 id) { x4_animB = id; } + constexpr void SetBlendFactor(float f) { x8_blendWeight = f; } + constexpr bool GetIsPlayAnimation() const { return xc_animating; } }; } // namespace urde diff --git a/Runtime/MP1/CSamusDoll.cpp b/Runtime/MP1/CSamusDoll.cpp index 74fbbd177..01c6673d8 100644 --- a/Runtime/MP1/CSamusDoll.cpp +++ b/Runtime/MP1/CSamusDoll.cpp @@ -156,7 +156,7 @@ bool CSamusDoll::IsLoaded() const { CModelData CSamusDoll::BuildSuitModelData1(CPlayerState::EPlayerSuit suit) { CModelData ret(CAnimRes(g_ResFactory->GetResourceIdByName("ANCS_ItemScreenSamus")->id, Character1Idxs[size_t(suit)], zeus::skOne3f, 2, true)); - CAnimPlaybackParms parms(2, -1, 1.f, true); + constexpr CAnimPlaybackParms parms(2, -1, 1.f, true); ret.GetAnimationData()->SetAnimation(parms, false); return ret; } @@ -164,7 +164,7 @@ CModelData CSamusDoll::BuildSuitModelData1(CPlayerState::EPlayerSuit suit) { CModelData CSamusDoll::BuildSuitModelDataBoots(CPlayerState::EPlayerSuit suit) { CModelData ret(CAnimRes(g_ResFactory->GetResourceIdByName("ANCS_ItemScreenSamus")->id, CharacterBootsIdxs[size_t(suit)], zeus::skOne3f, 2, true)); - CAnimPlaybackParms parms(2, -1, 1.f, true); + constexpr CAnimPlaybackParms parms(2, -1, 1.f, true); ret.GetAnimationData()->SetAnimation(parms, false); return ret; } diff --git a/Runtime/MP1/CSamusFaceReflection.cpp b/Runtime/MP1/CSamusFaceReflection.cpp index 84ca37816..8a8e2c5af 100644 --- a/Runtime/MP1/CSamusFaceReflection.cpp +++ b/Runtime/MP1/CSamusFaceReflection.cpp @@ -16,7 +16,7 @@ CSamusFaceReflection::CSamusFaceReflection(CStateManager& stateMgr) : x0_modelData(CAnimRes(g_ResFactory->GetResourceIdByName("ACS_SamusFace")->id, 0, zeus::skOne3f, 0, true)) , x4c_lights(std::make_unique(8, zeus::skZero3f, 4, 4, false, false, false, 0.1f)) { x60_lookDir = zeus::skForward; - CAnimPlaybackParms parms(0, -1, 1.f, true); + constexpr CAnimPlaybackParms parms(0, -1, 1.f, true); x0_modelData.GetAnimationData()->SetAnimation(parms, false); } diff --git a/Runtime/Weapon/CGrappleArm.cpp b/Runtime/Weapon/CGrappleArm.cpp index 2f1d90efa..e6aca556e 100644 --- a/Runtime/Weapon/CGrappleArm.cpp +++ b/Runtime/Weapon/CGrappleArm.cpp @@ -131,35 +131,35 @@ void CGrappleArm::SetAnimState(EArmState state) { switch (state) { case EArmState::IntoGrapple: { ResetAuxParams(true); - CAnimPlaybackParms parms(0, -1, 1.f, true); + constexpr CAnimPlaybackParms parms(0, -1, 1.f, true); x0_grappleArmModel->GetAnimationData()->SetAnimation(parms, false); x3b2_25_beamActive = false; x3b2_24_active = true; break; } case EArmState::IntoGrappleIdle: { - CAnimPlaybackParms parms(1, -1, 1.f, true); + constexpr CAnimPlaybackParms parms(1, -1, 1.f, true); x0_grappleArmModel->GetAnimationData()->EnableLooping(true); x0_grappleArmModel->GetAnimationData()->SetAnimation(parms, false); break; } case EArmState::FireGrapple: { - CAnimPlaybackParms parms(2, -1, 1.f, true); + constexpr CAnimPlaybackParms parms(2, -1, 1.f, true); x0_grappleArmModel->GetAnimationData()->SetAnimation(parms, false); break; } case EArmState::ConnectGrapple: { - CAnimPlaybackParms parms(3, -1, 1.f, true); + constexpr CAnimPlaybackParms parms(3, -1, 1.f, true); x0_grappleArmModel->GetAnimationData()->SetAnimation(parms, false); break; } case EArmState::Connected: { - CAnimPlaybackParms parms(3, -1, 1.f, true); + constexpr CAnimPlaybackParms parms(3, -1, 1.f, true); x0_grappleArmModel->GetAnimationData()->SetAnimation(parms, false); break; } case EArmState::OutOfGrapple: { - CAnimPlaybackParms parms(4, -1, 1.f, true); + constexpr CAnimPlaybackParms parms(4, -1, 1.f, true); x0_grappleArmModel->GetAnimationData()->SetAnimation(parms, false); DisconnectGrappleBeam(); break; diff --git a/Runtime/World/CMorphBall.cpp b/Runtime/World/CMorphBall.cpp index d00d29429..6dce23b1d 100644 --- a/Runtime/World/CMorphBall.cpp +++ b/Runtime/World/CMorphBall.cpp @@ -1129,7 +1129,7 @@ void CMorphBall::EnterMorphBallState(CStateManager& mgr) { x1c20_tireFactor = 0.f; UpdateEffects(0.f, mgr); x187c_spiderBallState = ESpiderBallState::Inactive; - CAnimPlaybackParms parms(0, -1, 1.f, true); + constexpr CAnimPlaybackParms parms(0, -1, 1.f, true); x58_ballModel->GetAnimationData()->SetAnimation(parms, false); x1e20_ballAnimIdx = 0; StopEffects(); @@ -1288,7 +1288,7 @@ void CMorphBall::ComputeBoostBallMovement(const CFinalInput& input, CStateManage if (ControlMapper::GetDigitalInput(ControlMapper::ECommands::JumpOrBoost, input) && x187c_spiderBallState != ESpiderBallState::Active) { if (x1e20_ballAnimIdx == 0) { - CAnimPlaybackParms parms(1, -1, 1.f, true); + constexpr CAnimPlaybackParms parms(1, -1, 1.f, true); x58_ballModel->GetAnimationData()->SetAnimation(parms, false); x1e20_ballAnimIdx = 1; x1e24_boostSfxHandle = CSfxManager::SfxStart(SFXsam_ball_charge_lp, 1.f, 0.f, true, 0x7f, true, kInvalidAreaId); @@ -1298,7 +1298,7 @@ void CMorphBall::ComputeBoostBallMovement(const CFinalInput& input, CStateManage x1de8_boostChargeTime = g_tweakBall->GetBoostBallMaxChargeTime(); } else { if (x1e20_ballAnimIdx == 1) { - CAnimPlaybackParms parms(0, -1, 1.f, true); + constexpr CAnimPlaybackParms parms(0, -1, 1.f, true); x58_ballModel->GetAnimationData()->SetAnimation(parms, false); x1e20_ballAnimIdx = 0; CSfxManager::RemoveEmitter(x1e24_boostSfxHandle); @@ -1399,7 +1399,7 @@ void CMorphBall::CancelBoosting() { x1de8_boostChargeTime = 0.f; x1df4_boostDrainTime = 0.f; if (x1e20_ballAnimIdx == 1) { - CAnimPlaybackParms parms(0, -1, 1.f, true); + constexpr CAnimPlaybackParms parms(0, -1, 1.f, true); x58_ballModel->GetAnimationData()->SetAnimation(parms, false); x1e20_ballAnimIdx = 0; CSfxManager::SfxStop(x1e24_boostSfxHandle); diff --git a/Runtime/World/CPlayer.cpp b/Runtime/World/CPlayer.cpp index ea281b5e8..d01aac161 100644 --- a/Runtime/World/CPlayer.cpp +++ b/Runtime/World/CPlayer.cpp @@ -5859,7 +5859,7 @@ void CPlayer::SetHudDisable(float staticTimer, float outSpeed, float inSpeed) { } void CPlayer::SetIntoBallReadyAnimation(CStateManager& mgr) { - const CAnimPlaybackParms parms(2, -1, 1.f, true); + constexpr CAnimPlaybackParms parms(2, -1, 1.f, true); x64_modelData->GetAnimationData()->SetAnimation(parms, false); x64_modelData->GetAnimationData()->EnableLooping(false); x64_modelData->AdvanceAnimation(0.f, mgr, kInvalidAreaId, true); From d5e57b534870303b7c156fa89f6545b46977324b Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 04:19:48 -0400 Subject: [PATCH 079/224] CCompoundTargetReticle: Make skZeroRenderState constexpr Allows eliding runtime initializers where applicable. Particularly for the static data. --- Runtime/GuiSys/CCompoundTargetReticle.cpp | 4 ++-- Runtime/GuiSys/CCompoundTargetReticle.hpp | 28 +++++++++++------------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Runtime/GuiSys/CCompoundTargetReticle.cpp b/Runtime/GuiSys/CCompoundTargetReticle.cpp index c54dc531a..af9e138d1 100644 --- a/Runtime/GuiSys/CCompoundTargetReticle.cpp +++ b/Runtime/GuiSys/CCompoundTargetReticle.cpp @@ -36,8 +36,8 @@ float offshoot_func(float f1, float f2, float f3) { return (f1 * 0.5f) + std::si float calculate_premultiplied_overshoot_offset(float f1) { return 2.f * (M_PIF - std::asin(1.f / f1)); } } // Anonymous namespace -const CTargetReticleRenderState CTargetReticleRenderState::skZeroRenderState(kInvalidUniqueId, 1.f, - zeus::skZero3f, 0.f, 1.f, true); +constexpr CTargetReticleRenderState CTargetReticleRenderState::skZeroRenderState(kInvalidUniqueId, 1.f, zeus::skZero3f, + 0.f, 1.f, true); CCompoundTargetReticle::SOuterItemInfo::SOuterItemInfo(std::string_view res) : x0_model(g_SimplePool->GetObj(res)) {} diff --git a/Runtime/GuiSys/CCompoundTargetReticle.hpp b/Runtime/GuiSys/CCompoundTargetReticle.hpp index 7d8f20a53..6a6b4da8b 100644 --- a/Runtime/GuiSys/CCompoundTargetReticle.hpp +++ b/Runtime/GuiSys/CCompoundTargetReticle.hpp @@ -27,26 +27,26 @@ class CTargetReticleRenderState { public: static const CTargetReticleRenderState skZeroRenderState; - CTargetReticleRenderState(TUniqueId target, float radiusWorld, const zeus::CVector3f& positionWorld, float factor, - float minVpClampScale, bool orbitZoneIdlePosition) + constexpr CTargetReticleRenderState(TUniqueId target, float radiusWorld, const zeus::CVector3f& positionWorld, + float factor, float minVpClampScale, bool orbitZoneIdlePosition) : x0_target(target) , x4_radiusWorld(radiusWorld) , x8_positionWorld(positionWorld) , x14_factor(factor) , x18_minVpClampScale(minVpClampScale) , x1c_orbitZoneIdlePosition(orbitZoneIdlePosition) {} - void SetTargetId(TUniqueId id) { x0_target = id; } - void SetFactor(float f) { x14_factor = f; } - void SetIsOrbitZoneIdlePosition(bool b) { x1c_orbitZoneIdlePosition = b; } - float GetMinViewportClampScale() const { return x18_minVpClampScale; } - float GetFactor() const { return x14_factor; } - float GetRadiusWorld() const { return x4_radiusWorld; } - const zeus::CVector3f& GetTargetPositionWorld() const { return x8_positionWorld; } - bool GetIsOrbitZoneIdlePosition() const { return x1c_orbitZoneIdlePosition; } - void SetTargetPositionWorld(const zeus::CVector3f& pos) { x8_positionWorld = pos; } - void SetRadiusWorld(float r) { x4_radiusWorld = r; } - TUniqueId GetTargetId() const { return x0_target; } - void SetMinViewportClampScale(float s) { x18_minVpClampScale = s; } + constexpr void SetTargetId(TUniqueId id) { x0_target = id; } + constexpr void SetFactor(float factor) { x14_factor = factor; } + constexpr void SetIsOrbitZoneIdlePosition(bool orbit) { x1c_orbitZoneIdlePosition = orbit; } + constexpr float GetMinViewportClampScale() const { return x18_minVpClampScale; } + constexpr float GetFactor() const { return x14_factor; } + constexpr float GetRadiusWorld() const { return x4_radiusWorld; } + constexpr const zeus::CVector3f& GetTargetPositionWorld() const { return x8_positionWorld; } + constexpr bool GetIsOrbitZoneIdlePosition() const { return x1c_orbitZoneIdlePosition; } + constexpr void SetTargetPositionWorld(const zeus::CVector3f& position) { x8_positionWorld = position; } + constexpr void SetRadiusWorld(float radius) { x4_radiusWorld = radius; } + constexpr TUniqueId GetTargetId() const { return x0_target; } + constexpr void SetMinViewportClampScale(float scale) { x18_minVpClampScale = scale; } static void InterpolateWithClamp(const CTargetReticleRenderState& a, CTargetReticleRenderState& out, const CTargetReticleRenderState& b, float t); }; From 3c9fef492a683b52f56c3b45473140782a278ac1 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 05:27:41 -0400 Subject: [PATCH 080/224] CGameOptions: Mark GameOptionsRegistry as constexpr Same behavior but eliminates potential runtime initializers. --- Runtime/CGameOptions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/CGameOptions.cpp b/Runtime/CGameOptions.cpp index 4b2b8e4ee..5ea76beb3 100644 --- a/Runtime/CGameOptions.cpp +++ b/Runtime/CGameOptions.cpp @@ -49,7 +49,7 @@ constexpr std::array ControllerOpts{{ {EGameOption::RestoreDefaults, 35, 0.f, 1.f, 1.f, EOptionType::RestoreDefaults}, }}; -const std::array, 5> GameOptionsRegistry{{ +constexpr std::array, 5> GameOptionsRegistry{{ {VisorOpts.size(), VisorOpts.data()}, {DisplayOpts.size(), DisplayOpts.data()}, {SoundOpts.size(), SoundOpts.data()}, From 5e748a0d7f69f2c5b9908f69524e82152fe77c08 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sun, 12 Apr 2020 05:31:00 -0400 Subject: [PATCH 081/224] Particle/C*EPulse: Fix implementations --- Runtime/Particle/CColorElement.cpp | 17 ++++++++--------- Runtime/Particle/CIntElement.cpp | 17 ++++++++--------- Runtime/Particle/CModVectorElement.cpp | 17 ++++++++--------- Runtime/Particle/CRealElement.cpp | 19 ++++++++++--------- Runtime/Particle/CVectorElement.cpp | 17 ++++++++--------- 5 files changed, 42 insertions(+), 45 deletions(-) diff --git a/Runtime/Particle/CColorElement.cpp b/Runtime/Particle/CColorElement.cpp index 05489c698..0a8c7722d 100644 --- a/Runtime/Particle/CColorElement.cpp +++ b/Runtime/Particle/CColorElement.cpp @@ -123,17 +123,16 @@ bool CCEPulse::GetValue(int frame, zeus::CColor& valOut) const { int a, b; x4_aDuration->GetValue(frame, a); x8_bDuration->GetValue(frame, b); - int cv = zeus::max(1, a + b + 1); + int cv = a + b + 1; + if (cv < 0) { + cv = 1; + } - if (b >= 1) { - int cv2 = frame % cv; - if (cv2 >= a) - x10_bVal->GetValue(frame, valOut); - else - xc_aVal->GetValue(frame, valOut); - } else + if (b < 1 || frame % cv <= a) { xc_aVal->GetValue(frame, valOut); - + } else { + x10_bVal->GetValue(frame, valOut); + } return false; } diff --git a/Runtime/Particle/CIntElement.cpp b/Runtime/Particle/CIntElement.cpp index 591bf4d93..44b69b65d 100644 --- a/Runtime/Particle/CIntElement.cpp +++ b/Runtime/Particle/CIntElement.cpp @@ -158,17 +158,16 @@ bool CIEPulse::GetValue(int frame, int& valOut) const { int a, b; x4_aDuration->GetValue(frame, a); x8_bDuration->GetValue(frame, b); - int cv = std::max(1, a + b + 1); + int cv = a + b + 1; + if (cv < 0) { + cv = 1; + } - if (b >= 1) { - int cv2 = frame % cv; - if (cv2 >= a) - x10_bVal->GetValue(frame, valOut); - else - xc_aVal->GetValue(frame, valOut); - } else + if (b < 1 || frame % cv <= a) { xc_aVal->GetValue(frame, valOut); - + } else { + x10_bVal->GetValue(frame, valOut); + } return false; } diff --git a/Runtime/Particle/CModVectorElement.cpp b/Runtime/Particle/CModVectorElement.cpp index 95cf05124..6b5ec2d29 100644 --- a/Runtime/Particle/CModVectorElement.cpp +++ b/Runtime/Particle/CModVectorElement.cpp @@ -202,17 +202,16 @@ bool CMVEPulse::GetValue(int frame, zeus::CVector3f& pVel, zeus::CVector3f& pPos int a, b; x4_aDuration->GetValue(frame, a); x8_bDuration->GetValue(frame, b); - int cv = std::max(1, a + b + 1); + int cv = a + b + 1; + if (cv < 0) { + cv = 1; + } - if (b >= 1) { - int cv2 = frame % cv; - if (cv2 >= a) - x10_bVal->GetValue(frame, pVel, pPos); - else - xc_aVal->GetValue(frame, pVel, pPos); - } else + if (b < 1 || frame % cv <= a) { xc_aVal->GetValue(frame, pVel, pPos); - + } else { + x10_bVal->GetValue(frame, pVel, pPos); + } return false; } diff --git a/Runtime/Particle/CRealElement.cpp b/Runtime/Particle/CRealElement.cpp index 313aace09..707a372f4 100644 --- a/Runtime/Particle/CRealElement.cpp +++ b/Runtime/Particle/CRealElement.cpp @@ -137,17 +137,18 @@ bool CREPulse::GetValue(int frame, float& valOut) const { int a, b; x4_aDuration->GetValue(frame, a); x8_bDuration->GetValue(frame, b); - int cv = std::max(1, a + b + 1); + int cv = a + b + 1; + if (cv < 0) { + cv = 1; + } - if (b >= 1) { - int cv2 = frame % cv; - if (cv2 >= a) - x10_valB->GetValue(frame, valOut); - else - xc_valA->GetValue(frame, valOut); - } else + // CREPulse is an outlier here, the other + // IElement classes use <= instead of <. + if (b < 1 || frame % cv < a) { xc_valA->GetValue(frame, valOut); - + } else { + x10_valB->GetValue(frame, valOut); + } return false; } diff --git a/Runtime/Particle/CVectorElement.cpp b/Runtime/Particle/CVectorElement.cpp index 27fd0531d..0b395b68b 100644 --- a/Runtime/Particle/CVectorElement.cpp +++ b/Runtime/Particle/CVectorElement.cpp @@ -227,17 +227,16 @@ bool CVEPulse::GetValue(int frame, zeus::CVector3f& valOut) const { int a, b; x4_aDuration->GetValue(frame, a); x8_bDuration->GetValue(frame, b); - int cv = std::max(1, a + b + 1); + int cv = a + b + 1; + if (cv < 0) { + cv = 1; + } - if (b >= 1) { - int cv2 = frame % cv; - if (cv2 >= a) - x10_bVal->GetValue(frame, valOut); - else - xc_aVal->GetValue(frame, valOut); - } else + if (b < 1 || frame % cv <= a) { xc_aVal->GetValue(frame, valOut); - + } else { + x10_bVal->GetValue(frame, valOut); + } return false; } From 1085600f308f7a8ae22bd965cf9ff11a718017fd Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 05:37:50 -0400 Subject: [PATCH 082/224] CGameOption: Eliminate truncations to bool --- Runtime/CGameOptions.cpp | 70 ++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/Runtime/CGameOptions.cpp b/Runtime/CGameOptions.cpp index 5ea76beb3..b872c0fda 100644 --- a/Runtime/CGameOptions.cpp +++ b/Runtime/CGameOptions.cpp @@ -58,22 +58,24 @@ constexpr std::array, 5> GameOptionsRegist }}; CPersistentOptions::CPersistentOptions(CBitStreamReader& stream) { - for (u8& entry : x0_nesState) + for (u8& entry : x0_nesState) { entry = stream.ReadEncoded(8); + } - for (bool& entry : x68_) - entry = stream.ReadEncoded(8); + for (bool& entry : x68_) { + entry = stream.ReadEncoded(8) != 0; + } xc0_frozenFpsCount = stream.ReadEncoded(2); xc4_frozenBallCount = stream.ReadEncoded(2); xc8_powerBombAmmoCount = stream.ReadEncoded(1); xcc_logScanPercent = stream.ReadEncoded(7); - xd0_24_fusionLinked = stream.ReadEncoded(1); - xd0_25_normalModeBeat = stream.ReadEncoded(1); - xd0_26_hardModeBeat = stream.ReadEncoded(1); - xd0_27_fusionBeat = stream.ReadEncoded(1); + xd0_24_fusionLinked = stream.ReadEncoded(1) != 0; + xd0_25_normalModeBeat = stream.ReadEncoded(1) != 0; + xd0_26_hardModeBeat = stream.ReadEncoded(1) != 0; + xd0_27_fusionBeat = stream.ReadEncoded(1) != 0; xd0_28_fusionSuitActive = false; - xd0_29_allItemsCollected = stream.ReadEncoded(1); + xd0_29_allItemsCollected = stream.ReadEncoded(1) != 0; xbc_autoMapperKeyState = stream.ReadEncoded(2); auto& memWorlds = g_MemoryCardSys->GetMemoryWorlds(); @@ -86,8 +88,9 @@ CPersistentOptions::CPersistentOptions(CBitStreamReader& stream) { std::vector cinematicStates; cinematicStates.reserve(cinematicCount); - for (size_t i = 0; i < cinematicCount; ++i) - cinematicStates.push_back(stream.ReadEncoded(1)); + for (size_t i = 0; i < cinematicCount; ++i) { + cinematicStates.push_back(stream.ReadEncoded(1) != 0); + } for (const auto& world : memWorlds) { TLockedToken saveWorld = @@ -101,11 +104,13 @@ CPersistentOptions::CPersistentOptions(CBitStreamReader& stream) { } void CPersistentOptions::PutTo(CBitStreamWriter& w) const { - for (const u8 entry : x0_nesState) + for (const u8 entry : x0_nesState) { w.WriteEncoded(entry, 8); + } - for (const bool entry : x68_) - w.WriteEncoded(entry, 8); + for (const bool entry : x68_) { + w.WriteEncoded(u32(entry), 8); + } w.WriteEncoded(xc0_frozenFpsCount, 2); w.WriteEncoded(xc4_frozenBallCount, 2); @@ -120,11 +125,12 @@ void CPersistentOptions::PutTo(CBitStreamWriter& w) const { auto& memWorlds = g_MemoryCardSys->GetMemoryWorlds(); for (const auto& world : memWorlds) { - TLockedToken saveWorld = + const TLockedToken saveWorld = g_SimplePool->GetObj(SObjectTag{FOURCC('SAVW'), world.second.GetSaveWorldAssetId()}); - for (TEditorId cineId : saveWorld->GetCinematics()) - w.WriteEncoded(GetCinematicState(world.first, cineId), 1); + for (const TEditorId cineId : saveWorld->GetCinematics()) { + w.WriteEncoded(u32(GetCinematicState(world.first, cineId)), 1); + } } } @@ -164,11 +170,11 @@ CGameOptions::CGameOptions(CBitStreamReader& stream) { x60_hudAlpha = stream.ReadEncoded(8); x64_helmetAlpha = stream.ReadEncoded(8); - x68_24_hudLag = stream.ReadEncoded(1); - x68_28_hintSystem = stream.ReadEncoded(1); - x68_25_invertY = stream.ReadEncoded(1); - x68_26_rumble = stream.ReadEncoded(1); - x68_27_swapBeamsControls = stream.ReadEncoded(1); + x68_24_hudLag = stream.ReadEncoded(1) != 0; + x68_28_hintSystem = stream.ReadEncoded(1) != 0; + x68_25_invertY = stream.ReadEncoded(1) != 0; + x68_26_rumble = stream.ReadEncoded(1) != 0; + x68_27_swapBeamsControls = stream.ReadEncoded(1) != 0; } void CGameOptions::ResetToDefaults() { @@ -276,7 +282,7 @@ void CGameOptions::SetSfxVolume(s32 vol, bool apply) { x58_sfxVol = zeus::clamp(0, vol, 0x7f); if (apply) { - CAudioSys::SysSetSfxVolume(x58_sfxVol, 1, 1, 1); + CAudioSys::SysSetSfxVolume(x58_sfxVol, 1, true, true); CStreamAudioManager::SetSfxVolume(x58_sfxVol); CMoviePlayer::SetSfxVolume(x58_sfxVol); } @@ -442,10 +448,10 @@ void CGameOptions::SetOption(EGameOption option, int value) { options.SetHelmetAlpha(value); break; case EGameOption::HUDLag: - options.SetHUDLag(value); + options.SetHUDLag(value != 0); break; case EGameOption::HintSystem: - options.SetIsHintSystemEnabled(value); + options.SetIsHintSystemEnabled(value != 0); break; case EGameOption::ScreenBrightness: options.SetGamma(value, true); @@ -469,13 +475,13 @@ void CGameOptions::SetOption(EGameOption option, int value) { options.SetSurroundMode(value, true); break; case EGameOption::ReverseYAxis: - options.SetInvertYAxis(value); + options.SetInvertYAxis(value != 0); break; case EGameOption::Rumble: - options.SetIsRumbleEnabled(value); + options.SetIsRumbleEnabled(value != 0); break; case EGameOption::SwapBeamControls: - options.SetSwapBeamControls(value); + options.SetSwapBeamControls(value != 0); break; default: break; @@ -491,9 +497,9 @@ int CGameOptions::GetOption(EGameOption option) { case EGameOption::HelmetOpacity: return options.GetHelmetAlpha(); case EGameOption::HUDLag: - return options.GetHUDLag(); + return int(options.GetHUDLag()); case EGameOption::HintSystem: - return options.GetIsHintSystemEnabled(); + return int(options.GetIsHintSystemEnabled()); case EGameOption::ScreenBrightness: return options.GetGamma(); case EGameOption::ScreenOffsetX: @@ -509,11 +515,11 @@ int CGameOptions::GetOption(EGameOption option) { case EGameOption::SoundMode: return int(options.GetSurroundMode()); case EGameOption::ReverseYAxis: - return options.GetInvertYAxis(); + return int(options.GetInvertYAxis()); case EGameOption::Rumble: - return options.GetIsRumbleEnabled(); + return int(options.GetIsRumbleEnabled()); case EGameOption::SwapBeamControls: - return options.GetSwapBeamControls(); + return int(options.GetSwapBeamControls()); default: break; } From 976bf0d83eeb640f4a706a7866b81772fa11b207 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 05:42:43 -0400 Subject: [PATCH 083/224] CGameOption: Mark C-Pad arrays constexpr Allows elision of runtime initializers. --- Runtime/CGameOptions.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Runtime/CGameOptions.cpp b/Runtime/CGameOptions.cpp index b872c0fda..42336b3a2 100644 --- a/Runtime/CGameOptions.cpp +++ b/Runtime/CGameOptions.cpp @@ -331,7 +331,7 @@ void CGameOptions::SetControls(int controls) { ResetControllerAssets(controls); } -const std::array, 5> CStickToDPadRemap{{ +constexpr std::array, 5> CStickToDPadRemap{{ {0x2A13C23E, 0xF13452F8}, {0xA91A7703, 0xC042EC91}, {0x12A12131, 0x5F556002}, @@ -339,7 +339,7 @@ const std::array, 5> CStickToDPadRemap{{ {0xCD7B1ACA, 0x8ADA8184}, }}; -const std::array, 5> CStickOutlineToDPadRemap{{ +constexpr std::array, 5> CStickOutlineToDPadRemap{{ {0x1A29C0E6, 0xF13452F8}, {0x5D9F9796, 0xC042EC91}, {0x951546A8, 0x5F556002}, From 9e168d3497addf8b8d599cf6dcb6f8291cb75487 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 07:29:58 -0400 Subject: [PATCH 084/224] CPlasmaProjectile: Make PlayerEffectResource instances contain CAssetIds Uses the wrapper type instead of the raw type. --- Runtime/Weapon/CPlasmaProjectile.cpp | 10 ++++++---- Runtime/Weapon/CPlasmaProjectile.hpp | 8 ++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Runtime/Weapon/CPlasmaProjectile.cpp b/Runtime/Weapon/CPlasmaProjectile.cpp index dfb559bec..b6475aad3 100644 --- a/Runtime/Weapon/CPlasmaProjectile.cpp +++ b/Runtime/Weapon/CPlasmaProjectile.cpp @@ -53,12 +53,14 @@ CPlasmaProjectile::CPlasmaProjectile(const TToken& wDesc, st x51c_pulseGen = std::make_unique(x50c_pulseFxDesc, CElementGen::EModelOrientationType::Normal); x524_freezeSteamTxtr = res[0]; x528_freezeIceTxtr = res[1]; - if (res[2] != UINT64_MAX) + if (res[2].IsValid()) { x52c_visorElectric = g_SimplePool->GetObj(SObjectTag{FOURCC('ELSC'), res[2]}); - if (res[3] != UINT64_MAX) + } + if (res[3].IsValid()) { x538_visorParticle = g_SimplePool->GetObj(SObjectTag{FOURCC('PART'), res[3]}); - x544_freezeSfx = CSfxManager::TranslateSFXID(res[4]); - x546_electricSfx = CSfxManager::TranslateSFXID(res[5]); + } + x544_freezeSfx = CSfxManager::TranslateSFXID(u16(res[4].Value())); + x546_electricSfx = CSfxManager::TranslateSFXID(u16(res[5].Value())); x518_contactGen->SetGlobalScale(zeus::CVector3f(bInfo.GetContactFxScale())); x51c_pulseGen->SetGlobalScale(zeus::CVector3f(bInfo.GetPulseFxScale())); x518_contactGen->SetParticleEmission(false); diff --git a/Runtime/Weapon/CPlasmaProjectile.hpp b/Runtime/Weapon/CPlasmaProjectile.hpp index a0a0747ee..048b78fc0 100644 --- a/Runtime/Weapon/CPlasmaProjectile.hpp +++ b/Runtime/Weapon/CPlasmaProjectile.hpp @@ -18,10 +18,10 @@ namespace urde { class CPlasmaProjectile : public CBeamProjectile { public: - struct PlayerEffectResoures : rstl::reserved_vector { - PlayerEffectResoures(u64 a = UINT64_MAX, u64 b = UINT64_MAX, u64 c = UINT64_MAX, u64 d = UINT64_MAX, - u64 e = UINT64_MAX, u64 f = UINT64_MAX, u64 g = UINT64_MAX, u64 h = UINT64_MAX) - : rstl::reserved_vector({a, b, c, d, e, f, g, h}) {} + struct PlayerEffectResoures : rstl::reserved_vector { + PlayerEffectResoures(CAssetId a = {}, CAssetId b = {}, CAssetId c = {}, CAssetId d = {}, + CAssetId e = {}, CAssetId f = {}, CAssetId g = {}, CAssetId h = {}) + : rstl::reserved_vector({a, b, c, d, e, f, g, h}) {} }; private: std::vector x468_lights; From aa8f17d847d36b2e6ab5fa9c9c764befbf6fe4e0 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 08:46:20 -0400 Subject: [PATCH 085/224] CFire: Return std::nullopt in GetTouchBounds() Avoids unnecessarily zeroing out the entire internal buffer in std::optional in some implementations (libstdc++/libc++). --- Runtime/World/CFire.hpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Runtime/World/CFire.hpp b/Runtime/World/CFire.hpp index f2471d3b2..357b2b89e 100644 --- a/Runtime/World/CFire.hpp +++ b/Runtime/World/CFire.hpp @@ -35,10 +35,11 @@ public: void AcceptScriptMsg(EScriptObjectMessage, TUniqueId, CStateManager&) override; void Think(float, CStateManager&) override; std::optional GetTouchBounds() const override { - if (GetActive()) + if (GetActive()) { return x128_; + } - return {}; + return std::nullopt; } void Touch(CActor&, CStateManager&) override; From 2069694b59b2198f75474049cbea43c118e61edd Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 08:52:21 -0400 Subject: [PATCH 086/224] CFluidPlane: Make use of HasReference() instead of operator bool Looks a little less out of place while performing the same behavior. IDE's can also do lookup more reliably on a regular function as opposed to a conversion operator. --- Runtime/World/CFluidPlane.hpp | 6 +++--- Runtime/World/CFluidPlaneCPU.hpp | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Runtime/World/CFluidPlane.hpp b/Runtime/World/CFluidPlane.hpp index c5c70128e..4bb69e546 100644 --- a/Runtime/World/CFluidPlane.hpp +++ b/Runtime/World/CFluidPlane.hpp @@ -168,10 +168,10 @@ public: EFluidType GetFluidType() const { return x44_fluidType; } const CFluidUVMotion& GetUVMotion() const { return x4c_uvMotion; } const CTexture& GetColorTexture() const { return *x30_texColor; } - bool HasColorTexture() const { return x30_texColor.operator bool(); } + bool HasColorTexture() const { return x30_texColor.HasReference(); } const CTexture& GetTexturePattern1() const { return *x10_texPattern1; } - bool HasTexturePattern1() const { return x10_texPattern1.operator bool(); } + bool HasTexturePattern1() const { return x10_texPattern1.HasReference(); } const CTexture& GetTexturePattern2() const { return *x20_texPattern2; } - bool HasTexturePattern2() const { return x20_texPattern2.operator bool(); } + bool HasTexturePattern2() const { return x20_texPattern2.HasReference(); } }; } // namespace urde diff --git a/Runtime/World/CFluidPlaneCPU.hpp b/Runtime/World/CFluidPlaneCPU.hpp index 6572ad38e..b7a569d5a 100644 --- a/Runtime/World/CFluidPlaneCPU.hpp +++ b/Runtime/World/CFluidPlaneCPU.hpp @@ -106,13 +106,13 @@ public: float GetSpecularMin() const { return x10c_specularMin; } float GetReflectionSize() const { return x118_reflectionSize; } float GetBumpScale() const { return xfc_bumpScale; } - bool HasBumpMap() const { return xb0_bumpMap.operator bool(); } + bool HasBumpMap() const { return xb0_bumpMap.HasReference(); } const CTexture& GetBumpMap() const { return *xb0_bumpMap; } - bool HasEnvMap() const { return xc0_envMap.operator bool(); } + bool HasEnvMap() const { return xc0_envMap.HasReference(); } const CTexture& GetEnvMap() const { return *xc0_envMap; } - bool HasEnvBumpMap() const { return xd0_envBumpMap.operator bool(); } + bool HasEnvBumpMap() const { return xd0_envBumpMap.HasReference(); } const CTexture& GetEnvBumpMap() const { return *xd0_envBumpMap; } - bool HasLightMap() const { return xe0_lightmap.operator bool(); } + bool HasLightMap() const { return xe0_lightmap.HasReference(); } const CTexture& GetLightMap() const { return *xe0_lightmap; } const zeus::CVector3f& GetBumpLightDir() const { return xf0_bumpLightDir; } float GetTileSize() const { return x100_tileSize; } From 3c8619ba449c9f7b6ff411333c1a951550a7aed8 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 09:03:28 -0400 Subject: [PATCH 087/224] CFluidPlaneManager: Make use of std::array where applicable Eliminates any potential implicit array to pointer decay. --- Runtime/World/CFluidPlaneManager.cpp | 43 ++++++++++++++++------------ Runtime/World/CFluidPlaneManager.hpp | 6 ++-- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/Runtime/World/CFluidPlaneManager.cpp b/Runtime/World/CFluidPlaneManager.cpp index 78f24bba0..48917c26f 100644 --- a/Runtime/World/CFluidPlaneManager.cpp +++ b/Runtime/World/CFluidPlaneManager.cpp @@ -79,53 +79,58 @@ void CFluidPlaneManager::CreateSplash(TUniqueId splasher, CStateManager& mgr, co } static bool g_RippleMapSetup = false; -u8 CFluidPlaneManager::RippleValues[64][64] = {}; -u8 CFluidPlaneManager::RippleMins[64] = {}; -u8 CFluidPlaneManager::RippleMaxs[64] = {}; +std::array, 64> CFluidPlaneManager::RippleValues{}; +std::array CFluidPlaneManager::RippleMins{}; +std::array CFluidPlaneManager::RippleMaxs{}; boo::ObjToken CFluidPlaneManager::RippleMapTex; void CFluidPlaneManager::SetupRippleMap() { - if (g_RippleMapSetup) + if (g_RippleMapSetup) { return; + } g_RippleMapSetup = true; float curX = 0.f; - for (int i = 0; i < 64; ++i) { + for (size_t i = 0; i < 64; ++i) { float curY = 0.f; float minY = 1.f; float maxY = 0.f; - for (int j = 0; j < 64; ++j) { - float rVal = 1.f - curY; + for (size_t j = 0; j < 64; ++j) { + const float rVal = 1.f - curY; float minX = curY; float maxX = 1.25f * (0.25f * rVal + 0.1f) + curY; - if (curY < 0.f) + if (curY < 0.f) { minX = 0.f; - else if (maxX > 1.f) + } else if (maxX > 1.f) { maxX = 1.f; + } float val = 0.f; if (curX >= minX && curX <= maxX) { - float t = (curX - minX) / (maxX - minX); - if (t < 0.4f) + const float t = (curX - minX) / (maxX - minX); + if (t < 0.4f) { val = 2.5f * t; - else if (t > 0.75f) + } else if (t > 0.75f) { val = 4.f * (1.f - t); - else + } else { val = 1.f; + } } - auto valA = u8(std::max(int(255.f * val * rVal * rVal) - 1, 0)); + const auto valA = u8(std::max(int(255.f * val * rVal * rVal) - 1, 0)); RippleValues[i][j] = valA; - if (valA != 0 && curY < minY) + if (valA != 0 && curY < minY) { minY = curY; - if (valA != 0 && curY > maxY) + } + if (valA != 0 && curY > maxY) { maxY = curY; + } curY += (1.f / 63.f); } - auto valB = u8(std::max(int(255.f * minY) - 1, 0)); - auto valC = u8(std::min(int(255.f * maxY) + 1, 255)); + const auto valB = u8(std::max(int(255.f * minY) - 1, 0)); + const auto valC = u8(std::min(int(255.f * maxY) + 1, 255)); RippleMins[i] = valB; RippleMaxs[i] = valC; curX += (1.f / 63.f); @@ -133,7 +138,7 @@ void CFluidPlaneManager::SetupRippleMap() { CGraphics::CommitResources([](boo::IGraphicsDataFactory::Context& ctx) { RippleMapTex = ctx.newStaticTexture(64, 64, 1, boo::TextureFormat::I8, boo::TextureClampMode::ClampToBlack, - RippleValues, 64 * 64); + RippleValues.data(), 64 * 64); return true; } BooTrace); } diff --git a/Runtime/World/CFluidPlaneManager.hpp b/Runtime/World/CFluidPlaneManager.hpp index 62bb95d9c..e492a9480 100644 --- a/Runtime/World/CFluidPlaneManager.hpp +++ b/Runtime/World/CFluidPlaneManager.hpp @@ -44,9 +44,9 @@ class CFluidPlaneManager { static void SetupRippleMap(); public: - static u8 RippleValues[64][64]; - static u8 RippleMins[64]; - static u8 RippleMaxs[64]; + static std::array, 64> RippleValues; + static std::array RippleMins; + static std::array RippleMaxs; static boo::ObjToken RippleMapTex; CFluidPlaneManager(); From 14f6dd2cd8bb7dee76e8082b08f2143e65dae6cd Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 09:20:22 -0400 Subject: [PATCH 088/224] CFluidUVMotion: Return std::array by value from CalculateFluidTextureOffset() Same behavior, but allows for easier use of API and makes it harder to misuse. It also makes it easier for analysis to determine out of bounds, given we leverage std::array rather than a pointer that causes arrays to decay and lose their size information. --- Runtime/World/CFluidPlaneCPU.cpp | 11 +++++------ Runtime/World/CFluidPlaneDoor.cpp | 5 ++--- Runtime/World/CFluidUVMotion.cpp | 21 ++++++++++++--------- Runtime/World/CFluidUVMotion.hpp | 8 +++++++- 4 files changed, 26 insertions(+), 19 deletions(-) diff --git a/Runtime/World/CFluidPlaneCPU.cpp b/Runtime/World/CFluidPlaneCPU.cpp index f30ad5efc..1d1bb52d0 100644 --- a/Runtime/World/CFluidPlaneCPU.cpp +++ b/Runtime/World/CFluidPlaneCPU.cpp @@ -128,11 +128,11 @@ CFluidPlaneShader::RenderSetupInfo CFluidPlaneCPU::RenderSetup(const CStateManag const CScriptWater* water) { CFluidPlaneShader::RenderSetupInfo out; - float uvT = mgr.GetFluidPlaneManager()->GetUVT(); - bool hasBumpMap = HasBumpMap() && kEnableWaterBumpMaps; + const float uvT = mgr.GetFluidPlaneManager()->GetUVT(); + const bool hasBumpMap = HasBumpMap() && kEnableWaterBumpMaps; bool doubleLightmapBlend = false; - bool hasEnvMap = mgr.GetCameraManager()->GetFluidCounter() == 0 && HasEnvMap(); - bool hasEnvBumpMap = HasEnvBumpMap(); + const bool hasEnvMap = mgr.GetCameraManager()->GetFluidCounter() == 0 && HasEnvMap(); + const bool hasEnvBumpMap = HasEnvBumpMap(); InitializeSineWave(); CGraphics::SetModelMatrix(xf); @@ -165,8 +165,7 @@ CFluidPlaneShader::RenderSetupInfo CFluidPlaneCPU::RenderSetup(const CStateManag curTex++; } - float fluidUVs[3][2]; - x4c_uvMotion.CalculateFluidTextureOffset(uvT, fluidUVs); + const auto fluidUVs = x4c_uvMotion.CalculateFluidTextureOffset(uvT); out.texMtxs[0][0][0] = x4c_uvMotion.GetFluidLayers()[1].GetUVScale(); out.texMtxs[0][1][1] = x4c_uvMotion.GetFluidLayers()[1].GetUVScale(); diff --git a/Runtime/World/CFluidPlaneDoor.cpp b/Runtime/World/CFluidPlaneDoor.cpp index 339d321bd..b97a94f28 100644 --- a/Runtime/World/CFluidPlaneDoor.cpp +++ b/Runtime/World/CFluidPlaneDoor.cpp @@ -18,11 +18,10 @@ CFluidPlaneShader::RenderSetupInfo CFluidPlaneDoor::RenderSetup(const CStateMana bool noNormals) { CFluidPlaneShader::RenderSetupInfo out; - float uvT = mgr.GetFluidPlaneManager()->GetUVT(); + const float uvT = mgr.GetFluidPlaneManager()->GetUVT(); CGraphics::SetModelMatrix(xf); - float fluidUVs[3][2]; - x4c_uvMotion.CalculateFluidTextureOffset(uvT, fluidUVs); + const auto fluidUVs = x4c_uvMotion.CalculateFluidTextureOffset(uvT); out.texMtxs[0][0][0] = x4c_uvMotion.GetFluidLayers()[1].GetUVScale(); out.texMtxs[0][1][1] = x4c_uvMotion.GetFluidLayers()[1].GetUVScale(); diff --git a/Runtime/World/CFluidUVMotion.cpp b/Runtime/World/CFluidUVMotion.cpp index 81c2cdb0a..e8ad7cc6e 100644 --- a/Runtime/World/CFluidUVMotion.cpp +++ b/Runtime/World/CFluidUVMotion.cpp @@ -25,15 +25,16 @@ CFluidUVMotion::CFluidUVMotion(float timeToWrap, float orientation) x0_fluidLayers[2].x8_orientation = 0.78539819f; } -void CFluidUVMotion::CalculateFluidTextureOffset(float t, float offsets[3][2]) const { - float totalYOffset = t * x4c_ooTimeToWrap * std::cos(x50_orientation); - float totalXOffset = t * x4c_ooTimeToWrap * std::sin(x50_orientation); +CFluidUVMotion::FluidOffsets CFluidUVMotion::CalculateFluidTextureOffset(float t) const { + FluidOffsets offsets; + const float totalYOffset = t * x4c_ooTimeToWrap * std::cos(x50_orientation); + const float totalXOffset = t * x4c_ooTimeToWrap * std::sin(x50_orientation); - for (u32 i = 0; i < x0_fluidLayers.size(); ++i) { + for (size_t i = 0; i < x0_fluidLayers.size(); ++i) { const SFluidLayerMotion& layer = x0_fluidLayers[i]; - float speedT = t * layer.x4_ooTimeToWrap; - float cycleT = speedT - std::floor(speedT); + const float speedT = t * layer.x4_ooTimeToWrap; + const float cycleT = speedT - std::floor(speedT); float localY; float localX; switch (layer.x0_motion) { @@ -42,7 +43,7 @@ void CFluidUVMotion::CalculateFluidTextureOffset(float t, float offsets[3][2]) c localY = 0.f; } break; case EFluidUVMotion::Circular: { - float angle = (M_PIF * 2) * cycleT; + const float angle = (M_PIF * 2) * cycleT; localY = layer.xc_magnitude * std::sin(angle); localX = layer.xc_magnitude * std::cos(angle); } break; @@ -55,11 +56,13 @@ void CFluidUVMotion::CalculateFluidTextureOffset(float t, float offsets[3][2]) c break; } - float x = localX * std::sin(layer.x8_orientation) + localY * std::cos(layer.x8_orientation) + totalXOffset; - float y = localY * std::sin(layer.x8_orientation) + localX * std::cos(layer.x8_orientation) + totalYOffset; + const float x = localX * std::sin(layer.x8_orientation) + localY * std::cos(layer.x8_orientation) + totalXOffset; + const float y = localY * std::sin(layer.x8_orientation) + localX * std::cos(layer.x8_orientation) + totalYOffset; offsets[i][0] = x - std::floor(x); offsets[i][1] = y - std::floor(y); } + + return offsets; } } // namespace urde diff --git a/Runtime/World/CFluidUVMotion.hpp b/Runtime/World/CFluidUVMotion.hpp index fd506bcfc..e8d1eb8dd 100644 --- a/Runtime/World/CFluidUVMotion.hpp +++ b/Runtime/World/CFluidUVMotion.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include "Runtime/RetroTypes.hpp" #include "Runtime/rstl.hpp" @@ -38,6 +40,8 @@ private: float x50_orientation; public: + using FluidOffsets = std::array, 3>; + CFluidUVMotion(float timeToWrap, float orientation, const SFluidLayerMotion& colorLayer, const SFluidLayerMotion& pattern1Layer, const SFluidLayerMotion& pattern2Layer); CFluidUVMotion(float timeToWrap, float orientation); @@ -45,6 +49,8 @@ public: const rstl::reserved_vector& GetFluidLayers() const { return x0_fluidLayers; } float GetOrientation() const { return x50_orientation; } float GetOOTimeToWrapTexPage() const { return x4c_ooTimeToWrap; } - void CalculateFluidTextureOffset(float, float[3][2]) const; + + // In game binaries this uses an out pointer instead of return by value. + FluidOffsets CalculateFluidTextureOffset(float t) const; }; } // namespace urde From 4625374a7f637fa2ca015f870b4e53fc34cf0c55 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 10:16:12 -0400 Subject: [PATCH 089/224] ParticleCommon: Make operator bool conversions explicit Prevents any implicit error-prone conversions to bool from occurring. --- DataSpec/DNACommon/ParticleCommon.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/DataSpec/DNACommon/ParticleCommon.hpp b/DataSpec/DNACommon/ParticleCommon.hpp index f219fe300..7f80f582c 100644 --- a/DataSpec/DNACommon/ParticleCommon.hpp +++ b/DataSpec/DNACommon/ParticleCommon.hpp @@ -253,7 +253,7 @@ struct PEImpl : BigDNA { _Basis::gatherDependencies(deps, m_elem); } - operator bool() const { return m_elem.operator bool(); } + explicit operator bool() const { return m_elem.operator bool(); } auto* get() const { return m_elem.get(); } auto* operator->() const { return get(); } void reset() { m_elem.reset(); } @@ -565,7 +565,7 @@ struct IUVElement : IElement { struct BoolHelper : IElement { AT_DECL_EXPLICIT_DNA_YAMLV_NO_TYPE bool value = false; - operator bool() const { return value; } + explicit operator bool() const { return value; } BoolHelper& operator=(bool val) { value = val; return *this; @@ -610,7 +610,7 @@ struct ValueHelper : BigDNA { std::optional value = {}; void emplace(Tp val) { value.emplace(val); } Tp operator*() const { return *value; } - operator bool() const { return value.operator bool(); } + explicit operator bool() const { return value.operator bool(); } }; struct RELifetimeTween : IRealElement { @@ -1333,7 +1333,7 @@ struct SpawnSystemKeyframeData : BigDNA { AT_DECL_EXPLICIT_DNA_YAML AT_SUBDECL_DNA - operator bool() const { return spawns.size() != 0; } + explicit operator bool() const { return spawns.size() != 0; } void gatherDependencies(std::vector& pathsOut) const { for (const auto& p : spawns) @@ -1347,7 +1347,7 @@ struct ChildResourceFactory : BigDNA { IDType id; AT_DECL_EXPLICIT_DNA_YAML AT_SUBDECL_DNA - operator bool() const { return id.isValid(); } + explicit operator bool() const { return id.isValid(); } void gatherDependencies(std::vector& pathsOut) const { if (id.isValid()) g_curSpec->flattenDependencies(id, pathsOut); From c662634226914dfc1330c8d1d22095238d769646 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 10:19:09 -0400 Subject: [PATCH 090/224] CBallCamera: Mark BallCameraFilter as constexpr Allows removal of runtime initializers. --- Runtime/Camera/CBallCamera.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Camera/CBallCamera.cpp b/Runtime/Camera/CBallCamera.cpp index d2b285ae8..0f24b66e9 100644 --- a/Runtime/Camera/CBallCamera.cpp +++ b/Runtime/Camera/CBallCamera.cpp @@ -275,7 +275,7 @@ void CBallCamera::SetState(EBallCameraState state, CStateManager& mgr) { x400_state = state; } -static const CMaterialFilter BallCameraFilter = CMaterialFilter::MakeIncludeExclude( +constexpr CMaterialFilter BallCameraFilter = CMaterialFilter::MakeIncludeExclude( {EMaterialTypes::Solid}, {EMaterialTypes::ProjectilePassthrough, EMaterialTypes::Player, EMaterialTypes::Character, EMaterialTypes::CameraPassthrough}); From 535c02abe8d35f6860d77d5f94f52f10fb592c62 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 10:20:22 -0400 Subject: [PATCH 091/224] CCameraShakeData: Mark skChargedShotCameraShakeData as constexpr Same behavior, minus potential runtime initializers. --- Runtime/Camera/CCameraShakeData.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Camera/CCameraShakeData.cpp b/Runtime/Camera/CCameraShakeData.cpp index 490b3c9de..ab926ad7f 100644 --- a/Runtime/Camera/CCameraShakeData.cpp +++ b/Runtime/Camera/CCameraShakeData.cpp @@ -122,7 +122,7 @@ CCameraShakeData CCameraShakeData::LoadCameraShakeData(CInputStream& in) { return {duration, 100.f, 0, zeus::skZero3f, shakerX, shakerY, shakerZ}; } -const CCameraShakeData CCameraShakeData::skChargedShotCameraShakeData{ +constexpr CCameraShakeData CCameraShakeData::skChargedShotCameraShakeData{ 0.3f, 100.f, 0, From 5fc0802373f21533da93923a9b0c60081bd4d4f1 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 10:21:32 -0400 Subject: [PATCH 092/224] CPathCamera: Mark kLineOfSightFilter as constexpr Same behavior, minus any potential runtime initializers. --- Runtime/Camera/CPathCamera.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Camera/CPathCamera.cpp b/Runtime/Camera/CPathCamera.cpp index ef43a8111..ea39057ae 100644 --- a/Runtime/Camera/CPathCamera.cpp +++ b/Runtime/Camera/CPathCamera.cpp @@ -79,7 +79,7 @@ void CPathCamera::ProcessInput(const CFinalInput&, CStateManager& mgr) { // Empty } -static const CMaterialFilter kLineOfSightFilter = +constexpr CMaterialFilter kLineOfSightFilter = CMaterialFilter::MakeIncludeExclude({EMaterialTypes::Solid}, {EMaterialTypes::ProjectilePassthrough}); void CPathCamera::Reset(const zeus::CTransform&, CStateManager& mgr) { From 724505e6dc3b15d5c4f92739686af1289f294cf0 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 10:25:38 -0400 Subject: [PATCH 093/224] CAreaOctTree: Make use of std::array where applicable Prevents any implicit array to pointer decay from occurring. --- Runtime/Collision/CAreaOctTree.cpp | 41 ++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/Runtime/Collision/CAreaOctTree.cpp b/Runtime/Collision/CAreaOctTree.cpp index 0b40613aa..3e8fada5b 100644 --- a/Runtime/Collision/CAreaOctTree.cpp +++ b/Runtime/Collision/CAreaOctTree.cpp @@ -52,18 +52,39 @@ static bool BoxLineTest(const zeus::CAABox& aabb, const zeus::CLine& line, float return lT <= hT; } -static const int SomeIndexA[] = {1, 2, 4}; +constexpr std::array SomeIndexA{1, 2, 4}; -static const int SomeIndexB[] = {1, 2, 0}; +constexpr std::array SomeIndexB{1, 2, 0}; -static const int SomeIndexC[8][8] = {{0, 1, 2, 4, 5, 6, 8, 0xA}, {0, 1, 2, 3, 5, 6, 8, 0xA}, {0, 1, 2, 4, 5, 6, 9, 0xB}, - {0, 1, 2, 3, 5, 6, 9, 0xC}, {0, 1, 2, 4, 5, 7, 8, 0xD}, {0, 1, 2, 3, 5, 7, 8, 0xE}, - {0, 1, 2, 4, 5, 7, 9, 0xF}, {0, 1, 2, 3, 5, 7, 9, 0xF}}; +constexpr std::array, 8> SomeIndexC{{ + {0, 1, 2, 4, 5, 6, 8, 0xA}, + {0, 1, 2, 3, 5, 6, 8, 0xA}, + {0, 1, 2, 4, 5, 6, 9, 0xB}, + {0, 1, 2, 3, 5, 6, 9, 0xC}, + {0, 1, 2, 4, 5, 7, 8, 0xD}, + {0, 1, 2, 3, 5, 7, 8, 0xE}, + {0, 1, 2, 4, 5, 7, 9, 0xF}, + {0, 1, 2, 3, 5, 7, 9, 0xF}, +}}; -static const std::pair> SubdivIndex[16] = { - {0, {0, 0, 0}}, {1, {0, 0, 0}}, {1, {1, 0, 0}}, {2, {0, 1, 0}}, {2, {1, 0, 0}}, {1, {2, 0, 0}}, - {2, {0, 2, 0}}, {2, {2, 0, 0}}, {2, {2, 1, 0}}, {2, {1, 2, 0}}, {3, {0, 2, 1}}, {3, {1, 0, 2}}, - {3, {0, 1, 2}}, {3, {2, 1, 0}}, {3, {2, 0, 1}}, {3, {1, 2, 0}}}; +constexpr std::array>, 16> SubdivIndex{{ + {0, {0, 0, 0}}, + {1, {0, 0, 0}}, + {1, {1, 0, 0}}, + {2, {0, 1, 0}}, + {2, {1, 0, 0}}, + {1, {2, 0, 0}}, + {2, {0, 2, 0}}, + {2, {2, 0, 0}}, + {2, {2, 1, 0}}, + {2, {1, 2, 0}}, + {3, {0, 2, 1}}, + {3, {1, 0, 2}}, + {3, {0, 1, 2}}, + {3, {2, 1, 0}}, + {3, {2, 0, 1}}, + {3, {1, 2, 0}}, +}}; bool CAreaOctTree::Node::LineTestInternal(const zeus::CLine& line, const CMaterialFilter& filter, float lT, float hT, float maxT, const zeus::CVector3f& vec) const { @@ -149,7 +170,7 @@ bool CAreaOctTree::Node::LineTestInternal(const zeus::CLine& line, const CMateri int r28 = 0; int r25 = 0; int r26 = 0; - for (int i = 0; i < 3; ++i) { + for (size_t i = 0; i < 3; ++i) { if (r6[i] >= center[i]) r28 |= SomeIndexA[i]; if (r7[i] >= center[i]) From 66f5685590ca6a43241ddff3932e30b6065db282 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 10:27:59 -0400 Subject: [PATCH 094/224] CMaterialFilter: Mark skPassEverything as constexpr Removes any potential runtime initializers. --- Runtime/Collision/CMaterialFilter.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Runtime/Collision/CMaterialFilter.cpp b/Runtime/Collision/CMaterialFilter.cpp index 813662ca4..7a37f3bed 100644 --- a/Runtime/Collision/CMaterialFilter.cpp +++ b/Runtime/Collision/CMaterialFilter.cpp @@ -1,6 +1,5 @@ #include "Runtime/Collision/CMaterialFilter.hpp" namespace urde { -const CMaterialFilter CMaterialFilter::skPassEverything({0x00000000FFFFFFFF}, {0}, - CMaterialFilter::EFilterType::Always); +constexpr CMaterialFilter CMaterialFilter::skPassEverything({0x00000000FFFFFFFF}, {0}, EFilterType::Always); } // namespace urde From c203a0de7c0471b374d76b53befff66eb0a9bb41 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 10:31:05 -0400 Subject: [PATCH 095/224] CGraphics: Mark skCubeBasisMats as constexpr Same behavior, minus potential runtime initializers. --- Runtime/Graphics/CGraphics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Graphics/CGraphics.cpp b/Runtime/Graphics/CGraphics.cpp index 48171d31c..21202380a 100644 --- a/Runtime/Graphics/CGraphics.cpp +++ b/Runtime/Graphics/CGraphics.cpp @@ -35,7 +35,7 @@ SViewport g_Viewport = { }; u32 CGraphics::g_FrameCounter = 0; -const std::array CGraphics::skCubeBasisMats{{ +constexpr std::array CGraphics::skCubeBasisMats{{ /* Right */ {0.f, 1.f, 0.f, 1.f, 0.f, 0.f, 0.f, 0.f, -1.f}, /* Left */ From e0c187c60751cdf6ddf4335254f3a75837421ef9 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 10:35:54 -0400 Subject: [PATCH 096/224] CModelBoo: Make use of std::array where applicable Allows decoding some array sizes. --- Runtime/Graphics/CModelBoo.cpp | 38 ++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/Runtime/Graphics/CModelBoo.cpp b/Runtime/Graphics/CModelBoo.cpp index f40226568..4a40560b1 100644 --- a/Runtime/Graphics/CModelBoo.cpp +++ b/Runtime/Graphics/CModelBoo.cpp @@ -309,29 +309,37 @@ CBooModel::ModelInstance* CBooModel::PushNewModelInstance(int sharedLayoutBuf) { m_uniformDataSize = uniBufSize; newInst.m_uniformBuffer = ctx.newDynamicBuffer(boo::BufferUse::Uniform, uniBufSize, 1); - boo::ObjToken bufs[] = {geomUniformBuf.get(), geomUniformBuf.get(), - newInst.m_uniformBuffer.get(), newInst.m_uniformBuffer.get()}; + const std::array, 4> bufs{ + geomUniformBuf.get(), + geomUniformBuf.get(), + newInst.m_uniformBuffer.get(), + newInst.m_uniformBuffer.get(), + }; /* Binding for each surface */ newInst.m_shaderDataBindings.reserve(x0_surfaces->size()); - size_t thisOffs[4]; - size_t thisSizes[4]; + std::array thisOffs; + std::array thisSizes; - static const boo::PipelineStage stages[4] = {boo::PipelineStage::Vertex, boo::PipelineStage::Vertex, - boo::PipelineStage::Fragment, boo::PipelineStage::Vertex}; + static constexpr std::array stages{ + boo::PipelineStage::Vertex, + boo::PipelineStage::Vertex, + boo::PipelineStage::Fragment, + boo::PipelineStage::Vertex, + }; /* Enumerate surfaces and build data bindings */ size_t curReflect = reflectOff + 256; for (const CBooSurface& surf : *x0_surfaces) { const MaterialSet::Material& mat = x4_matSet->materials.at(surf.m_data.matIdx); - boo::ObjToken texs[12] = {g_Renderer->m_clearTexture.get(), g_Renderer->m_clearTexture.get(), - g_Renderer->m_clearTexture.get(), g_Renderer->m_clearTexture.get(), - g_Renderer->m_clearTexture.get(), g_Renderer->m_clearTexture.get(), - g_Renderer->m_clearTexture.get(), g_Renderer->m_clearTexture.get(), - g_Renderer->x220_sphereRamp.get(), g_Renderer->x220_sphereRamp.get(), - g_Renderer->x220_sphereRamp.get(), g_Renderer->x220_sphereRamp.get()}; + std::array, 12> texs{ + g_Renderer->m_clearTexture.get(), g_Renderer->m_clearTexture.get(), g_Renderer->m_clearTexture.get(), + g_Renderer->m_clearTexture.get(), g_Renderer->m_clearTexture.get(), g_Renderer->m_clearTexture.get(), + g_Renderer->m_clearTexture.get(), g_Renderer->m_clearTexture.get(), g_Renderer->x220_sphereRamp.get(), + g_Renderer->x220_sphereRamp.get(), g_Renderer->x220_sphereRamp.get(), g_Renderer->x220_sphereRamp.get(), + }; if (!g_DummyTextures) { for (const auto& ch : mat.chunks) { if (auto pass = ch.get_if()) { @@ -401,9 +409,9 @@ CBooModel::ModelInstance* CBooModel::PushNewModelInstance(int sharedLayoutBuf) { else texs[11] = g_Renderer->x220_sphereRamp.get(); } - extendeds.push_back(ctx.newShaderDataBinding(pipeline, newInst.GetBooVBO(*this, ctx), nullptr, - m_staticIbo.get(), 4, bufs, stages, thisOffs, thisSizes, 12, texs, - nullptr, nullptr)); + extendeds.push_back(ctx.newShaderDataBinding( + pipeline, newInst.GetBooVBO(*this, ctx), nullptr, m_staticIbo.get(), bufs.size(), bufs.data(), + stages.data(), thisOffs.data(), thisSizes.data(), texs.size(), texs.data(), nullptr, nullptr)); idx = EExtendedShader(size_t(idx) + 1); } } From 3efc8486a42d795772502163fde7f3bc21d45319 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 10:39:00 -0400 Subject: [PATCH 097/224] CColoredQuadFilter: Mark DefaultRect as constexpr Same behavior, minus runtime initializers. --- Runtime/Graphics/Shaders/CColoredQuadFilter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Graphics/Shaders/CColoredQuadFilter.cpp b/Runtime/Graphics/Shaders/CColoredQuadFilter.cpp index 0e51076ec..9628ba8b0 100644 --- a/Runtime/Graphics/Shaders/CColoredQuadFilter.cpp +++ b/Runtime/Graphics/Shaders/CColoredQuadFilter.cpp @@ -115,6 +115,6 @@ void CWideScreenFilter::SetViewportToFull() { CGraphics::g_BooMainCommandQueue->setViewport(rect); } -const zeus::CRectangle CColoredQuadFilter::DefaultRect = {0.f, 0.f, 1.f, 1.f}; +constexpr zeus::CRectangle CColoredQuadFilter::DefaultRect{0.f, 0.f, 1.f, 1.f}; } // namespace urde From aee2259972f45d44547b074a0b88d6c81f4fe069 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 10:40:34 -0400 Subject: [PATCH 098/224] CTexturedQuadFilter: Mark DefaultRect as constexpr Same behavior, minus runtime initializers. --- Runtime/Graphics/Shaders/CTexturedQuadFilter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Graphics/Shaders/CTexturedQuadFilter.cpp b/Runtime/Graphics/Shaders/CTexturedQuadFilter.cpp index a9a1be609..a9a9f78e3 100644 --- a/Runtime/Graphics/Shaders/CTexturedQuadFilter.cpp +++ b/Runtime/Graphics/Shaders/CTexturedQuadFilter.cpp @@ -322,7 +322,7 @@ void CTexturedQuadFilter::DrawFilter(EFilterShape shape, const zeus::CColor& col } } -const zeus::CRectangle CTexturedQuadFilter::DefaultRect = {0.f, 0.f, 1.f, 1.f}; +constexpr zeus::CRectangle CTexturedQuadFilter::DefaultRect{0.f, 0.f, 1.f, 1.f}; CTexturedQuadFilterAlpha::CTexturedQuadFilterAlpha(EFilterType type, const boo::ObjToken& tex) : CTexturedQuadFilter(tex) { From c296f0ab8fc393a34103cac637642e20c8ab9a83 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 10:52:01 -0400 Subject: [PATCH 099/224] CInventoryScreen: Make use of std::array where applicable Same behavior, stronger typing. --- Runtime/MP1/CInventoryScreen.cpp | 64 ++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 28 deletions(-) diff --git a/Runtime/MP1/CInventoryScreen.cpp b/Runtime/MP1/CInventoryScreen.cpp index cdc4d1a36..cddddfa89 100644 --- a/Runtime/MP1/CInventoryScreen.cpp +++ b/Runtime/MP1/CInventoryScreen.cpp @@ -1,5 +1,7 @@ #include "Runtime/MP1/CInventoryScreen.hpp" +#include + #include "Runtime/GameGlobalObjects.hpp" #include "Runtime/GuiSys/CGuiModel.hpp" #include "Runtime/GuiSys/CGuiTableGroup.hpp" @@ -7,55 +9,60 @@ #include "Runtime/Input/ControlMapper.hpp" namespace urde::MP1 { - +namespace { struct SInventoryItem { u32 idx; u32 nameStrIdx; u32 entryStrIdx; }; -static const SInventoryItem ArmCannonItems[] = { +constexpr std::array ArmCannonItems{{ {0, 0x24, 0x46}, // Power Beam {1, 0x25, 0x48}, // Ice Beam {2, 0x26, 0x4a}, // Wave Beam {3, 0x27, 0x4c}, // Plasma Beam {4, 0x28, 0x4e}, // Phazon Beam -}; +}}; -static const SInventoryItem MorphballItems[] = { +constexpr std::array MorphballItems{{ {5, 0x2e, 0x57}, // Morph Ball {6, 0x2f, 0x58}, // Boost Ball {7, 0x30, 0x59}, // Spider Ball {8, 0x31, 0x5a}, // Morph Ball Bomb {9, 0x32, 0x5b}, // Power Bomb -}; +}}; -static const SInventoryItem SuitItems[] = { +constexpr std::array SuitItems{{ {10, 0x33, 0x52}, // Power Suit {11, 0x34, 0x53}, // Varia Suit {12, 0x35, 0x54}, // Gravity Suit {13, 0x36, 0x55}, // Phazon Suit {14, 0x37, 0x56}, // Energy Tank -}; +}}; -static const SInventoryItem VisorItems[] = { +constexpr std::array VisorItems{{ {15, 0x38, 0x42}, // Combat Visor {16, 0x39, 0x43}, // Scan Visor {17, 0x3a, 0x44}, // X-Ray Visor {18, 0x3b, 0x45}, // Thermal Visor -}; +}}; -static const SInventoryItem SecondaryItems[] = { +constexpr std::array SecondaryItems{{ {19, 0x3c, 0x4f}, // Space Jump Boots {20, 0x3d, 0x50}, // Grapple Beam {21, 0x3e, 0x51}, // Missile Launcher {22, 0x3f, 0x5c}, // Charge Beam {23, 0x40, 0x5d}, // Beam Combo -}; +}}; -static const std::pair InventoryRegistry[] = { - {5, ArmCannonItems}, {5, MorphballItems}, {5, SuitItems}, {4, VisorItems}, {5, SecondaryItems}, -}; +constexpr std::array, 5> InventoryRegistry{{ + {ArmCannonItems.size(), ArmCannonItems.data()}, + {MorphballItems.size(), MorphballItems.data()}, + {SuitItems.size(), SuitItems.data()}, + {VisorItems.size(), VisorItems.data()}, + {SecondaryItems.size(), SecondaryItems.data()}, +}}; +} // Anonymous namespace CInventoryScreen::CInventoryScreen(const CStateManager& mgr, CGuiFrame& frame, const CStringTable& pauseStrg, const CDependencyGroup& suitDgrp, const CDependencyGroup& ballDgrp) @@ -437,14 +444,14 @@ bool CInventoryScreen::IsRightInventoryItemEquipped(int idx) const { void CInventoryScreen::UpdateRightTable() { CPauseScreenBase::UpdateRightTable(); - const std::pair& category = InventoryRegistry[x70_tablegroup_leftlog->GetUserSelection()]; + const auto& [size, data] = InventoryRegistry[x70_tablegroup_leftlog->GetUserSelection()]; int minSel = INT_MAX; for (int i = 0; i < 5; ++i) { CGuiTextPane* title = xd8_textpane_titles[i]; - if (i < category.first) { - if (HasRightInventoryItem(category.second[i].idx)) { - title->TextSupport().SetText(xc_pauseStrg.GetString(category.second[i].nameStrIdx)); + if (i < int(size)) { + if (HasRightInventoryItem(data[i].idx)) { + title->TextSupport().SetText(xc_pauseStrg.GetString(data[i].nameStrIdx)); x84_tablegroup_rightlog->GetWorkerWidget(i + 1)->SetIsSelectable(true); if (i < minSel) minSel = i; @@ -476,7 +483,7 @@ bool CInventoryScreen::ShouldRightTableAdvance() const { } u32 CInventoryScreen::GetRightTableCount() const { - return InventoryRegistry[x70_tablegroup_leftlog->GetUserSelection()].first; + return u32(InventoryRegistry[x70_tablegroup_leftlog->GetUserSelection()].first); } bool CInventoryScreen::IsRightLogDynamic() const { return true; } @@ -484,9 +491,9 @@ bool CInventoryScreen::IsRightLogDynamic() const { return true; } void CInventoryScreen::UpdateRightLogColors(bool active, const zeus::CColor& activeColor, const zeus::CColor& inactiveColor) { x80_basewidget_rightlog->SetColor(active ? zeus::skWhite : zeus::CColor(1.f, 0.71f)); - const std::pair& cat = InventoryRegistry[x70_tablegroup_leftlog->GetUserSelection()]; + const auto& [size, data] = InventoryRegistry[x70_tablegroup_leftlog->GetUserSelection()]; for (u32 i = 0; i < 5; ++i) { - if (i < cat.first && IsRightInventoryItemEquipped(cat.second[i].idx)) { + if (i < size && IsRightInventoryItemEquipped(data[i].idx)) { x15c_model_righttitledecos[i]->SetColor(g_tweakGuiColors->GetPauseItemBlueColor()); xd8_textpane_titles[i]->TextSupport().SetFontColor(g_tweakGuiColors->GetPauseItemBlueColor()); } else { @@ -498,16 +505,17 @@ void CInventoryScreen::UpdateRightLogColors(bool active, const zeus::CColor& act void CInventoryScreen::UpdateRightLogHighlight(bool active, int idx, const zeus::CColor& activeColor, const zeus::CColor& inactiveColor) { - zeus::CColor actColor = g_tweakGuiColors->GetPauseItemAmberColor() * activeColor; - zeus::CColor inactColor = g_tweakGuiColors->GetPauseItemAmberColor() * inactiveColor; + const zeus::CColor actColor = g_tweakGuiColors->GetPauseItemAmberColor() * activeColor; + const zeus::CColor inactColor = g_tweakGuiColors->GetPauseItemAmberColor() * inactiveColor; - const std::pair& cat = InventoryRegistry[x70_tablegroup_leftlog->GetUserSelection()]; - for (u32 i = 0; i < 5; ++i) { - bool act = i == idx && active; - if (i < cat.first && IsRightInventoryItemEquipped(cat.second[i].idx) && act) + const auto& [size, data] = InventoryRegistry[x70_tablegroup_leftlog->GetUserSelection()]; + for (s32 i = 0; i < 5; ++i) { + const bool act = i == idx && active; + if (i < int(size) && IsRightInventoryItemEquipped(data[i].idx) && act) { x8c_model_righthighlight->SetColor(g_tweakGuiColors->GetPauseItemBlueColor()); - else if (act) + } else if (act) { x8c_model_righthighlight->SetColor(actColor); + } x144_model_titles[i]->SetColor(act ? actColor : inactColor); } } From eba3270c145d143975d9e93196db2037e9043faa Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 10:55:22 -0400 Subject: [PATCH 100/224] CMFGame: Make use of std::array where applicable --- Runtime/MP1/CMFGame.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Runtime/MP1/CMFGame.cpp b/Runtime/MP1/CMFGame.cpp index 1691b80f7..81d422198 100644 --- a/Runtime/MP1/CMFGame.cpp +++ b/Runtime/MP1/CMFGame.cpp @@ -1,5 +1,7 @@ #include "Runtime/MP1/CMFGame.hpp" +#include + #include "Runtime/CArchitectureQueue.hpp" #include "Runtime/MP1/CSamusHud.hpp" #include "Runtime/MP1/MP1.hpp" @@ -286,16 +288,18 @@ CMFGameLoader::CMFGameLoader() CMFGameLoader::~CMFGameLoader() = default; -static const char* LoadDepPAKs[] = {"TestAnim", "SamusGun", "SamGunFx", nullptr}; - void CMFGameLoader::MakeLoadDependencyList() { + static constexpr std::array loadDepPAKs{"TestAnim", "SamusGun", "SamGunFx"}; + std::vector tags; - for (int i = 0; LoadDepPAKs[i]; ++i) - g_ResFactory->GetTagListForFile(LoadDepPAKs[i], tags); + for (const auto pak : loadDepPAKs) { + g_ResFactory->GetTagListForFile(pak, tags); + } x1c_loadList.reserve(tags.size()); - for (const SObjectTag& tag : tags) + for (const SObjectTag& tag : tags) { x1c_loadList.push_back(g_SimplePool->GetObj(tag)); + } } CIOWin::EMessageReturn CMFGameLoader::OnMessage(const CArchitectureMessage& msg, CArchitectureQueue& queue) { From f1aca12e6b3a7519882916168364a27f6e5afdcf Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 10:59:03 -0400 Subject: [PATCH 101/224] CQuitGameScreen: Make use of std::array where applicable Same behavior, but more strongly typed and without any implicit array to pointer decay. --- Runtime/MP1/CQuitGameScreen.cpp | 35 +++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/Runtime/MP1/CQuitGameScreen.cpp b/Runtime/MP1/CQuitGameScreen.cpp index 4a364c0f9..a51d63fe1 100644 --- a/Runtime/MP1/CQuitGameScreen.cpp +++ b/Runtime/MP1/CQuitGameScreen.cpp @@ -1,5 +1,7 @@ #include "Runtime/MP1/CQuitGameScreen.hpp" +#include + #include "Runtime/GameGlobalObjects.hpp" #include "Runtime/CSimplePool.hpp" #include "Runtime/Audio/CSfxManager.hpp" @@ -14,11 +16,11 @@ namespace urde::MP1 { -static const int Titles[] = {24, 25, 26, 27, 28}; +constexpr std::array Titles{24, 25, 26, 27, 28}; -static const int DefaultSelections[] = {1, 0, 1, 1, 0}; +constexpr std::array DefaultSelections{1, 0, 1, 1, 0}; -static const float VerticalOffsets[] = {0.f, 1.6f, 1.f, 0.f, 1.f}; +constexpr std::array VerticalOffsets{0.f, 1.6f, 1.f, 0.f, 1.f}; void CQuitGameScreen::SetColors() { x14_tablegroup_quitgame->SetColors(zeus::CColor{0.784313f, 0.784313f, 0.784313f, 1.f}, @@ -37,7 +39,7 @@ void CQuitGameScreen::FinishedLoading() { static_cast(x10_loadedFrame->FindWidget("textpane_title")) ->TextSupport() - .SetText(g_MainStringTable->GetString(Titles[int(x0_type)])); + .SetText(g_MainStringTable->GetString(Titles[size_t(x0_type)])); static_cast(x10_loadedFrame->FindWidget("textpane_yes")) ->TextSupport() @@ -46,7 +48,7 @@ void CQuitGameScreen::FinishedLoading() { ->TextSupport() .SetText(g_MainStringTable->GetString(23)); - x14_tablegroup_quitgame->SetUserSelection(DefaultSelections[int(x0_type)]); + x14_tablegroup_quitgame->SetUserSelection(DefaultSelections[size_t(x0_type)]); x14_tablegroup_quitgame->SetWorkersMouseActive(true); x10_loadedFrame->SetMouseUpCallback([this](CGuiWidget* widget, bool cancel) { OnWidgetMouseUp(widget, cancel); }); SetColors(); @@ -83,23 +85,30 @@ EQuitAction CQuitGameScreen::Update(float dt) { void CQuitGameScreen::Draw() { SCOPED_GRAPHICS_DEBUG_GROUP("CQuitGameScreen::Draw", zeus::skPurple); - if (x0_type == EQuitType::QuitGame) + if (x0_type == EQuitType::QuitGame) { m_blackScreen->draw(zeus::CColor(0.f, 0.5f)); + } - if (x10_loadedFrame) - x10_loadedFrame->Draw(CGuiWidgetDrawParms{1.f, zeus::CVector3f{0.f, 0.f, VerticalOffsets[int(x0_type)]}}); + if (x10_loadedFrame) { + x10_loadedFrame->Draw(CGuiWidgetDrawParms{1.f, zeus::CVector3f{0.f, 0.f, VerticalOffsets[size_t(x0_type)]}}); + } } void CQuitGameScreen::ProcessUserInput(const CFinalInput& input) { - if (input.ControllerIdx() != 0) + if (input.ControllerIdx() != 0) { return; - if (!x10_loadedFrame) + } + + if (!x10_loadedFrame) { return; - x10_loadedFrame->ProcessMouseInput(input, - CGuiWidgetDrawParms{1.f, zeus::CVector3f{0.f, 0.f, VerticalOffsets[int(x0_type)]}}); + } + + x10_loadedFrame->ProcessMouseInput( + input, CGuiWidgetDrawParms{1.f, zeus::CVector3f{0.f, 0.f, VerticalOffsets[size_t(x0_type)]}}); x10_loadedFrame->ProcessUserInput(input); - if ((input.PB() || input.PSpecialKey(boo::ESpecialKey::Esc)) && x0_type != EQuitType::ContinueFromLastSave) + if ((input.PB() || input.PSpecialKey(boo::ESpecialKey::Esc)) && x0_type != EQuitType::ContinueFromLastSave) { x18_action = EQuitAction::No; + } } CQuitGameScreen::CQuitGameScreen(EQuitType tp) : x0_type(tp) { From abd576a43aefb2c4cb5c077c247ea48595bfddbc Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 11:03:47 -0400 Subject: [PATCH 102/224] CBabygoth: Make use of std::array where applicable Same behavior, no implicit array to pointer decay. We can also move all this data into the cpp file fully. --- Runtime/MP1/World/CBabygoth.cpp | 23 +++++++++++++++-------- Runtime/MP1/World/CBabygoth.hpp | 5 +---- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Runtime/MP1/World/CBabygoth.cpp b/Runtime/MP1/World/CBabygoth.cpp index 775fa57ee..d021b159d 100644 --- a/Runtime/MP1/World/CBabygoth.cpp +++ b/Runtime/MP1/World/CBabygoth.cpp @@ -1,5 +1,7 @@ #include "Runtime/MP1/World/CBabygoth.hpp" +#include + #include "Runtime/CSimplePool.hpp" #include "Runtime/CStateManager.hpp" #include "Runtime/GameGlobalObjects.hpp" @@ -21,7 +23,15 @@ #include "TCastTo.hpp" // Generated file, do not modify include path namespace urde::MP1 { -const std::string_view CBabygoth::skpMouthDamageJoint = "LCTR_SHEMOUTH"sv; +constexpr std::string_view skpMouthDamageJoint = "LCTR_SHEMOUTH"sv; + +constexpr std::array skSphereJointList{{ + {"L_knee", 1.2f}, + {"R_knee", 1.2f}, + {"LCTR_SHEMOUTH", 1.7f}, + {"Pelvis", 1.2f}, + {"butt_LCTR", 0.9f}, +}}; CBabygothData::CBabygothData(CInputStream& in) : x0_fireballAttackTime(in.readFloatBig()) @@ -298,13 +308,10 @@ void CBabygoth::DoUserAnimEvent(CStateManager& mgr, const CInt32POINode& node, E CPatterned::DoUserAnimEvent(mgr, node, type, dt); } -const SSphereJointInfo CBabygoth::skSphereJointList[skSphereJointCount] = { - {"L_knee", 1.2f}, {"R_knee", 1.2f}, {"LCTR_SHEMOUTH", 1.7f}, {"Pelvis", 1.2f}, {"butt_LCTR", 0.9f}}; - -void CBabygoth::AddSphereCollisionList(const SSphereJointInfo* sphereJointInfo, s32 jointCount, +void CBabygoth::AddSphereCollisionList(const SSphereJointInfo* sphereJointInfo, size_t jointCount, std::vector& jointList) { - for (s32 i = 0; i < jointCount; ++i) { - CSegId seg = GetModelData()->GetAnimationData()->GetLocatorSegId(sphereJointInfo[i].name); + for (size_t i = 0; i < jointCount; ++i) { + const CSegId seg = GetModelData()->GetAnimationData()->GetLocatorSegId(sphereJointInfo[i].name); jointList.push_back( CJointCollisionDescription::SphereCollision(seg, sphereJointInfo[i].radius, sphereJointInfo[i].name, 1000.f)); } @@ -312,7 +319,7 @@ void CBabygoth::AddSphereCollisionList(const SSphereJointInfo* sphereJointInfo, void CBabygoth::SetupCollisionManager(CStateManager& mgr) { std::vector joints; - AddSphereCollisionList(skSphereJointList, skSphereJointCount, joints); + AddSphereCollisionList(skSphereJointList.data(), skSphereJointList.size(), joints); x928_colActMgr = std::make_unique(mgr, GetUniqueId(), GetAreaIdAlways(), joints, false); x928_colActMgr->SetActive(mgr, GetActive()); diff --git a/Runtime/MP1/World/CBabygoth.hpp b/Runtime/MP1/World/CBabygoth.hpp index a39674db2..0a8159faf 100644 --- a/Runtime/MP1/World/CBabygoth.hpp +++ b/Runtime/MP1/World/CBabygoth.hpp @@ -63,9 +63,6 @@ public: enum class EShellState { Default, CrackOne, CrackTwo, Destroyed }; private: - static constexpr s32 skSphereJointCount = 5; - static const SSphereJointInfo skSphereJointList[skSphereJointCount]; - static const std::string_view skpMouthDamageJoint; s32 x568_stateProg = -1; EShellState x56c_shellState = EShellState::Default; CBabygothData x570_babyData; @@ -115,7 +112,7 @@ private: bool xa49_28_onApproachPath : 1; bool xa49_29_objectSpaceCollision : 1; - void AddSphereCollisionList(const SSphereJointInfo*, s32, std::vector&); + void AddSphereCollisionList(const SSphereJointInfo*, size_t, std::vector&); void SetupCollisionManager(CStateManager&); From bfea80fc4ac086ad74b8ba22b0e2ae64213eb5ad Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 11:05:54 -0400 Subject: [PATCH 103/224] CBabygoth: Mark IsDestinationObstructed() as const This doesn't alter class state, so we can mark it as const. --- Runtime/MP1/World/CBabygoth.cpp | 9 +++++---- Runtime/MP1/World/CBabygoth.hpp | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Runtime/MP1/World/CBabygoth.cpp b/Runtime/MP1/World/CBabygoth.cpp index d021b159d..12c1d1aeb 100644 --- a/Runtime/MP1/World/CBabygoth.cpp +++ b/Runtime/MP1/World/CBabygoth.cpp @@ -1103,12 +1103,13 @@ bool CBabygoth::Leash(CStateManager& mgr, float) { return false; } -bool CBabygoth::IsDestinationObstructed(CStateManager& mgr) { - for (CEntity* obj : mgr.GetListeningAiObjectList()) { - if (TCastToPtr ai = obj) { +bool CBabygoth::IsDestinationObstructed(const CStateManager& mgr) const { + for (const CEntity* obj : mgr.GetListeningAiObjectList()) { + if (const TCastToConstPtr ai = obj) { if (ai->GetAreaIdAlways() == GetAreaIdAlways()) { - if ((x8b8_backupDestPos - ai->GetTranslation()).magSquared() <= 10.f) + if ((x8b8_backupDestPos - ai->GetTranslation()).magSquared() <= 10.f) { return true; + } } } } diff --git a/Runtime/MP1/World/CBabygoth.hpp b/Runtime/MP1/World/CBabygoth.hpp index 0a8159faf..fec7ec593 100644 --- a/Runtime/MP1/World/CBabygoth.hpp +++ b/Runtime/MP1/World/CBabygoth.hpp @@ -160,7 +160,7 @@ private: void UpdateShellHealth(CStateManager&); - bool IsDestinationObstructed(CStateManager&); + bool IsDestinationObstructed(const CStateManager& mgr) const; void DestroyShell(CStateManager& mgr); From f5418d30aae2f6cbd0a0d9a475fc60548bd2ef7b Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 11:08:18 -0400 Subject: [PATCH 104/224] CEyeBall: Move string_view instance to cpp file Same behavior, but gives the string full internal linkage. --- Runtime/MP1/World/CEyeball.cpp | 2 ++ Runtime/MP1/World/CEyeball.hpp | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Runtime/MP1/World/CEyeball.cpp b/Runtime/MP1/World/CEyeball.cpp index 521c88b4b..7fd687e17 100644 --- a/Runtime/MP1/World/CEyeball.cpp +++ b/Runtime/MP1/World/CEyeball.cpp @@ -11,6 +11,8 @@ #include "TCastTo.hpp" // Generated file, do not modify include path namespace urde::MP1 { +constexpr std::string_view skEyeLocator = "Laser_LCTR"sv; + CEyeball::CEyeball(TUniqueId uid, std::string_view name, CPatterned::EFlavorType flavor, const CEntityInfo& info, const zeus::CTransform& xf, CModelData&& mData, const CPatternedInfo& pInfo, float attackDelay, float attackStartTime, CAssetId wpscId, const CDamageInfo& dInfo, CAssetId beamContactFxId, diff --git a/Runtime/MP1/World/CEyeball.hpp b/Runtime/MP1/World/CEyeball.hpp index c0e698729..a7fa3699c 100644 --- a/Runtime/MP1/World/CEyeball.hpp +++ b/Runtime/MP1/World/CEyeball.hpp @@ -11,7 +11,6 @@ namespace urde::MP1 { class CEyeball : public CPatterned { - static constexpr std::string_view skEyeLocator = "Laser_LCTR"sv; float x568_attackDelay; float x56c_attackStartTime; CBoneTracking x570_boneTracking; From 02a684cfdffa70a43cf149eb5396a0c6601a0134 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 11:14:00 -0400 Subject: [PATCH 105/224] CFlaahgra: Migrate static data into the cpp file Same behavior, but completely makes them internally linked. We can also make use of std::array and dehardcode some array sizes. --- Runtime/MP1/World/CFlaahgra.cpp | 66 +++++++++++++++++++++------------ Runtime/MP1/World/CFlaahgra.hpp | 11 +----- 2 files changed, 44 insertions(+), 33 deletions(-) diff --git a/Runtime/MP1/World/CFlaahgra.cpp b/Runtime/MP1/World/CFlaahgra.cpp index 9d0ece782..8df1d39ac 100644 --- a/Runtime/MP1/World/CFlaahgra.cpp +++ b/Runtime/MP1/World/CFlaahgra.cpp @@ -22,14 +22,29 @@ #include "TCastTo.hpp" // Generated file, do not modify include path namespace urde::MP1 { +constexpr zeus::CColor skDamageColor{0.5f, 0.5f, 0.f, 1.f}; +constexpr zeus::CColor skUnkColor{0.5f, 0.f, 0.f, 1.f}; +constexpr zeus::CVector3f skUnkVec1{0.5f, 7.f, 0.f}; -const SJointInfo CFlaahgra::skLeftArmJointList[3]{ - {"L_elbow", "L_blade", 0.6f, 1.f}, {"L_blade", "L_claw", 0.6f, 1.f}, {"L_CLAW_LCTR", "L_CLAW_END_LCTR", 0.6f, 1.f}}; +constexpr std::array skLeftArmJointList{{ + {"L_elbow", "L_blade", 0.6f, 1.f}, + {"L_blade", "L_claw", 0.6f, 1.f}, + {"L_CLAW_LCTR", "L_CLAW_END_LCTR", 0.6f, 1.f}, +}}; -const SJointInfo CFlaahgra::skRightArmJointList[3]{ - {"R_elbow", "R_blade", 0.6f, 1.f}, {"R_blade", "R_claw", 0.6f, 1.f}, {"R_CLAW_LCTR", "R_CLAW_END_LCTR", 0.6f, 1.f}}; -const SSphereJointInfo CFlaahgra::skSphereJointList[5]{ - {"Head_1", 1.5f}, {"Spine_2", 1.5f}, {"Spine_4", 1.5f}, {"Spine_6", 1.5f}, {"Collar", 1.5f}}; +constexpr std::array skRightArmJointList{{ + {"R_elbow", "R_blade", 0.6f, 1.f}, + {"R_blade", "R_claw", 0.6f, 1.f}, + {"R_CLAW_LCTR", "R_CLAW_END_LCTR", 0.6f, 1.f}, +}}; + +constexpr std::array skSphereJointList{{ + {"Head_1", 1.5f}, + {"Spine_2", 1.5f}, + {"Spine_4", 1.5f}, + {"Spine_6", 1.5f}, + {"Collar", 1.5f}, +}}; CFlaahgraData::CFlaahgraData(CInputStream& in) : x0_(in.readFloatBig()) @@ -444,11 +459,11 @@ void CFlaahgra::GetMirrorWaypoints(CStateManager& mgr) { } } -void CFlaahgra::AddCollisionList(const SJointInfo* joints, int count, +void CFlaahgra::AddCollisionList(const SJointInfo* joints, size_t count, std::vector& outJoints) { const CAnimData* animData = GetModelData()->GetAnimationData(); - for (s32 i = 0; i < count; ++i) { + for (size_t i = 0; i < count; ++i) { const auto& joint = joints[i]; const CSegId from = animData->GetLocatorSegId(joint.from); const CSegId to = animData->GetLocatorSegId(joint.to); @@ -462,11 +477,11 @@ void CFlaahgra::AddCollisionList(const SJointInfo* joints, int count, } } -void CFlaahgra::AddSphereCollisionList(const SSphereJointInfo* joints, int count, +void CFlaahgra::AddSphereCollisionList(const SSphereJointInfo* joints, size_t count, std::vector& outJoints) { const CAnimData* animData = GetModelData()->GetAnimationData(); - for (s32 i = 0; i < count; ++i) { + for (size_t i = 0; i < count; ++i) { const auto& joint = joints[i]; const CSegId seg = animData->GetLocatorSegId(joint.name); @@ -499,20 +514,20 @@ void CFlaahgra::SetupHealthInfo(CStateManager& mgr) { void CFlaahgra::SetupCollisionManagers(CStateManager& mgr) { std::vector leftArmjointList; zeus::CVector3f oldScale = GetModelData()->GetScale(); - leftArmjointList.reserve(3); - AddCollisionList(skLeftArmJointList, 3, leftArmjointList); + leftArmjointList.reserve(skLeftArmJointList.size()); + AddCollisionList(skLeftArmJointList.data(), skLeftArmJointList.size(), leftArmjointList); x79c_leftArmCollision = std::make_unique(mgr, GetUniqueId(), GetAreaIdAlways(), leftArmjointList, true); SetMaterialProperties(x79c_leftArmCollision, mgr); std::vector rightArmJointList; - rightArmJointList.reserve(3); - AddCollisionList(skRightArmJointList, 3, rightArmJointList); + rightArmJointList.reserve(skRightArmJointList.size()); + AddCollisionList(skRightArmJointList.data(), skRightArmJointList.size(), rightArmJointList); x7a0_rightArmCollision = std::make_unique(mgr, GetUniqueId(), GetAreaIdAlways(), rightArmJointList, true); SetMaterialProperties(x7a0_rightArmCollision, mgr); std::vector sphereJointList; - sphereJointList.reserve(5); - AddSphereCollisionList(skSphereJointList, 5, sphereJointList); + sphereJointList.reserve(skSphereJointList.size()); + AddSphereCollisionList(skSphereJointList.data(), skSphereJointList.size(), sphereJointList); x7a4_sphereCollision = std::make_unique(mgr, GetUniqueId(), GetAreaIdAlways(), sphereJointList, true); SetMaterialProperties(x7a4_sphereCollision, mgr); @@ -872,7 +887,8 @@ void CFlaahgra::RattlePlayer(CStateManager& mgr, const zeus::CVector3f& vec) { } void CFlaahgra::Faint(CStateManager& mgr, EStateMsg msg, float arg) { - static const pas::ESeverity kSeverities[2]{pas::ESeverity::Zero, pas::ESeverity::One}; + static constexpr std::array kSeverities{pas::ESeverity::Zero, pas::ESeverity::One}; + if (msg == EStateMsg::Activate) { x568_ = 0; x7d4_ = 0.f; @@ -881,7 +897,7 @@ void CFlaahgra::Faint(CStateManager& mgr, EStateMsg msg, float arg) { SendScriptMsgs(EScriptObjectState::Entered, mgr, EScriptObjectMessage::None); SendScriptMsgs(EScriptObjectState::Retreat, mgr, EScriptObjectMessage::None); x450_bodyController->GetCommandMgr().DeliverCmd( - CBCKnockDownCmd(-GetTransform().frontVector(), kSeverities[u32(x7ac_)])); + CBCKnockDownCmd(-GetTransform().frontVector(), kSeverities[size_t(x7ac_)])); } else if (msg == EStateMsg::Update) { if (x568_ == 0) { if (x450_bodyController->GetBodyStateInfo().GetCurrentStateId() == pas::EAnimationState::Fall) { @@ -890,7 +906,7 @@ void CFlaahgra::Faint(CStateManager& mgr, EStateMsg msg, float arg) { UpdateHeadDamageVulnerability(mgr, true); } else { x450_bodyController->GetCommandMgr().DeliverCmd( - CBCKnockDownCmd(-GetTransform().frontVector(), kSeverities[u32(x7ac_)])); + CBCKnockDownCmd(-GetTransform().frontVector(), kSeverities[size_t(x7ac_)])); } } else if (x568_ == 2) { if (x450_bodyController->GetBodyStateInfo().GetCurrentStateId() == pas::EAnimationState::LieOnGround) { @@ -942,12 +958,14 @@ void CFlaahgra::Dead(CStateManager& mgr, EStateMsg msg, float) { } } -static const pas::ESeverity kStates1[5]{pas::ESeverity::Invalid, pas::ESeverity::Invalid, pas::ESeverity::Invalid, - pas::ESeverity::Two, pas::ESeverity::Invalid}; - void CFlaahgra::Attack(CStateManager& mgr, EStateMsg msg, float arg) { - static const pas::ESeverity kSeverity[5]{pas::ESeverity::Three, pas::ESeverity::Four, pas::ESeverity::One, - pas::ESeverity::Zero, pas::ESeverity::Invalid}; + static constexpr std::array kStates1{ + pas::ESeverity::Invalid, pas::ESeverity::Invalid, pas::ESeverity::Invalid, + pas::ESeverity::Two, pas::ESeverity::Invalid, + }; + static constexpr std::array kSeverity{ + pas::ESeverity::Three, pas::ESeverity::Four, pas::ESeverity::One, pas::ESeverity::Zero, pas::ESeverity::Invalid, + }; if (msg == EStateMsg::Activate) { x568_ = 0; diff --git a/Runtime/MP1/World/CFlaahgra.hpp b/Runtime/MP1/World/CFlaahgra.hpp index b8f0e32d0..24bbfcd20 100644 --- a/Runtime/MP1/World/CFlaahgra.hpp +++ b/Runtime/MP1/World/CFlaahgra.hpp @@ -86,13 +86,6 @@ public: }; class CFlaahgra : public CPatterned { - - static const SJointInfo skLeftArmJointList[3]; - static const SJointInfo skRightArmJointList[3]; - static const SSphereJointInfo skSphereJointList[5]; - static constexpr zeus::CColor skDamageColor = zeus::CColor(0.5f, 0.5f, 0.f, 1.f); - static constexpr zeus::CColor skUnkColor = zeus::CColor(0.5f, 0.f, 0.f, 1.f); - static constexpr zeus::CVector3f skUnkVec1 = zeus::CVector3f(0.5f, 7.f, 0.f); s32 x568_ = -1; CFlaahgraData x56c_; std::unique_ptr x6cc_boneTracking; // Used to be an rstl::pair @@ -163,8 +156,8 @@ class CFlaahgra : public CPatterned { void LoadTokens(CStateManager& mgr); void FinalizeLoad(CStateManager& mgr); void GetMirrorWaypoints(CStateManager& mgr); - void AddCollisionList(const SJointInfo*, int, std::vector&); - void AddSphereCollisionList(const SSphereJointInfo*, int, std::vector&); + void AddCollisionList(const SJointInfo*, size_t, std::vector&); + void AddSphereCollisionList(const SSphereJointInfo*, size_t, std::vector&); void SetupCollisionManagers(CStateManager&); void sub801ae980(CStateManager&); void UpdateCollisionManagers(float, CStateManager&); From 23bae06742739bd980059f440c5f7c24d56a116a Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 11:18:55 -0400 Subject: [PATCH 106/224] CNewIntroBoss: Make use of std::array where applicable Same behavior but without implicit array to pointer decay. --- Runtime/MP1/World/CNewIntroBoss.cpp | 41 ++++++++++++++++------------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/Runtime/MP1/World/CNewIntroBoss.cpp b/Runtime/MP1/World/CNewIntroBoss.cpp index 7678f004c..d875b6801 100644 --- a/Runtime/MP1/World/CNewIntroBoss.cpp +++ b/Runtime/MP1/World/CNewIntroBoss.cpp @@ -1,5 +1,7 @@ #include "Runtime/MP1/World/CNewIntroBoss.hpp" +#include + #include "Runtime/CStateManager.hpp" #include "Runtime/Character/CCharLayoutInfo.hpp" #include "Runtime/Collision/CCollisionActor.hpp" @@ -13,6 +15,27 @@ namespace urde::MP1 { +constexpr std::array skSphereJoints{{ + {"Head_1", 1.5f}, + {"Tail_1", 1.5f}, +}}; + +constexpr std::array skOBBJoints{{ + {"Pelvis", "Spine_3", {4.f, 1.f, 4.f}}, + {"Spine_3", "Tail_1", {2.f, 1.f, 2.f}}, + {"Tail_1", "Tail_2", {1.f, 1.f, 1.f}}, + {"Tail_2", "Tail_3", {1.f, 1.f, 1.f}}, + {"Tail_3", "Tail_4", {1.f, 1.f, 1.f}}, + {"R_shoulder_front", "R_elbow_front", {.5f, .5f, .5f}}, + {"R_elbow_front", "R_wrist_front", {.5f, .5f, .5f}}, + {"L_shoulder_front", "L_elbow_front", {.5f, .5f, .5f}}, + {"L_elbow_front", "L_wrist_front", {.5f, .5f, .5f}}, + {"R_shoulder_back", "R_elbow_back", {.5f, .5f, .5f}}, + {"R_elbow_back", "R_wrist_back", {.5f, .5f, .5f}}, + {"L_shoulder_back", "L_elbow_back", {.5f, .5f, .5f}}, + {"L_elbow_back", "L_wrist_back", {.5f, .5f, .5f}}, +}}; + CNewIntroBoss::CNewIntroBoss(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf, CModelData&& mData, const CPatternedInfo& pInfo, const CActorParameters& actParms, float minTurnAngle, CAssetId projectile, const CDamageInfo& dInfo, @@ -35,24 +58,6 @@ CNewIntroBoss::CNewIntroBoss(TUniqueId uid, std::string_view name, const CEntity void CNewIntroBoss::Accept(IVisitor& visitor) { visitor.Visit(this); } -static const SSphereJointInfo skSphereJoints[] = {{"Head_1", 1.5f}, {"Tail_1", 1.5f}}; - -static const SOBBJointInfo skOBBJoints[] = { - {"Pelvis", "Spine_3", {4.f, 1.f, 4.f}}, - {"Spine_3", "Tail_1", {2.f, 1.f, 2.f}}, - {"Tail_1", "Tail_2", {1.f, 1.f, 1.f}}, - {"Tail_2", "Tail_3", {1.f, 1.f, 1.f}}, - {"Tail_3", "Tail_4", {1.f, 1.f, 1.f}}, - {"R_shoulder_front", "R_elbow_front", {.5f, .5f, .5f}}, - {"R_elbow_front", "R_wrist_front", {.5f, .5f, .5f}}, - {"L_shoulder_front", "L_elbow_front", {.5f, .5f, .5f}}, - {"L_elbow_front", "L_wrist_front", {.5f, .5f, .5f}}, - {"R_shoulder_back", "R_elbow_back", {.5f, .5f, .5f}}, - {"R_elbow_back", "R_wrist_back", {.5f, .5f, .5f}}, - {"L_shoulder_back", "L_elbow_back", {.5f, .5f, .5f}}, - {"L_elbow_back", "L_wrist_back", {.5f, .5f, .5f}}, -}; - void CNewIntroBoss::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) { if (msg == EScriptObjectMessage::Registered) { RemoveMaterial(EMaterialTypes::Solid, mgr); From cb857bd737e18f02ccc5b70479b48894ef335d30 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 11:21:06 -0400 Subject: [PATCH 107/224] CSpankWeed: Make use of std::array where applicable Same behavior, but without array to pointer decay. --- Runtime/MP1/World/CSpankWeed.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Runtime/MP1/World/CSpankWeed.cpp b/Runtime/MP1/World/CSpankWeed.cpp index 2bdb9bff0..ba062bb5f 100644 --- a/Runtime/MP1/World/CSpankWeed.cpp +++ b/Runtime/MP1/World/CSpankWeed.cpp @@ -1,5 +1,7 @@ #include "Runtime/MP1/World/CSpankWeed.hpp" +#include + #include "Runtime/CStateManager.hpp" #include "Runtime/Collision/CCollisionActor.hpp" #include "Runtime/World/CPatternedInfo.hpp" @@ -9,6 +11,17 @@ namespace urde::MP1 { logvisor::Module SpankLog("urde::MP1::SpankWeed"); + +constexpr std::array kArmCollision{{ + {"Arm_4", 1.5f}, + {"Arm_6", 1.f}, + {"Arm_7", 1.f}, + {"Arm_8", 1.f}, + {"Arm_9", 1.f}, + {"Arm_11", 1.f}, + {"Swoosh_LCTR", 1.5f}, +}}; + CSpankWeed::CSpankWeed(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf, CModelData&& mData, const CActorParameters& actParms, const CPatternedInfo& pInfo, float maxDetectionRange, float maxHearingRange, float maxSightRange, float hideTime) @@ -48,9 +61,6 @@ CSpankWeed::CSpankWeed(TUniqueId uid, std::string_view name, const CEntityInfo& x460_knockBackController.SetAutoResetImpulse(false); } -static const SSphereJointInfo kArmCollision[] = {{"Arm_4", 1.5f}, {"Arm_6", 1.f}, {"Arm_7", 1.f}, {"Arm_8", 1.f}, - {"Arm_9", 1.f}, {"Arm_11", 1.f}, {"Swoosh_LCTR", 1.5f}}; - void CSpankWeed::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) { bool oldActive = GetActive(); if (msg == EScriptObjectMessage::Activate) { From f74471f603fc660af8740c1e7c59d4c0b455612d Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 11:23:03 -0400 Subject: [PATCH 108/224] CWarWasp: Make use of std::array where applicable Same behavior, no array to pointer decay. --- Runtime/MP1/World/CWarWasp.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Runtime/MP1/World/CWarWasp.cpp b/Runtime/MP1/World/CWarWasp.cpp index 0f5002574..eaddc3e1e 100644 --- a/Runtime/MP1/World/CWarWasp.cpp +++ b/Runtime/MP1/World/CWarWasp.cpp @@ -1,5 +1,7 @@ #include "Runtime/MP1/World/CWarWasp.hpp" +#include + #include "Runtime/CSimplePool.hpp" #include "Runtime/GameGlobalObjects.hpp" #include "Runtime/Character/CCharLayoutInfo.hpp" @@ -883,9 +885,9 @@ float CWarWasp::GetTeamZStratum(s32 team) const { return 0.f; } -static const float Table[] = {0.4f, 0.6f, 1.f}; - float CWarWasp::CalcSeekMagnitude(const CStateManager& mgr) const { + static constexpr std::array Table{0.4f, 0.6f, 1.f}; + const float ret = ((x708_circleAttackTeam >= 0 && x708_circleAttackTeam < 3) ? Table[x708_circleAttackTeam] : 1.f) * 0.9f; if (TCastToConstPtr aimgr = mgr.GetObjectById(x674_aiMgr)) { if (aimgr->IsPartOfTeam(GetUniqueId())) { From 96e3eaf726a7d846aeb1b0465d88b308129f53af Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 11:30:04 -0400 Subject: [PATCH 109/224] CSplashScreen: Make use of std::array where applicable Same behavior, stronger typing. --- Runtime/GuiSys/CSplashScreen.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Runtime/GuiSys/CSplashScreen.cpp b/Runtime/GuiSys/CSplashScreen.cpp index 9c36cd163..f4fd01a50 100644 --- a/Runtime/GuiSys/CSplashScreen.cpp +++ b/Runtime/GuiSys/CSplashScreen.cpp @@ -1,5 +1,7 @@ #include "Runtime/GuiSys/CSplashScreen.hpp" +#include + #include "Runtime/CArchitectureMessage.hpp" #include "Runtime/CArchitectureQueue.hpp" #include "Runtime/CSimplePool.hpp" @@ -8,12 +10,12 @@ namespace urde { -static const char* SplashTextures[]{"TXTR_NintendoLogo", "TXTR_RetroLogo", "TXTR_DolbyLogo"}; +constexpr std::array SplashTextures{"TXTR_NintendoLogo"sv, "TXTR_RetroLogo"sv, "TXTR_DolbyLogo"sv}; CSplashScreen::CSplashScreen(ESplashScreen which) : CIOWin("SplashScreen") , x14_which(which) -, m_quad(EFilterType::Blend, g_SimplePool->GetObj(SplashTextures[int(which)])) {} +, m_quad(EFilterType::Blend, g_SimplePool->GetObj(SplashTextures[size_t(which)])) {} CIOWin::EMessageReturn CSplashScreen::OnMessage(const CArchitectureMessage& msg, CArchitectureQueue& queue) { switch (msg.GetType()) { From b631b5f3a198b99b045f1ca5ed767c4832054fbc Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 11:31:25 -0400 Subject: [PATCH 110/224] CGunWeapon: Mark skShootAnim as constexpr Enforce it as constexpr. The initializer is likely optimized away anyways, given the array only contains primitives, but this is more consistent. --- Runtime/Weapon/CGunWeapon.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Weapon/CGunWeapon.cpp b/Runtime/Weapon/CGunWeapon.cpp index 5a24b9028..1954fd08a 100644 --- a/Runtime/Weapon/CGunWeapon.cpp +++ b/Runtime/Weapon/CGunWeapon.cpp @@ -178,7 +178,7 @@ void CGunWeapon::UpdateGunFx(bool shotSmoke, float dt, const CStateManager& mgr, } } -const std::array CGunWeapon::skShootAnim{4, 3}; +constexpr std::array CGunWeapon::skShootAnim{4, 3}; void CGunWeapon::Fire(bool underwater, float dt, EChargeState chargeState, const zeus::CTransform& xf, CStateManager& mgr, TUniqueId homingTarget, float chargeFactor1, float chargeFactor2) { From a433a7852f0e4c532c5ba47779da995bf82fd7d8 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 11:34:27 -0400 Subject: [PATCH 111/224] CIceBeam/CPhazonBeam: Make use of std::array where applicable Same behavior, stronger typing. --- Runtime/Weapon/CIceBeam.cpp | 8 +++++--- Runtime/Weapon/CPhazonBeam.cpp | 7 ++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Runtime/Weapon/CIceBeam.cpp b/Runtime/Weapon/CIceBeam.cpp index 298a9dc88..4db41a2dc 100644 --- a/Runtime/Weapon/CIceBeam.cpp +++ b/Runtime/Weapon/CIceBeam.cpp @@ -1,5 +1,7 @@ #include "Runtime/Weapon/CIceBeam.hpp" +#include + #include "Runtime/CSimplePool.hpp" #include "Runtime/GameGlobalObjects.hpp" @@ -59,12 +61,12 @@ void CIceBeam::UpdateGunFx(bool shotSmoke, float dt, const CStateManager& mgr, c CGunWeapon::UpdateGunFx(shotSmoke, dt, mgr, xf); } -static const u16 kSoundId[] = {SFXwpn_fire_ice_normal, SFXwpn_fire_ice_charged}; - void CIceBeam::Fire(bool underwater, float dt, EChargeState chargeState, const zeus::CTransform& xf, CStateManager& mgr, TUniqueId homingTarget, float chargeFactor1, float chargeFactor2) { + static constexpr std::array soundId{SFXwpn_fire_ice_normal, SFXwpn_fire_ice_charged}; + CGunWeapon::Fire(underwater, dt, chargeState, xf, mgr, homingTarget, chargeFactor1, chargeFactor2); - NWeaponTypes::play_sfx(kSoundId[int(chargeState)], underwater, false, 0.165f); + NWeaponTypes::play_sfx(soundId[size_t(chargeState)], underwater, false, 0.165f); } void CIceBeam::EnableFx(bool enable) { diff --git a/Runtime/Weapon/CPhazonBeam.cpp b/Runtime/Weapon/CPhazonBeam.cpp index 3017a7fa1..5a20894a8 100644 --- a/Runtime/Weapon/CPhazonBeam.cpp +++ b/Runtime/Weapon/CPhazonBeam.cpp @@ -1,5 +1,7 @@ #include "Runtime/Weapon/CPhazonBeam.hpp" +#include + #include "Runtime/CSimplePool.hpp" #include "Runtime/GameGlobalObjects.hpp" #include "Runtime/Graphics/CBooRenderer.hpp" @@ -77,8 +79,6 @@ void CPhazonBeam::UpdateGunFx(bool shotSmoke, float dt, const CStateManager& mgr CGunWeapon::UpdateGunFx(shotSmoke, dt, mgr, xf); } -static const u16 kSoundId[] = {SFXwpn_fire_phazon_normal, SFXwpn_fire_power_charged}; - void CPhazonBeam::Fire(bool underwater, float dt, EChargeState chargeState, const zeus::CTransform& xf, CStateManager& mgr, TUniqueId homingTarget, float chargeFactor1, float chargeFactor2) { if (chargeState == EChargeState::Normal) { @@ -95,7 +95,8 @@ void CPhazonBeam::Fire(bool underwater, float dt, EChargeState chargeState, cons CGunWeapon::Fire(underwater, dt, chargeState, xf, mgr, homingTarget, chargeFactor1, chargeFactor2); } - NWeaponTypes::play_sfx(kSoundId[int(chargeState)], underwater, false, 0.165f); + static constexpr std::array soundId{SFXwpn_fire_phazon_normal, SFXwpn_fire_power_charged}; + NWeaponTypes::play_sfx(soundId[size_t(chargeState)], underwater, false, 0.165f); } void CPhazonBeam::Update(float dt, CStateManager& mgr) { From b2ec3e7eac58b5d945a1ed17fd43edc679e47f8d Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 11:36:17 -0400 Subject: [PATCH 112/224] CGameArea: Make use of std::array where applicable Same behavior, stronger typing, and optional runtime checking in debug mode. --- Runtime/World/CGameArea.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Runtime/World/CGameArea.cpp b/Runtime/World/CGameArea.cpp index 28c5f04d2..4c8bbe12e 100644 --- a/Runtime/World/CGameArea.cpp +++ b/Runtime/World/CGameArea.cpp @@ -1,5 +1,7 @@ #include "Runtime/World/CGameArea.hpp" +#include + #include "Runtime/CGameState.hpp" #include "Runtime/CSimplePool.hpp" #include "Runtime/CStateManager.hpp" @@ -43,8 +45,10 @@ CAreaRenderOctTree::CAreaRenderOctTree(const u8* buf) : x0_buf(buf) { } } -static const u32 ChildCounts[] = {0, 2, 2, 4, 2, 4, 4, 8}; -u32 CAreaRenderOctTree::Node::GetChildCount() const { return ChildCounts[x2_flags]; } +u32 CAreaRenderOctTree::Node::GetChildCount() const { + static constexpr std::array ChildCounts{0, 2, 2, 4, 2, 4, 4, 8}; + return ChildCounts[x2_flags]; +} zeus::CAABox CAreaRenderOctTree::Node::GetNodeBounds(const zeus::CAABox& curAABB, int idx) const { zeus::CVector3f center = curAABB.center(); From d8e7239bc6fd93a1297161209f240014b3357f57 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 11:53:15 -0400 Subject: [PATCH 113/224] CKnockBackController: Make use of std::array where applicable Same behavior, stronger typing. --- Runtime/World/CKnockBackController.cpp | 255 +++++++++++++------------ 1 file changed, 128 insertions(+), 127 deletions(-) diff --git a/Runtime/World/CKnockBackController.cpp b/Runtime/World/CKnockBackController.cpp index 4815c56d7..cd84dc277 100644 --- a/Runtime/World/CKnockBackController.cpp +++ b/Runtime/World/CKnockBackController.cpp @@ -6,356 +6,358 @@ namespace urde { -static const CKnockBackController::KnockBackParms KnockBackParmsTable[3][19][4] = { - { - { +constexpr std::array, 19>, 3> KnockBackParmsTable{{ + {{ + {{ {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Flinch, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::Shock, 1.000000f, 0.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::Shock, 2.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::Shock, 2.000000f, 0.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Shock, 4.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::ExplodeDeath, 4.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::Shock, 0.000000f, 0.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::Shock, 4.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::Shock, 0.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 2.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 2.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 5.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 5.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 8.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 4.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Flinch, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::ExplodeDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - }, - { - { + }}, + }}, + {{ + {{ {EKnockBackAnimationState::Flinch, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::None, 0.000000f, 0.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Flinch, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::Shock, 2.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::Shock, 1.000000f, 0.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::Shock, 2.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::Shock, 2.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::Shock, 2.000000f, 0.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Shock, 4.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::Shock, 4.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::Shock, 0.000000f, 0.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::Shock, 4.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::Shock, 4.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::Shock, 0.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 2.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 2.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::None, 0.000000f, 0.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 5.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 5.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 8.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 8.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 4.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 4.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::Burn, 6.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::BurnDeath, 6.000000f, -1.000000f}, {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::Burn, 6.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::BurnDeath, 6.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::BurnDeath, 6.000000f, -1.000000f}, {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::Burn, 6.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Burn, 6.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::BurnDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::Burn, 6.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::LaggedBurnDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::LaggedBurnDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Flinch, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::PhazeOut, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - }, - { - { + }}, + }}, + {{ + {{ {EKnockBackAnimationState::Flinch, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::None, 0.000000f, 0.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Flinch, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::Shock, 2.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::Shock, 1.000000f, 0.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Flinch, EKnockBackAnimationFollowUp::Shock, 2.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::Shock, 2.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::Shock, 2.000000f, 0.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Shock, 4.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::Shock, 4.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::Shock, 4.000000f, 0.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::Shock, 4.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::Shock, 4.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::Shock, 4.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 2.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::None, 0.000000f, 0.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 2.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::None, 0.000000f, 0.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 2.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::None, 0.000000f, 0.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 2.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::None, 0.000000f, 0.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 4.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::None, 0.000000f, 0.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 4.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 2.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::None, 0.000000f, 0.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Freeze, 2.500000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Flinch, EKnockBackAnimationFollowUp::Burn, 6.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::Burn, 6.000000f, -1.000000f}, {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::Burn, 6.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::Burn, 6.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::Burn, 6.000000f, -1.000000f}, {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::Burn, 6.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::Burn, 6.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::BurnDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::Burn, 6.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Flinch, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::KnockBack, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Flinch, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::None, EKnockBackAnimationFollowUp::None, 0.000000f, 0.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::LaggedBurnDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::LaggedBurnDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - { + }}, + {{ {EKnockBackAnimationState::Flinch, EKnockBackAnimationFollowUp::None, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::PhazeOut, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Hurled, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, {EKnockBackAnimationState::Fall, EKnockBackAnimationFollowUp::IceDeath, 0.000000f, -1.000000f}, - }, - }, -}; + }}, + }}, +}}; + +constexpr std::array ImpulseDurationTable{0.1f, 0.3f}; CKnockBackController::CKnockBackController(EKnockBackVariant variant) : x0_variant(variant) @@ -376,8 +378,6 @@ CKnockBackController::CKnockBackController(EKnockBackVariant variant) } } -static const float ImpulseDurationTable[] = {0.1f, 0.3f}; - void CKnockBackController::ApplyImpulse(float dt, CPatterned& parent) { x60_impulseRemTime = std::max(0.f, x60_impulseRemTime - dt); if (!parent.GetMaterialList().HasMaterial(EMaterialTypes::Immovable) && x60_impulseRemTime > 0.f) { @@ -530,8 +530,8 @@ void CKnockBackController::ResetKnockBackImpulse(CPatterned& parent, const zeus: void CKnockBackController::DoDeferredKnockBack(CStateManager& mgr, CPatterned& parent) { if (x14_deferWeaponType == EWeaponType::Wave) { - x4_activeParms = KnockBackParmsTable[int(x0_variant)][int(EKnockBackWeaponType::WaveComboedDirect)] - [int(GetKnockBackCharacterState(parent))]; + x4_activeParms = KnockBackParmsTable[size_t(x0_variant)][size_t(EKnockBackWeaponType::WaveComboedDirect)] + [size_t(GetKnockBackCharacterState(parent))]; ValidateState(parent); if (CHealthInfo* hInfo = parent.HealthInfo(mgr)) { zeus::CVector3f backVec = -parent.GetTransform().basis[1]; @@ -606,7 +606,8 @@ void CKnockBackController::SelectDamageState(CPatterned& parent, const CDamageIn EKnockBackType type) { EKnockBackWeaponType weaponType = GetKnockBackWeaponType(info, wType, type); if (weaponType != EKnockBackWeaponType::Invalid) { - x4_activeParms = KnockBackParmsTable[int(x0_variant)][int(weaponType)][int(GetKnockBackCharacterState(parent))]; + x4_activeParms = + KnockBackParmsTable[size_t(x0_variant)][size_t(weaponType)][size_t(GetKnockBackCharacterState(parent))]; ValidateState(parent); } } From 2e575c184e75cf21bb4a088a34a62e760c875228 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 11:54:53 -0400 Subject: [PATCH 114/224] CPatterned: Make use of constexpr where applicable --- Runtime/World/CPatterned.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Runtime/World/CPatterned.cpp b/Runtime/World/CPatterned.cpp index d1f502c2c..85cf907ce 100644 --- a/Runtime/World/CPatterned.cpp +++ b/Runtime/World/CPatterned.cpp @@ -25,11 +25,12 @@ namespace urde { -const zeus::CColor CPatterned::skDamageColor(0.5f, 0.f, 0.f); -CMaterialList gkPatternedGroundMaterialList(EMaterialTypes::Character, EMaterialTypes::Solid, EMaterialTypes::Orbit, - EMaterialTypes::GroundCollider, EMaterialTypes::Target); -CMaterialList gkPatternedFlyerMaterialList(EMaterialTypes::Character, EMaterialTypes::Solid, EMaterialTypes::Orbit, - EMaterialTypes::Target); +constexpr zeus::CColor CPatterned::skDamageColor(0.5f, 0.f, 0.f); +constexpr CMaterialList skPatternedGroundMaterialList(EMaterialTypes::Character, EMaterialTypes::Solid, + EMaterialTypes::Orbit, EMaterialTypes::GroundCollider, + EMaterialTypes::Target); +constexpr CMaterialList skPatternedFlyerMaterialList(EMaterialTypes::Character, EMaterialTypes::Solid, + EMaterialTypes::Orbit, EMaterialTypes::Target); CPatterned::CPatterned(ECharacter character, TUniqueId uid, std::string_view name, CPatterned::EFlavorType flavor, const CEntityInfo& info, const zeus::CTransform& xf, CModelData&& mData, @@ -41,7 +42,7 @@ CPatterned::CPatterned(ECharacter character, TUniqueId uid, std::string_view nam pInfo.xcc_bodyOrigin + zeus::CVector3f{pInfo.xc4_halfExtent, pInfo.xc4_halfExtent, pInfo.xc8_height}), pInfo.x0_mass, pInfo.x54_healthInfo, pInfo.x5c_damageVulnerability, - moveType == EMovementType::Flyer ? gkPatternedFlyerMaterialList : gkPatternedGroundMaterialList, + moveType == EMovementType::Flyer ? skPatternedFlyerMaterialList : skPatternedGroundMaterialList, pInfo.xfc_stateMachineId, actorParms, pInfo.xd8_stepUpHeight, 0.8f) , x2fc_minAttackRange(pInfo.x18_minAttackRange) , x300_maxAttackRange(pInfo.x1c_maxAttackRange) @@ -607,7 +608,7 @@ bool CPatterned::NoPathNodes(CStateManager&, float arg) { return true; } -static const float skActorApproachDistance = 3.f; +constexpr float skActorApproachDistance = 3.f; bool CPatterned::PathShagged(CStateManager&, float arg) { if (CPathFindSearch* search = GetSearchPath()) { From beaccf4f9e7b47d263716757d12a039463d66179 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 11:56:35 -0400 Subject: [PATCH 115/224] CScriptSound: Mark kSolidFilter as constexpr Same behavior minus runtime initializers. --- Runtime/World/CScriptSound.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/World/CScriptSound.cpp b/Runtime/World/CScriptSound.cpp index 39247989a..16ad3c504 100644 --- a/Runtime/World/CScriptSound.cpp +++ b/Runtime/World/CScriptSound.cpp @@ -50,7 +50,7 @@ void CScriptSound::PreThink(float dt, CStateManager& mgr) { x11d_25_processedThisFrame = false; } -static const CMaterialFilter kSolidFilter = +constexpr CMaterialFilter kSolidFilter = CMaterialFilter::MakeIncludeExclude({EMaterialTypes::Solid}, {EMaterialTypes::ProjectilePassthrough}); float CScriptSound::GetOccludedVolumeAmount(const zeus::CVector3f& pos, const CStateManager& mgr) { From dfa206eda9e390825301db5b31902598d119d52b Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 11:58:05 -0400 Subject: [PATCH 116/224] CScriptSpecialFunction: Make use of std::array where applicable Same behavior, stronger typing. --- Runtime/World/CScriptSpecialFunction.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Runtime/World/CScriptSpecialFunction.cpp b/Runtime/World/CScriptSpecialFunction.cpp index dacc04370..207e2a5cb 100644 --- a/Runtime/World/CScriptSpecialFunction.cpp +++ b/Runtime/World/CScriptSpecialFunction.cpp @@ -1,5 +1,7 @@ #include "Runtime/World/CScriptSpecialFunction.hpp" +#include + #include "Runtime/CGameState.hpp" #include "Runtime/CMemoryCardSys.hpp" #include "Runtime/CSimplePool.hpp" @@ -125,8 +127,11 @@ void CScriptSpecialFunction::Think(float dt, CStateManager& mgr) { break; } } -static const ERumbleFxId fxTranslation[6] = {ERumbleFxId::Twenty, ERumbleFxId::One, ERumbleFxId::TwentyOne, - ERumbleFxId::TwentyTwo, ERumbleFxId::TwentyThree, ERumbleFxId::Zero}; + +constexpr std::array fxTranslation{ + ERumbleFxId::Twenty, ERumbleFxId::One, ERumbleFxId::TwentyOne, + ERumbleFxId::TwentyTwo, ERumbleFxId::TwentyThree, ERumbleFxId::Zero, +}; void CScriptSpecialFunction::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CStateManager& mgr) { if (GetActive() && msg == EScriptObjectMessage::Deactivate && xe8_function == ESpecialFunction::Billboard) { From fa1e4f38df0528c5424b85c5c96fe90747168a5a Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 11:59:06 -0400 Subject: [PATCH 117/224] CScriptWater: Mark SolidFilter as constexpr Same behavior, minus runtime initializers. --- Runtime/World/CScriptWater.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/World/CScriptWater.cpp b/Runtime/World/CScriptWater.cpp index af24d5d80..bab5f78c8 100644 --- a/Runtime/World/CScriptWater.cpp +++ b/Runtime/World/CScriptWater.cpp @@ -144,7 +144,7 @@ void CScriptWater::SetupGrid(bool recomputeClipping) { x2e8_28_recomputeClipping = recomputeClipping; } -static const CMaterialFilter SolidFilter = CMaterialFilter::MakeInclude({EMaterialTypes::Solid}); +constexpr CMaterialFilter SolidFilter = CMaterialFilter::MakeInclude({EMaterialTypes::Solid}); void CScriptWater::SetupGridClipping(CStateManager& mgr, int computeVerts) { if (x2e8_28_recomputeClipping) { From 5d85cd496ab70116ad4c07a2c3686562e7bff2b5 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 09:52:36 -0400 Subject: [PATCH 118/224] CFluidPlane: Make use of std::array where applicable Makes all the arrays strongly typed. We can also use type aliases to greatly shorten some type definitions. --- Runtime/World/CFluidPlane.cpp | 6 ++-- Runtime/World/CFluidPlane.hpp | 13 ++++--- Runtime/World/CFluidPlaneCPU.cpp | 59 +++++++++++++++---------------- Runtime/World/CFluidPlaneCPU.hpp | 31 ++++++++-------- Runtime/World/CFluidPlaneDoor.cpp | 8 ++--- Runtime/World/CFluidPlaneGPU.cpp | 3 +- Runtime/World/CFluidPlaneGPU.hpp | 5 ++- 7 files changed, 61 insertions(+), 64 deletions(-) diff --git a/Runtime/World/CFluidPlane.cpp b/Runtime/World/CFluidPlane.cpp index aaf96d8ff..e9744ac43 100644 --- a/Runtime/World/CFluidPlane.cpp +++ b/Runtime/World/CFluidPlane.cpp @@ -83,8 +83,7 @@ void CFluidPlane::AddRipple(const CRipple& ripple, const CScriptWater& water, CS mgr.GetFluidPlaneManager()->RippleManager().AddRipple(ripple); } -void CFluidPlane::RenderStripWithRipples(float curY, const CFluidPlaneRender::SHFieldSample (&heights)[46][46], - const u8 (&flags)[9][9], int startYDiv, +void CFluidPlane::RenderStripWithRipples(float curY, const Heights& heights, const Flags& flags, int startYDiv, const CFluidPlaneRender::SPatchInfo& info, std::vector& vOut, std::vector& pvOut) { @@ -310,8 +309,7 @@ void CFluidPlane::RenderStripWithRipples(float curY, const CFluidPlaneRender::SH } } -void CFluidPlane::RenderPatch(const CFluidPlaneRender::SPatchInfo& info, - const CFluidPlaneRender::SHFieldSample (&heights)[46][46], const u8 (&flags)[9][9], +void CFluidPlane::RenderPatch(const CFluidPlaneRender::SPatchInfo& info, const Heights& heights, const Flags& flags, bool noRipples, bool flagIs1, std::vector& vOut, std::vector& pvOut) { if (noRipples) { diff --git a/Runtime/World/CFluidPlane.hpp b/Runtime/World/CFluidPlane.hpp index 4bb69e546..2b4be20be 100644 --- a/Runtime/World/CFluidPlane.hpp +++ b/Runtime/World/CFluidPlane.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include #include @@ -116,6 +117,10 @@ public: }; class CFluidPlane { +public: + using Flags = std::array, 9>; + using Heights = std::array, 46>; + protected: CAssetId x4_texPattern1Id; CAssetId x8_texPattern2Id; @@ -135,12 +140,12 @@ protected: float ProjectRippleVelocity(float baseI, float velDot) const; float CalculateRippleIntensity(float baseI) const; - virtual void RenderStripWithRipples(float curY, const CFluidPlaneRender::SHFieldSample (&heights)[46][46], - const u8 (&flags)[9][9], int startYDiv, const CFluidPlaneRender::SPatchInfo& info, + virtual void RenderStripWithRipples(float curY, const Heights& heights, const Flags& flags, int startYDiv, + const CFluidPlaneRender::SPatchInfo& info, std::vector& vOut, std::vector& pvOut); - void RenderPatch(const CFluidPlaneRender::SPatchInfo& info, const CFluidPlaneRender::SHFieldSample (&heights)[46][46], - const u8 (&flags)[9][9], bool noRipples, bool flagIs1, std::vector& vOut, + void RenderPatch(const CFluidPlaneRender::SPatchInfo& info, const Heights& heights, const Flags& flags, + bool noRipples, bool flagIs1, std::vector& vOut, std::vector& pvOut); public: diff --git a/Runtime/World/CFluidPlaneCPU.cpp b/Runtime/World/CFluidPlaneCPU.cpp index 1d1bb52d0..c412bf1ea 100644 --- a/Runtime/World/CFluidPlaneCPU.cpp +++ b/Runtime/World/CFluidPlaneCPU.cpp @@ -110,14 +110,15 @@ void CFluidPlaneCPU::CalculateLightmapMatrix(const zeus::CTransform& areaXf, con } static bool sSineWaveInitialized = false; -static float sGlobalSineWave[256] = {}; -static const float* InitializeSineWave() { - if (sSineWaveInitialized) - return sGlobalSineWave; - for (int i = 0; i < 256; ++i) - sGlobalSineWave[i] = std::sin(2.f * M_PIF * (i / 256.f)); +static CFluidPlaneCPU::SineTable sGlobalSineWave{}; +static void InitializeSineWave() { + if (sSineWaveInitialized) { + return; + } + for (size_t i = 0; i < sGlobalSineWave.size(); ++i) { + sGlobalSineWave[i] = std::sin(2.f * M_PIF * (float(i) / 256.f)); + } sSineWaveInitialized = true; - return sGlobalSineWave; } #define kEnableWaterBumpMaps true @@ -303,8 +304,7 @@ bool CFluidPlaneCPU::PrepareRipple(const CRipple& ripple, const CFluidPlaneRende return !(rippleOut.x14_gfromX > rippleOut.x18_gtoX || rippleOut.x1c_gfromY > rippleOut.x20_gtoY); } -void CFluidPlaneCPU::ApplyTurbulence(float t, CFluidPlaneRender::SHFieldSample (&heights)[46][46], - const u8 (&flags)[9][9], const float sineWave[256], +void CFluidPlaneCPU::ApplyTurbulence(float t, Heights& heights, const Flags& flags, const SineTable& sineWave, const CFluidPlaneRender::SPatchInfo& info, const zeus::CVector3f& areaCenter) const { if (!HasTurbulence()) { @@ -334,9 +334,8 @@ void CFluidPlaneCPU::ApplyTurbulence(float t, CFluidPlaneRender::SHFieldSample ( } } -void CFluidPlaneCPU::ApplyRipple(const CFluidPlaneRender::SRippleInfo& rippleInfo, - CFluidPlaneRender::SHFieldSample (&heights)[46][46], u8 (&flags)[9][9], - const float sineWave[256], const CFluidPlaneRender::SPatchInfo& info) const { +void CFluidPlaneCPU::ApplyRipple(const CFluidPlaneRender::SRippleInfo& rippleInfo, Heights& heights, Flags& flags, + const SineTable& sineWave, const CFluidPlaneRender::SPatchInfo& info) const { float lookupT = 256.f * (1.f - rippleInfo.x0_ripple.GetTime() * rippleInfo.x0_ripple.GetOOTimeFalloff() * rippleInfo.x0_ripple.GetOOTimeFalloff()) * @@ -409,8 +408,9 @@ void CFluidPlaneCPU::ApplyRipple(const CFluidPlaneRender::SRippleInfo& rippleInf float divDist = (divDistSq != 0.f) ? std::sqrt(divDistSq) : 0.f; if (u8 rippleV = CFluidPlaneManager::RippleValues[lifeIdx][int(divDist * distFalloff)]) { - heights[k][l].height += rippleV * rippleInfo.x0_ripple.GetLookupAmplitude() * - sineWave[int(divDist * rippleInfo.x0_ripple.GetLookupPhase() + lookupT) & 0xff]; + heights[k][l].height += + rippleV * rippleInfo.x0_ripple.GetLookupAmplitude() * + sineWave[size_t(divDist * rippleInfo.x0_ripple.GetLookupPhase() + lookupT) & 0xff]; } else { heights[k][l].height += 0.f; } @@ -460,8 +460,9 @@ void CFluidPlaneCPU::ApplyRipple(const CFluidPlaneRender::SRippleInfo& rippleInf float divDist = (divDistSq != 0.f) ? std::sqrt(divDistSq) : 0.f; if (u8 rippleV = CFluidPlaneManager::RippleValues[lifeIdx][int(divDist * distFalloff)]) { - heights[k][l].height += rippleV * rippleInfo.x0_ripple.GetLookupAmplitude() * - sineWave[int(divDist * rippleInfo.x0_ripple.GetLookupPhase() + lookupT) & 0xff]; + heights[k][l].height += + rippleV * rippleInfo.x0_ripple.GetLookupAmplitude() * + sineWave[size_t(divDist * rippleInfo.x0_ripple.GetLookupPhase() + lookupT) & 0xff]; } else { heights[k][l].height += 0.f; } @@ -485,8 +486,8 @@ void CFluidPlaneCPU::ApplyRipple(const CFluidPlaneRender::SRippleInfo& rippleInf } void CFluidPlaneCPU::ApplyRipples(const rstl::reserved_vector& rippleInfos, - CFluidPlaneRender::SHFieldSample (&heights)[46][46], u8 (&flags)[9][9], - const float sineWave[256], const CFluidPlaneRender::SPatchInfo& info) const { + Heights& heights, Flags& flags, const SineTable& sineWave, + const CFluidPlaneRender::SPatchInfo& info) const { for (const CFluidPlaneRender::SRippleInfo& rippleInfo : rippleInfos) ApplyRipple(rippleInfo, heights, flags, sineWave, info); for (int i = 0; i < CFluidPlaneRender::numTilesInHField; ++i) @@ -499,7 +500,7 @@ void CFluidPlaneCPU::ApplyRipples(const rstl::reserved_vector& rippleManager, int fromX, int toX, - int fromY, int toY) const { +bool CFluidPlaneCPU::UpdatePatch(float time, const CFluidPlaneRender::SPatchInfo& info, Heights& heights, Flags& flags, + const zeus::CVector3f& areaCenter, const std::optional& rippleManager, + int fromX, int toX, int fromY, int toY) const { rstl::reserved_vector rippleInfos; if (rippleManager) { for (const CRipple& ripple : rippleManager->GetRipples()) { @@ -730,10 +729,10 @@ bool CFluidPlaneCPU::UpdatePatch(float time, const CFluidPlaneRender::SPatchInfo return false; } -/* Used to be part of locked cache - * These are too big for stack allocation */ -static CFluidPlaneRender::SHFieldSample lc_heights[46][46] = {}; -static u8 lc_flags[9][9] = {}; +// Used to be part of locked cache +// These are too big for stack allocation +static CFluidPlane::Heights lc_heights{}; +static CFluidPlane::Flags lc_flags{}; void CFluidPlaneCPU::Render(const CStateManager& mgr, float alpha, const zeus::CAABox& aabb, const zeus::CTransform& xf, const zeus::CTransform& areaXf, bool noNormals, const zeus::CFrustum& frustum, diff --git a/Runtime/World/CFluidPlaneCPU.hpp b/Runtime/World/CFluidPlaneCPU.hpp index b7a569d5a..5b138a082 100644 --- a/Runtime/World/CFluidPlaneCPU.hpp +++ b/Runtime/World/CFluidPlaneCPU.hpp @@ -12,6 +12,9 @@ namespace urde { class CFluidUVMotion; class CFluidPlaneCPU : public CFluidPlane { +public: + using SineTable = std::array; + protected: class CTurbulence { float x0_speed; @@ -65,23 +68,17 @@ protected: static bool PrepareRipple(const CRipple& ripple, const CFluidPlaneRender::SPatchInfo& info, CFluidPlaneRender::SRippleInfo& rippleOut); - void ApplyTurbulence(float t, CFluidPlaneRender::SHFieldSample (&heights)[46][46], const u8 (&flags)[9][9], - const float sineWave[256], const CFluidPlaneRender::SPatchInfo& info, - const zeus::CVector3f& areaCenter) const; - void ApplyRipple(const CFluidPlaneRender::SRippleInfo& rippleInfo, - CFluidPlaneRender::SHFieldSample (&heights)[46][46], u8 (&flags)[9][9], const float sineWave[256], - const CFluidPlaneRender::SPatchInfo& info) const; - void ApplyRipples(const rstl::reserved_vector& rippleInfos, - CFluidPlaneRender::SHFieldSample (&heights)[46][46], u8 (&flags)[9][9], const float sineWave[256], - const CFluidPlaneRender::SPatchInfo& info) const; - static void UpdatePatchNoNormals(CFluidPlaneRender::SHFieldSample (&heights)[46][46], const u8 (&flags)[9][9], - const CFluidPlaneRender::SPatchInfo& info); - static void UpdatePatchWithNormals(CFluidPlaneRender::SHFieldSample (&heights)[46][46], const u8 (&flags)[9][9], - const CFluidPlaneRender::SPatchInfo& info); - bool UpdatePatch(float time, const CFluidPlaneRender::SPatchInfo& info, - CFluidPlaneRender::SHFieldSample (&heights)[46][46], u8 (&flags)[9][9], - const zeus::CVector3f& areaCenter, const std::optional& rippleManager, - int fromX, int toX, int fromY, int toY) const; + void ApplyTurbulence(float t, Heights& heights, const Flags& flags, const SineTable& sineWave, + const CFluidPlaneRender::SPatchInfo& info, const zeus::CVector3f& areaCenter) const; + void ApplyRipple(const CFluidPlaneRender::SRippleInfo& rippleInfo, Heights& heights, Flags& flags, + const SineTable& sineWave, const CFluidPlaneRender::SPatchInfo& info) const; + void ApplyRipples(const rstl::reserved_vector& rippleInfos, Heights& heights, + Flags& flags, const SineTable& sineWave, const CFluidPlaneRender::SPatchInfo& info) const; + static void UpdatePatchNoNormals(Heights& heights, const Flags& flags, const CFluidPlaneRender::SPatchInfo& info); + static void UpdatePatchWithNormals(Heights& heights, const Flags& flags, const CFluidPlaneRender::SPatchInfo& info); + bool UpdatePatch(float time, const CFluidPlaneRender::SPatchInfo& info, Heights& heights, Flags& flags, + const zeus::CVector3f& areaCenter, const std::optional& rippleManager, int fromX, + int toX, int fromY, int toY) const; public: CFluidPlaneCPU(CAssetId texPattern1, CAssetId texPattern2, CAssetId texColor, CAssetId bumpMap, CAssetId envMap, diff --git a/Runtime/World/CFluidPlaneDoor.cpp b/Runtime/World/CFluidPlaneDoor.cpp index b97a94f28..5cc804d00 100644 --- a/Runtime/World/CFluidPlaneDoor.cpp +++ b/Runtime/World/CFluidPlaneDoor.cpp @@ -51,10 +51,10 @@ CFluidPlaneShader::RenderSetupInfo CFluidPlaneDoor::RenderSetup(const CStateMana return out; } -/* Used to be part of locked cache - * These are too big for stack allocation */ -static CFluidPlaneRender::SHFieldSample lc_heights[46][46] = {}; -static u8 lc_flags[9][9] = {}; +// Used to be part of locked cache +// These are too big for stack allocation +static CFluidPlane::Heights lc_heights{}; +static CFluidPlane::Flags lc_flags{}; void CFluidPlaneDoor::Render(const CStateManager& mgr, float alpha, const zeus::CAABox& aabb, const zeus::CTransform& xf, const zeus::CTransform& areaXf, bool noNormals, diff --git a/Runtime/World/CFluidPlaneGPU.cpp b/Runtime/World/CFluidPlaneGPU.cpp index e83d494a3..6495ab4d7 100644 --- a/Runtime/World/CFluidPlaneGPU.cpp +++ b/Runtime/World/CFluidPlaneGPU.cpp @@ -17,8 +17,7 @@ CFluidPlaneGPU::CFluidPlaneGPU(CAssetId texPattern1, CAssetId texPattern2, CAsse m_tessellation = true; } -void CFluidPlaneGPU::RenderStripWithRipples(float curY, const CFluidPlaneRender::SHFieldSample (&heights)[46][46], - const u8 (&flags)[9][9], int startYDiv, +void CFluidPlaneGPU::RenderStripWithRipples(float curY, const Heights& heights, const Flags& flags, int startYDiv, const CFluidPlaneRender::SPatchInfo& info, std::vector& vOut, std::vector& pvOut) { diff --git a/Runtime/World/CFluidPlaneGPU.hpp b/Runtime/World/CFluidPlaneGPU.hpp index 00dc59121..b735a1e09 100644 --- a/Runtime/World/CFluidPlaneGPU.hpp +++ b/Runtime/World/CFluidPlaneGPU.hpp @@ -17,9 +17,8 @@ public: float turbAmplitudeMin, float specularMin, float specularMax, float reflectionBlend, float reflectionSize, float rippleIntensity, u32 maxVertCount); - void RenderStripWithRipples(float curY, const CFluidPlaneRender::SHFieldSample (&heights)[46][46], - const u8 (&flags)[9][9], int startYDiv, const CFluidPlaneRender::SPatchInfo& info, - std::vector& vOut, + void RenderStripWithRipples(float curY, const Heights& heights, const Flags& flags, int startYDiv, + const CFluidPlaneRender::SPatchInfo& info, std::vector& vOut, std::vector& pvOut) override; }; From ff123f782060a4e955f5de9696cead92c32a8593 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 13:28:09 -0400 Subject: [PATCH 119/224] General: Make use of static_cast within point generators The more restrictive static_cast is permissable when casting from void*. --- Runtime/Weapon/CGunWeapon.cpp | 2 +- Runtime/World/CMorphBall.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Runtime/Weapon/CGunWeapon.cpp b/Runtime/Weapon/CGunWeapon.cpp index 1954fd08a..3baa52db1 100644 --- a/Runtime/Weapon/CGunWeapon.cpp +++ b/Runtime/Weapon/CGunWeapon.cpp @@ -256,7 +256,7 @@ void CGunWeapon::TouchHolo(const CStateManager& mgr) { } void CGunWeapon::PointGenerator(void* ctx, const std::vector>& vn) { - reinterpret_cast(ctx)->GeneratePoints(vn); + static_cast(ctx)->GeneratePoints(vn); } void CGunWeapon::Draw(bool drawSuitArm, const CStateManager& mgr, const zeus::CTransform& xf, const CModelFlags& flags, diff --git a/Runtime/World/CMorphBall.cpp b/Runtime/World/CMorphBall.cpp index cd04a5950..deca77d98 100644 --- a/Runtime/World/CMorphBall.cpp +++ b/Runtime/World/CMorphBall.cpp @@ -1539,7 +1539,7 @@ void CMorphBall::PreRender(CStateManager& mgr, const zeus::CFrustum& frustum) { } void CMorphBall::PointGenerator(void* ctx, const std::vector>& vn) { - reinterpret_cast(ctx)->GeneratePoints(vn); + static_cast(ctx)->GeneratePoints(vn); } void CMorphBall::Render(const CStateManager& mgr, const CActorLights* lights) const { From 1d112134cf6227c76b63aeb3312bba61a56f236a Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 14:00:31 -0400 Subject: [PATCH 120/224] CScriptPlayerHint: Make use of std::any_of/std::find_if where applicable Same behavior, can be simplified even further with ranges in the future. --- Runtime/World/CScriptPlayerHint.cpp | 30 +++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/Runtime/World/CScriptPlayerHint.cpp b/Runtime/World/CScriptPlayerHint.cpp index f369b0a12..a8733e28f 100644 --- a/Runtime/World/CScriptPlayerHint.cpp +++ b/Runtime/World/CScriptPlayerHint.cpp @@ -1,5 +1,7 @@ #include "Runtime/World/CScriptPlayerHint.hpp" +#include + #include "Runtime/CStateManager.hpp" #include "Runtime/MP1/World/CMetroidPrimeRelay.hpp" #include "Runtime/World/CActorParameters.hpp" @@ -19,20 +21,28 @@ CScriptPlayerHint::CScriptPlayerHint(TUniqueId uid, std::string_view name, const void CScriptPlayerHint::Accept(IVisitor& visit) { visit.Visit(this); } void CScriptPlayerHint::AddToObjectList(TUniqueId uid) { - for (TUniqueId existId : xe8_objectList) - if (uid == existId) - return; - if (xe8_objectList.size() != 8) - xe8_objectList.push_back(uid); + const bool inList = + std::any_of(xe8_objectList.cbegin(), xe8_objectList.cend(), [uid](const auto id) { return id == uid; }); + if (inList) { + return; + } + + if (xe8_objectList.size() == xe8_objectList.capacity()) { + return; + } + + xe8_objectList.push_back(uid); } void CScriptPlayerHint::RemoveFromObjectList(TUniqueId uid) { - for (auto it = xe8_objectList.begin(); it != xe8_objectList.end(); ++it) { - if (*it == uid) { - xe8_objectList.erase(it); - return; - } + const auto iter = + std::find_if(xe8_objectList.cbegin(), xe8_objectList.cend(), [uid](const auto id) { return id == uid; }); + + if (iter == xe8_objectList.cend()) { + return; } + + xe8_objectList.erase(iter); } void CScriptPlayerHint::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CStateManager& mgr) { From ff847eaf416218256075b1368ec9d88608889a11 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 14:11:02 -0400 Subject: [PATCH 121/224] CScriptPlatform: Make platform material list constexpr Same behavior, no runtime overhead. --- Runtime/World/CScriptPlatform.cpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/Runtime/World/CScriptPlatform.cpp b/Runtime/World/CScriptPlatform.cpp index dbc12d10a..11d92062e 100644 --- a/Runtime/World/CScriptPlatform.cpp +++ b/Runtime/World/CScriptPlatform.cpp @@ -15,14 +15,8 @@ namespace urde { -static CMaterialList MakePlatformMaterialList() { - CMaterialList ret; - ret.Add(EMaterialTypes::Solid); - ret.Add(EMaterialTypes::Immovable); - ret.Add(EMaterialTypes::Platform); - ret.Add(EMaterialTypes::Occluder); - return ret; -} +constexpr auto skPlatformMaterialList = + CMaterialList{EMaterialTypes::Solid, EMaterialTypes::Immovable, EMaterialTypes::Platform, EMaterialTypes::Occluder}; CScriptPlatform::CScriptPlatform( TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf, CModelData&& mData, @@ -30,7 +24,7 @@ CScriptPlatform::CScriptPlatform( bool active, const CHealthInfo& hInfo, const CDamageVulnerability& dVuln, const std::optional>& dcln, bool rainSplashes, u32 maxRainSplashes, u32 rainGenRate) -: CPhysicsActor(uid, active, name, info, xf, std::move(mData), MakePlatformMaterialList(), aabb, SMoverData(15000.f), +: CPhysicsActor(uid, active, name, info, xf, std::move(mData), skPlatformMaterialList, aabb, SMoverData(15000.f), actParms, 0.3f, 0.1f) , x25c_currentSpeed(speed) , x28c_initialHealth(hInfo) From fd5c6f9e593e730711948070a537dacac8946301 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 14:54:47 -0400 Subject: [PATCH 122/224] CScriptPlatform: Make use of TCastToConstPtr where applicable Makes the read-only intent more explicit to the reader. --- Runtime/World/CScriptPlatform.cpp | 218 ++++++++++++++++++------------ 1 file changed, 134 insertions(+), 84 deletions(-) diff --git a/Runtime/World/CScriptPlatform.cpp b/Runtime/World/CScriptPlatform.cpp index 11d92062e..cebbf646b 100644 --- a/Runtime/World/CScriptPlatform.cpp +++ b/Runtime/World/CScriptPlatform.cpp @@ -46,37 +46,45 @@ CScriptPlatform::CScriptPlatform( CMaterialList(EMaterialTypes::Solid), CMaterialList(EMaterialTypes::NoStaticCollision, EMaterialTypes::NoPlatformCollision, EMaterialTypes::Platform))); xf8_24_movable = false; - if (HasModelData() && GetModelData()->HasAnimData()) + if (HasModelData() && GetModelData()->HasAnimData()) { GetModelData()->GetAnimationData()->EnableLooping(true); - if (x304_treeGroupContainer) + } + if (x304_treeGroupContainer) { x314_treeGroup = std::make_unique(x304_treeGroupContainer->GetObj(), x68_material); + } } void CScriptPlatform::Accept(IVisitor& visitor) { visitor.Visit(this); } void CScriptPlatform::DragSlave(CStateManager& mgr, rstl::reserved_vector& draggedSet, CActor* actor, const zeus::CVector3f& delta) { - if (std::find(draggedSet.begin(), draggedSet.end(), actor->GetUniqueId().Value()) == draggedSet.end()) { - draggedSet.push_back(actor->GetUniqueId().Value()); - zeus::CTransform newXf = actor->GetTransform(); - newXf.origin += delta; - actor->SetTransform(newXf); - if (TCastToPtr plat = actor) - plat->DragSlaves(mgr, draggedSet, delta); + if (std::find(draggedSet.begin(), draggedSet.end(), actor->GetUniqueId().Value()) != draggedSet.end()) { + return; + } + + draggedSet.push_back(actor->GetUniqueId().Value()); + zeus::CTransform newXf = actor->GetTransform(); + newXf.origin += delta; + actor->SetTransform(newXf); + if (const TCastToPtr plat = actor) { + plat->DragSlaves(mgr, draggedSet, delta); } } void CScriptPlatform::DragSlaves(CStateManager& mgr, rstl::reserved_vector& draggedSet, const zeus::CVector3f& delta) { - for (SRiders& rider : x328_slavesStatic) - if (TCastToPtr act = mgr.ObjectById(rider.x0_uid)) + for (SRiders& rider : x328_slavesStatic) { + if (const TCastToPtr act = mgr.ObjectById(rider.x0_uid)) { DragSlave(mgr, draggedSet, act.GetPtr(), delta); + } + } for (auto it = x338_slavesDynamic.begin(); it != x338_slavesDynamic.end();) { - if (TCastToPtr act = mgr.ObjectById(it->x0_uid)) { + if (const TCastToPtr act = mgr.ObjectById(it->x0_uid)) { DragSlave(mgr, draggedSet, act.GetPtr(), delta); ++it; - } else + } else { it = x338_slavesDynamic.erase(it); + } } } @@ -95,9 +103,9 @@ void CScriptPlatform::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, C } case EScriptObjectMessage::Next: { x25a_targetWaypoint = GetNext(x258_currentWaypoint, mgr); - if (x25a_targetWaypoint == kInvalidUniqueId) + if (x25a_targetWaypoint == kInvalidUniqueId) { mgr.SendScriptMsg(this, GetUniqueId(), EScriptObjectMessage::Stop); - else if (TCastToPtr wp = mgr.ObjectById(x25a_targetWaypoint)) { + } else if (const TCastToPtr wp = mgr.ObjectById(x25a_targetWaypoint)) { x25c_currentSpeed = 0.f; Stop(); x270_dragDelta = wp->GetTranslation() - GetTranslation(); @@ -116,10 +124,11 @@ void CScriptPlatform::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, C } case EScriptObjectMessage::Start: { x25a_targetWaypoint = GetNext(x258_currentWaypoint, mgr); - if (x25a_targetWaypoint == kInvalidUniqueId) + if (x25a_targetWaypoint == kInvalidUniqueId) { mgr.SendScriptMsg(this, GetUniqueId(), EScriptObjectMessage::Stop); - else if (TCastToPtr wp = mgr.ObjectById(x25a_targetWaypoint)) + } else if (const TCastToConstPtr wp = mgr.ObjectById(x25a_targetWaypoint)) { x25c_currentSpeed = wp->GetSpeed(); + } break; } case EScriptObjectMessage::Reset: { @@ -128,10 +137,11 @@ void CScriptPlatform::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, C break; } case EScriptObjectMessage::Increment: { - if (GetActive()) + if (GetActive()) { CScriptColorModulate::FadeInHelper(mgr, GetUniqueId(), x268_fadeInTime); - else + } else { mgr.SendScriptMsg(this, GetUniqueId(), EScriptObjectMessage::Activate); + } break; } case EScriptObjectMessage::Decrement: @@ -180,7 +190,7 @@ void CScriptPlatform::MoveRiders(CStateManager& mgr, float dt, bool active, std: continue; } act->SetTranslation(newPos); - if (TCastToPtr player = act.GetPtr()) { + if (const TCastToConstPtr player = act.GetPtr()) { if (player->GetOrbitState() != CPlayer::EPlayerOrbitState::NoOrbit) { ++it; continue; @@ -199,9 +209,11 @@ void CScriptPlatform::MoveRiders(CStateManager& mgr, float dt, bool active, std: rstl::reserved_vector CScriptPlatform::BuildNearListFromRiders(CStateManager& mgr, const std::vector& movedRiders) { rstl::reserved_vector ret; - for (const SRiders& rider : movedRiders) - if (TCastToPtr act = mgr.ObjectById(rider.x0_uid)) + for (const SRiders& rider : movedRiders) { + if (const TCastToConstPtr act = mgr.ObjectById(rider.x0_uid)) { ret.push_back(act->GetUniqueId()); + } + } return ret; } @@ -214,9 +226,11 @@ void CScriptPlatform::PreThink(float dt, CStateManager& mgr) { zeus::CTransform oldXf = x34_transform; CMotionState mState = GetMotionState(); if (GetActive()) { - for (SRiders& rider : x318_riders) - if (TCastToPtr act = mgr.ObjectById(rider.x0_uid)) + for (SRiders& rider : x318_riders) { + if (const TCastToConstPtr act = mgr.ObjectById(rider.x0_uid)) { rider.x8_transform.origin = x34_transform.transposeRotate(act->GetTranslation() - GetTranslation()); + } + } x27c_rotDelta = Move(dt, mgr); } @@ -243,16 +257,20 @@ void CScriptPlatform::PreThink(float dt, CStateManager& mgr) { } void CScriptPlatform::Think(float dt, CStateManager& mgr) { - if (!GetActive()) + if (!GetActive()) { return; + } if (HasModelData() && GetModelData()->HasAnimData()) { - if (!x356_25_controlledAnimation) + if (!x356_25_controlledAnimation) { UpdateAnimation(dt, mgr, true); + } + if (x356_28_rainSplashes && mgr.GetWorld()->GetNeededEnvFx() == EEnvFxType::Rain) { if (HasModelData() && !GetModelData()->IsNull() && mgr.GetEnvFxManager()->IsSplashActive() && - mgr.GetEnvFxManager()->GetRainMagnitude() != 0.f) + mgr.GetEnvFxManager()->GetRainMagnitude() != 0.f) { mgr.GetActorModelParticles()->AddRainSplashGenerator(*this, mgr, x34c_maxRainSplashes, x350_rainGenRate, 0.f); + } } } @@ -261,8 +279,9 @@ void CScriptPlatform::Think(float dt, CStateManager& mgr) { DragSlaves(mgr, draggedSet, x270_dragDelta); } - if (x356_24_dead) + if (x356_24_dead) { return; + } if (HealthInfo(mgr)->GetHP() <= 0.f) { x356_24_dead = true; @@ -272,33 +291,42 @@ void CScriptPlatform::Think(float dt, CStateManager& mgr) { void CScriptPlatform::PreRender(CStateManager& mgr, const zeus::CFrustum& frustum) { CActor::PreRender(mgr, frustum); + if (!xe4_30_outOfFrustum && !zeus::close_enough(x348_xrayAlpha, 1.f)) { - CModelFlags flags(5, 0, 3, {1.f, x348_xrayAlpha}); + const CModelFlags flags(5, 0, 3, {1.f, x348_xrayAlpha}); if (mgr.GetPlayerState()->GetActiveVisor(mgr) == CPlayerState::EPlayerVisor::XRay && !x356_30_disableXrayAlpha) { xb4_drawFlags = flags; x356_29_setXrayDrawFlags = true; } else if (x356_29_setXrayDrawFlags) { x356_29_setXrayDrawFlags = false; - if (xb4_drawFlags == flags && !x356_30_disableXrayAlpha) + if (xb4_drawFlags == flags && !x356_30_disableXrayAlpha) { xb4_drawFlags = CModelFlags(0, 0, 3, zeus::skWhite); + } } } - if (!mgr.GetObjectById(x354_boundsTrigger)) + + if (!mgr.GetObjectById(x354_boundsTrigger)) { x354_boundsTrigger = kInvalidUniqueId; + } } void CScriptPlatform::Render(CStateManager& mgr) { - bool xray = mgr.GetPlayerState()->GetActiveVisor(mgr) == CPlayerState::EPlayerVisor::XRay; - if (xray && !x356_31_xrayFog) + const bool xray = mgr.GetPlayerState()->GetActiveVisor(mgr) == CPlayerState::EPlayerVisor::XRay; + if (xray && !x356_31_xrayFog) { g_Renderer->SetWorldFog(ERglFogMode::None, 0.f, 1.f, zeus::skBlack); + } + CPhysicsActor::Render(mgr); - if (xray && !x356_31_xrayFog) + + if (xray && !x356_31_xrayFog) { mgr.SetupFogForArea(x4_areaId); + } } std::optional CScriptPlatform::GetTouchBounds() const { - if (x314_treeGroup) + if (x314_treeGroup) { return {x314_treeGroup->CalculateAABox(GetTransform())}; + } return {CPhysicsActor::GetBoundingBox()}; } @@ -310,38 +338,45 @@ zeus::CTransform CScriptPlatform::GetPrimitiveTransform() const { } const CCollisionPrimitive* CScriptPlatform::GetCollisionPrimitive() const { - if (!x314_treeGroup) + if (!x314_treeGroup) { return CPhysicsActor::GetCollisionPrimitive(); + } return x314_treeGroup.get(); } zeus::CVector3f CScriptPlatform::GetOrbitPosition(const CStateManager& mgr) const { return GetAimPosition(mgr, 0.f); } zeus::CVector3f CScriptPlatform::GetAimPosition(const CStateManager& mgr, float dt) const { - if (auto tb = GetTouchBounds()) + if (auto tb = GetTouchBounds()) { return {tb->center()}; + } return CPhysicsActor::GetAimPosition(mgr, dt); } zeus::CAABox CScriptPlatform::GetSortingBounds(const CStateManager& mgr) const { - if (x354_boundsTrigger != kInvalidUniqueId) - if (TCastToConstPtr trig = mgr.GetObjectById(x354_boundsTrigger)) + if (x354_boundsTrigger != kInvalidUniqueId) { + if (const TCastToConstPtr trig = mgr.GetObjectById(x354_boundsTrigger)) { return trig->GetTriggerBoundsWR(); + } + } return CActor::GetSortingBounds(mgr); } bool CScriptPlatform::IsRider(TUniqueId id) const { - for (const SRiders& rider : x318_riders) - if (rider.x0_uid == id) + for (const SRiders& rider : x318_riders) { + if (rider.x0_uid == id) { return true; + } + } return false; } bool CScriptPlatform::IsSlave(TUniqueId id) const { auto search = std::find_if(x328_slavesStatic.begin(), x328_slavesStatic.end(), [id](const SRiders& rider) { return rider.x0_uid == id; }); - if (search != x328_slavesStatic.end()) + if (search != x328_slavesStatic.end()) { return true; + } search = std::find_if(x338_slavesDynamic.begin(), x338_slavesDynamic.end(), [id](const SRiders& rider) { return rider.x0_uid == id; }); return search != x338_slavesDynamic.end(); @@ -351,7 +386,7 @@ void CScriptPlatform::BuildSlaveList(CStateManager& mgr) { x328_slavesStatic.reserve(GetConnectionList().size()); for (const SConnection& conn : GetConnectionList()) { if (conn.x0_state == EScriptObjectState::Play && conn.x4_msg == EScriptObjectMessage::Activate) { - if (TCastToPtr act = mgr.ObjectById(mgr.GetIdForScript(conn.x8_objId))) { + if (const TCastToPtr act = mgr.ObjectById(mgr.GetIdForScript(conn.x8_objId))) { act->AddMaterial(EMaterialTypes::PlatformSlave, mgr); zeus::CTransform xf = act->GetTransform(); xf.origin = act->GetTranslation() - GetTranslation(); @@ -359,19 +394,22 @@ void CScriptPlatform::BuildSlaveList(CStateManager& mgr) { } } else if (conn.x0_state == EScriptObjectState::InheritBounds && conn.x4_msg == EScriptObjectMessage::Activate) { auto list = mgr.GetIdListForScript(conn.x8_objId); - for (auto it = list.first; it != list.second; ++it) - if (TCastToConstPtr(mgr.GetObjectById(it->second))) + for (auto it = list.first; it != list.second; ++it) { + if (TCastToConstPtr(mgr.GetObjectById(it->second))) { x354_boundsTrigger = it->second; + } + } } } } void CScriptPlatform::AddRider(std::vector& riders, TUniqueId riderId, const CPhysicsActor* ridee, CStateManager& mgr) { - auto search = std::find_if(riders.begin(), riders.end(), [riderId](const SRiders& r) { return r.x0_uid == riderId; }); + const auto search = + std::find_if(riders.begin(), riders.end(), [riderId](const SRiders& r) { return r.x0_uid == riderId; }); if (search == riders.end()) { zeus::CTransform xf; - if (TCastToPtr act = mgr.ObjectById(riderId)) { + if (const TCastToPtr act = mgr.ObjectById(riderId)) { xf.origin = ridee->GetTransform().transposeRotate(act->GetTranslation() - ridee->GetTranslation()); mgr.SendScriptMsg(act.GetPtr(), ridee->GetUniqueId(), EScriptObjectMessage::AddPlatformRider); } @@ -382,33 +420,38 @@ void CScriptPlatform::AddRider(std::vector& riders, TUniqueId riderId, } void CScriptPlatform::AddSlave(TUniqueId id, CStateManager& mgr) { - auto search = std::find_if(x338_slavesDynamic.begin(), x338_slavesDynamic.end(), - [id](const SRiders& r) { return r.x0_uid == id; }); - if (search == x338_slavesDynamic.end()) { - if (TCastToPtr act = mgr.ObjectById(id)) { - act->AddMaterial(EMaterialTypes::PlatformSlave, mgr); - zeus::CTransform localXf = x34_transform.inverse() * act->GetTransform(); - x338_slavesDynamic.emplace_back(id, 0.166667f, localXf); - } + const auto search = std::find_if(x338_slavesDynamic.begin(), x338_slavesDynamic.end(), + [id](const SRiders& r) { return r.x0_uid == id; }); + if (search != x338_slavesDynamic.end()) { + return; + } + + if (const TCastToPtr act = mgr.ObjectById(id)) { + act->AddMaterial(EMaterialTypes::PlatformSlave, mgr); + const zeus::CTransform localXf = x34_transform.inverse() * act->GetTransform(); + x338_slavesDynamic.emplace_back(id, 0.166667f, localXf); } } TUniqueId CScriptPlatform::GetNext(TUniqueId uid, CStateManager& mgr) { - TCastToConstPtr nextWp = mgr.GetObjectById(uid); - if (!nextWp) + const TCastToConstPtr nextWp = mgr.GetObjectById(uid); + if (!nextWp) { return GetWaypoint(mgr); + } - TUniqueId next = nextWp->NextWaypoint(mgr); - if (TCastToConstPtr wp = mgr.GetObjectById(next)) + const TUniqueId next = nextWp->NextWaypoint(mgr); + if (const TCastToConstPtr wp = mgr.GetObjectById(next)) { x25c_currentSpeed = wp->GetSpeed(); + } return next; } TUniqueId CScriptPlatform::GetWaypoint(CStateManager& mgr) { for (const SConnection& conn : x20_conns) { - if (conn.x4_msg == EScriptObjectMessage::Follow) + if (conn.x4_msg == EScriptObjectMessage::Follow) { return mgr.GetIdForScript(conn.x8_objId); + } } return kInvalidUniqueId; @@ -420,27 +463,32 @@ void CScriptPlatform::SplashThink(const zeus::CAABox&, const CFluidPlane&, float zeus::CQuaternion CScriptPlatform::Move(float dt, CStateManager& mgr) { TUniqueId nextWaypoint = x25a_targetWaypoint; - if (x25a_targetWaypoint == kInvalidUniqueId) + if (x25a_targetWaypoint == kInvalidUniqueId) { nextWaypoint = GetNext(x258_currentWaypoint, mgr); - - TCastToPtr wp = mgr.ObjectById(nextWaypoint); - if (x258_currentWaypoint != kInvalidUniqueId && wp && !wp->GetActive()) { - nextWaypoint = GetNext(x258_currentWaypoint, mgr); - if (nextWaypoint == kInvalidUniqueId) - if (TCastToPtr wp = mgr.ObjectById(x258_currentWaypoint)) - if (wp->GetActive()) - nextWaypoint = x258_currentWaypoint; } - if (nextWaypoint == kInvalidUniqueId) + const TCastToConstPtr wp = mgr.ObjectById(nextWaypoint); + if (x258_currentWaypoint != kInvalidUniqueId && wp && !wp->GetActive()) { + nextWaypoint = GetNext(x258_currentWaypoint, mgr); + if (nextWaypoint == kInvalidUniqueId) { + if (const TCastToConstPtr wp2 = mgr.ObjectById(x258_currentWaypoint)) { + if (wp2->GetActive()) { + nextWaypoint = x258_currentWaypoint; + } + } + } + } + + if (nextWaypoint == kInvalidUniqueId) { return zeus::CQuaternion(); + } while (nextWaypoint != kInvalidUniqueId) { - if (TCastToPtr wp = mgr.ObjectById(nextWaypoint)) { - zeus::CVector3f platToWp = wp->GetTranslation() - GetTranslation(); + if (const TCastToPtr wp2 = mgr.ObjectById(nextWaypoint)) { + const zeus::CVector3f platToWp = wp2->GetTranslation() - GetTranslation(); if (zeus::close_enough(platToWp, zeus::skZero3f)) { x258_currentWaypoint = nextWaypoint; - mgr.SendScriptMsg(wp.GetPtr(), GetUniqueId(), EScriptObjectMessage::Arrived); + mgr.SendScriptMsg(wp2.GetPtr(), GetUniqueId(), EScriptObjectMessage::Arrived); if (zeus::close_enough(x25c_currentSpeed, 0.f, 0.02)) { nextWaypoint = GetNext(x258_currentWaypoint, mgr); x25c_currentSpeed = 0.f; @@ -449,19 +497,19 @@ zeus::CQuaternion CScriptPlatform::Move(float dt, CStateManager& mgr) { nextWaypoint = GetNext(x258_currentWaypoint, mgr); } - if (nextWaypoint != kInvalidUniqueId) + if (nextWaypoint != kInvalidUniqueId) { continue; + } mgr.SendScriptMsg(this, GetUniqueId(), EScriptObjectMessage::Stop); } if (zeus::close_enough(platToWp, zeus::skZero3f)) { - x270_dragDelta = wp->GetTranslation() - GetTranslation(); + x270_dragDelta = wp2->GetTranslation() - GetTranslation(); MoveToWR(GetTranslation(), dt); - } else if ((platToWp.normalized() * x25c_currentSpeed * dt).magSquared() > platToWp.magSquared()) { - x270_dragDelta = wp->GetTranslation() - GetTranslation(); - MoveToWR(wp->GetTranslation(), dt); + x270_dragDelta = wp2->GetTranslation() - GetTranslation(); + MoveToWR(wp2->GetTranslation(), dt); } else { x270_dragDelta = platToWp.normalized() * x25c_currentSpeed * dt; MoveToWR(GetTranslation() + x270_dragDelta, dt); @@ -470,15 +518,17 @@ zeus::CQuaternion CScriptPlatform::Move(float dt, CStateManager& mgr) { rstl::reserved_vector nearList; mgr.BuildColliderList(nearList, *this, GetMotionVolume(dt)); rstl::reserved_vector nonRiders; - for (TUniqueId id : nearList) - if (!IsRider(id) && !IsSlave(id)) + for (TUniqueId id : nearList) { + if (!IsRider(id) && !IsSlave(id)) { nonRiders.push_back(id); + } + } if (x356_26_detectCollision) { - CMotionState mState = PredictMotion(dt); + const CMotionState mState = PredictMotion(dt); MoveCollisionPrimitive(mState.x0_translation); - bool collision = CGameCollision::DetectDynamicCollisionBoolean(*GetCollisionPrimitive(), - GetPrimitiveTransform(), nonRiders, mgr); + const bool collision = CGameCollision::DetectDynamicCollisionBoolean(*GetCollisionPrimitive(), + GetPrimitiveTransform(), nonRiders, mgr); MoveCollisionPrimitive(zeus::skZero3f); if (collision || x356_27_squishedRider) { if (x356_26_detectCollision) { @@ -487,7 +537,7 @@ zeus::CQuaternion CScriptPlatform::Move(float dt, CStateManager& mgr) { break; } else { x356_27_squishedRider = false; - TUniqueId prevWaypoint = nextWaypoint; + const TUniqueId prevWaypoint = nextWaypoint; nextWaypoint = GetNext(nextWaypoint, mgr); if (x25a_targetWaypoint == nextWaypoint || x25a_targetWaypoint == prevWaypoint) { x260_moveDelay = 0.035f; From c84f430852697d21e7ecd749957dd1076f129d6e Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 15:11:21 -0400 Subject: [PATCH 123/224] CScriptPlatform: Simplify IsRider() Same behavior, less code. --- Runtime/World/CScriptPlatform.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/Runtime/World/CScriptPlatform.cpp b/Runtime/World/CScriptPlatform.cpp index cebbf646b..2297bb12e 100644 --- a/Runtime/World/CScriptPlatform.cpp +++ b/Runtime/World/CScriptPlatform.cpp @@ -1,5 +1,7 @@ #include "Runtime/World/CScriptPlatform.hpp" +#include + #include "Runtime/CStateManager.hpp" #include "Runtime/Collision/CCollidableOBBTreeGroup.hpp" #include "Runtime/Collision/CGameCollision.hpp" @@ -363,12 +365,7 @@ zeus::CAABox CScriptPlatform::GetSortingBounds(const CStateManager& mgr) const { } bool CScriptPlatform::IsRider(TUniqueId id) const { - for (const SRiders& rider : x318_riders) { - if (rider.x0_uid == id) { - return true; - } - } - return false; + return std::any_of(x318_riders.cbegin(), x318_riders.cend(), [id](const auto& rider) { return rider.x0_uid == id; }); } bool CScriptPlatform::IsSlave(TUniqueId id) const { From 175502cb0db0d5d9136d95fdf3ee19f6bd1fafee Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 15:23:26 -0400 Subject: [PATCH 124/224] CScriptMazeNode: Make use of std::array where applicable Same behavior, stronger typing. --- Runtime/World/CScriptMazeNode.cpp | 11 ++++++----- Runtime/World/CScriptMazeNode.hpp | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Runtime/World/CScriptMazeNode.cpp b/Runtime/World/CScriptMazeNode.cpp index 198a1f7fe..2fa0d173e 100644 --- a/Runtime/World/CScriptMazeNode.cpp +++ b/Runtime/World/CScriptMazeNode.cpp @@ -8,7 +8,7 @@ namespace urde { -atUint32 CScriptMazeNode::sMazeSeeds[300] = {0}; +std::array CScriptMazeNode::sMazeSeeds{}; CScriptMazeNode::CScriptMazeNode(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CTransform& xf, bool active, s32 w1, s32 w2, s32 w3, @@ -29,10 +29,11 @@ void CScriptMazeNode::Accept(IVisitor& visitor) { visitor.Visit(this); } void CScriptMazeNode::LoadMazeSeeds() { const SObjectTag* tag = g_ResFactory->GetResourceIdByName("DUMB_MazeSeeds"); - u32 resSize = g_ResFactory->ResourceSize(*tag); - std::unique_ptr buf = g_ResFactory->LoadResourceSync(*tag); + const u32 resSize = g_ResFactory->ResourceSize(*tag); + const std::unique_ptr buf = g_ResFactory->LoadResourceSync(*tag); CMemoryInStream in(buf.get(), resSize); - for (u32 i = 0; i < 300; ++i) - sMazeSeeds[i] = in.readUint32Big(); + for (auto& seed : sMazeSeeds) { + seed = in.readUint32Big(); + } } } // namespace urde diff --git a/Runtime/World/CScriptMazeNode.hpp b/Runtime/World/CScriptMazeNode.hpp index 18072f7d0..7ad096af6 100644 --- a/Runtime/World/CScriptMazeNode.hpp +++ b/Runtime/World/CScriptMazeNode.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include "Runtime/RetroTypes.hpp" @@ -9,7 +10,7 @@ namespace urde { class CScriptMazeNode : public CActor { - static u32 sMazeSeeds[300]; + static std::array sMazeSeeds; s32 xe8_; s32 xec_; s32 xf0_; From 7fb2b6ac0b768df302861f8a1f68169fd6f3902f Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 15:28:15 -0400 Subject: [PATCH 125/224] CScriptDock: Make dock material list constexpr Same behavior, no runtime overhead. --- Runtime/World/CScriptDock.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/Runtime/World/CScriptDock.cpp b/Runtime/World/CScriptDock.cpp index 8b5707568..c8516beb6 100644 --- a/Runtime/World/CScriptDock.cpp +++ b/Runtime/World/CScriptDock.cpp @@ -12,19 +12,15 @@ #include "TCastTo.hpp" // Generated file, do not modify include path namespace urde { -CMaterialList MakeDockMaterialList() { - CMaterialList list; - list.Add(EMaterialTypes::Trigger); - list.Add(EMaterialTypes::Immovable); - list.Add(EMaterialTypes::AIBlock); - return list; -} + +constexpr auto skDockMaterialList = + CMaterialList{EMaterialTypes::Trigger, EMaterialTypes::Immovable, EMaterialTypes::AIBlock}; CScriptDock::CScriptDock(TUniqueId uid, std::string_view name, const CEntityInfo& info, const zeus::CVector3f& position, const zeus::CVector3f& extents, s32 dock, TAreaId area, bool active, s32 dockReferenceCount, bool loadConnected) : CPhysicsActor(uid, active, name, info, zeus::CTransform(zeus::CMatrix3f(), position), CModelData::CModelDataNull(), - MakeDockMaterialList(), zeus::CAABox(-extents * 0.5f, extents * 0.5f), SMoverData(1.f), + skDockMaterialList, zeus::CAABox(-extents * 0.5f, extents * 0.5f), SMoverData(1.f), CActorParameters::None(), 0.3f, 0.1f) , x258_dockReferenceCount(dockReferenceCount) , x25c_dock(dock) From 7df73b6f4c6558962222a97009102a96d3de2ce0 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 15:29:51 -0400 Subject: [PATCH 126/224] CScriptDock: Get rid of variable shadowing Same behavior, less bug vectors. --- Runtime/World/CScriptDock.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Runtime/World/CScriptDock.cpp b/Runtime/World/CScriptDock.cpp index c8516beb6..28100ff44 100644 --- a/Runtime/World/CScriptDock.cpp +++ b/Runtime/World/CScriptDock.cpp @@ -67,9 +67,10 @@ void CScriptDock::Think(float dt, CStateManager& mgr) { if (CObjectList* objs = mgr.GetWorld()->GetArea(aid)->GetAreaObjects()) { for (CEntity* ent : *objs) { - TCastToPtr dock(ent); - if (dock && dock->GetDockId() == otherDock) - dock->SetLoadConnected(mgr, true); + const TCastToPtr dock2(ent); + if (dock2 && dock2->GetDockId() == otherDock) { + dock2->SetLoadConnected(mgr, true); + } } } } From 414c06b33e831846fb13634f11dfddeb80166c5d Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 21:07:15 -0400 Subject: [PATCH 127/224] CScriptDebris: Make use of std::array Same behavior, stronger typing. --- Runtime/World/CScriptDebris.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Runtime/World/CScriptDebris.hpp b/Runtime/World/CScriptDebris.hpp index 3fe94ac1a..da4824e1f 100644 --- a/Runtime/World/CScriptDebris.hpp +++ b/Runtime/World/CScriptDebris.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include @@ -50,7 +51,7 @@ private: zeus::CVector3f x2b0_scale; zeus::CVector3f x2bc_endScale; zeus::CVector3f x2c8_collisionNormal; - std::unique_ptr x2d4_particleGens[3]; /* x2d4, x2d8, x2dc */ + std::array, 3> x2d4_particleGens; /* x2d4, x2d8, x2dc */ TReservedAverage x2e0_speedAvg; public: From e91432ebf0c94c12ebbd548e0eb24ed38889eae4 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 21:42:52 -0400 Subject: [PATCH 128/224] CScannableObjectInfo: Make use of size_t in constructor Gets rid of unnecessary zero extensions and keeps loop variables the same sized type as the comparison type. While we're at it we can collapse a loop into a ranged for and get rid of some avoidable sign conversions. --- Runtime/CScannableObjectInfo.cpp | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/Runtime/CScannableObjectInfo.cpp b/Runtime/CScannableObjectInfo.cpp index f0658f7e3..52ddd2b54 100644 --- a/Runtime/CScannableObjectInfo.cpp +++ b/Runtime/CScannableObjectInfo.cpp @@ -4,26 +4,30 @@ namespace urde { CScannableObjectInfo::CScannableObjectInfo(CInputStream& in, CAssetId resId) : x0_scannableObjectId(resId) { - u32 version = in.readUint32Big(); + const u32 version = in.readUint32Big(); Load(in, version); - for (u32 i = 0; i < x14_buckets.size(); ++i) { - x14_buckets[i].x4_appearanceRange *= x8_totalDownloadTime; + for (auto& bucket : x14_buckets) { + bucket.x4_appearanceRange *= x8_totalDownloadTime; } - float appearanceOffset = g_tweakGui->GetScanAppearanceDuration(); - for (u32 i = 0; i < x14_buckets.size(); ++i) { - if (x14_buckets[i].x8_imagePos != -1) { - x8_totalDownloadTime += appearanceOffset; - for (u32 j = i; j < x14_buckets.size(); j++) - x14_buckets[j].x4_appearanceRange += appearanceOffset; + const float appearanceOffset = g_tweakGui->GetScanAppearanceDuration(); + for (size_t i = 0; i < x14_buckets.size(); ++i) { + if (x14_buckets[i].x8_imagePos == UINT32_MAX) { + continue; + } + + x8_totalDownloadTime += appearanceOffset; + for (size_t j = i; j < x14_buckets.size(); j++) { + x14_buckets[j].x4_appearanceRange += appearanceOffset; } } - for (u32 i = 0; i < x14_buckets.size() - 1; ++i) { - for (u32 j = i + 1; j < x14_buckets.size(); ++j) { - if (x14_buckets[i].x8_imagePos == x14_buckets[j].x8_imagePos && x14_buckets[i].x8_imagePos != -1) - x14_buckets[j].x8_imagePos = -1; + for (size_t i = 0; i < x14_buckets.size() - 1; ++i) { + for (size_t j = i + 1; j < x14_buckets.size(); ++j) { + if (x14_buckets[i].x8_imagePos == x14_buckets[j].x8_imagePos && x14_buckets[i].x8_imagePos != UINT32_MAX) { + x14_buckets[j].x8_imagePos = UINT32_MAX; + } } } } From 8000fb9e426f0620fdcacd2173d2396890340aa0 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 21:45:08 -0400 Subject: [PATCH 129/224] CScannableObjectInfo: Remove hardcoded capacity size We can just query the container for this. --- Runtime/CScannableObjectInfo.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Runtime/CScannableObjectInfo.cpp b/Runtime/CScannableObjectInfo.cpp index 52ddd2b54..c4e8a8c58 100644 --- a/Runtime/CScannableObjectInfo.cpp +++ b/Runtime/CScannableObjectInfo.cpp @@ -36,18 +36,20 @@ void CScannableObjectInfo::Load(CInputStream& in, u32 version) { in.readUint32Big(); in.readUint32Big(); x4_stringId = in.readUint32Big(); - if (version < 4) + if (version < 4) { x8_totalDownloadTime = in.readFloatBig(); - else { - u32 scanSpeed = in.readUint32Big(); + } else { + const u32 scanSpeed = in.readUint32Big(); x8_totalDownloadTime = g_tweakGui->GetScanSpeed(scanSpeed); } xc_category = in.readUint32Big(); - if (version > 4) + if (version > 4) { x10_important = in.readBool(); + } - for (u32 i = 0; i < 4; i++) + for (size_t i = 0; i < x14_buckets.capacity(); i++) { x14_buckets.emplace_back(in, version); + } } CScannableObjectInfo::SBucket::SBucket(CInputStream& in, u32 version) { From 0a01a30bf5194d6b8f37f3d44912de5a6fa8ab0a Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 21:54:40 -0400 Subject: [PATCH 130/224] CScanDisplay: Eliminate implicit sign conversions Removes implicit sign conversions and also dehardcodes quite a bit of sizes. --- Runtime/CScannableObjectInfo.hpp | 6 +- Runtime/GuiSys/CScanDisplay.cpp | 99 +++++++++++++++++++------------- Runtime/GuiSys/CScanDisplay.hpp | 4 +- Runtime/MP1/CLogBookScreen.cpp | 5 +- Runtime/MP1/CPauseScreenBase.cpp | 2 +- Runtime/MP1/CPauseScreenBase.hpp | 2 +- 6 files changed, 70 insertions(+), 48 deletions(-) diff --git a/Runtime/CScannableObjectInfo.hpp b/Runtime/CScannableObjectInfo.hpp index 79096333e..565a382f8 100644 --- a/Runtime/CScannableObjectInfo.hpp +++ b/Runtime/CScannableObjectInfo.hpp @@ -12,6 +12,8 @@ class CScannableObjectInfo { public: enum class EPanelType {}; + static constexpr size_t NumBuckets = 4; + struct SBucket { CAssetId x0_texture; float x4_appearanceRange = 0.f; @@ -29,14 +31,14 @@ private: float x8_totalDownloadTime = 0.f; u32 xc_category = 0; bool x10_important = false; - rstl::reserved_vector x14_buckets; + rstl::reserved_vector x14_buckets; public: CScannableObjectInfo(CInputStream&, CAssetId); CAssetId GetScannableObjectId() const { return x0_scannableObjectId; } CAssetId GetStringTableId() const { return x4_stringId; } float GetTotalDownloadTime() const { return x8_totalDownloadTime; } - const SBucket& GetBucket(s32 idx) const { return x14_buckets[idx]; } + const SBucket& GetBucket(size_t idx) const { return x14_buckets[idx]; } u32 GetCategory() const { return xc_category; } bool IsImportant() const { return x10_important; } }; diff --git a/Runtime/GuiSys/CScanDisplay.cpp b/Runtime/GuiSys/CScanDisplay.cpp index 471f6ee18..8a78f3906 100644 --- a/Runtime/GuiSys/CScanDisplay.cpp +++ b/Runtime/GuiSys/CScanDisplay.cpp @@ -71,9 +71,10 @@ void CScanDisplay::CDataDot::SetDestPosition(const zeus::CVector2f& pos) { CScanDisplay::CScanDisplay(const CGuiFrame& selHud) : xa0_selHud(selHud) { x0_dataDot = g_SimplePool->GetObj("TXTR_DataDot"); - for (int i = 0; i < 4; ++i) + for (size_t i = 0; i < xbc_dataDots.capacity(); ++i) { xbc_dataDots.emplace_back(x0_dataDot); - x170_paneStates.resize(4); + } + x170_paneStates.resize(x170_paneStates.capacity()); } void CScanDisplay::ProcessInput(const CFinalInput& input) { @@ -139,26 +140,34 @@ void CScanDisplay::ProcessInput(const CFinalInput& input) { xb8_dash->SetColor(zeus::CColor(0.53f, 0.84f, 1.f, dashAlpha)); } -float CScanDisplay::GetDownloadStartTime(int idx) const { - if (!x14_scannableInfo) +float CScanDisplay::GetDownloadStartTime(size_t idx) const { + if (!x14_scannableInfo) { return 0.f; - float nTime = x14_scannableInfo->GetBucket(idx).x4_appearanceRange; - float maxTime = 0.f; - for (int i = 0; i < 4; ++i) { - float iTime = x14_scannableInfo->GetBucket(i).x4_appearanceRange; - if (iTime < nTime) - maxTime = std::max(iTime, maxTime); } + + const float nTime = x14_scannableInfo->GetBucket(idx).x4_appearanceRange; + float maxTime = 0.f; + for (size_t i = 0; i < CScannableObjectInfo::NumBuckets; ++i) { + const float iTime = x14_scannableInfo->GetBucket(i).x4_appearanceRange; + if (iTime < nTime) { + maxTime = std::max(iTime, maxTime); + } + } + return maxTime + g_tweakGui->GetScanAppearanceDuration(); } -float CScanDisplay::GetDownloadFraction(int idx, float scanningTime) const { - if (!x14_scannableInfo) +float CScanDisplay::GetDownloadFraction(size_t idx, float scanningTime) const { + if (!x14_scannableInfo) { return 0.f; - float appearTime = GetDownloadStartTime(idx); - float appearRange = x14_scannableInfo->GetBucket(idx).x4_appearanceRange; - if (appearTime == appearRange) + } + + const float appearTime = GetDownloadStartTime(idx); + const float appearRange = x14_scannableInfo->GetBucket(idx).x4_appearanceRange; + if (appearTime == appearRange) { return 1.f; + } + return zeus::clamp(0.f, (scanningTime - appearTime) / (appearRange - appearTime), 1.f); } @@ -182,26 +191,26 @@ void CScanDisplay::StartScan(TUniqueId id, const CScannableObjectInfo& scanInfo, xa8_message->TextSupport().SetText(u""); xac_scrollMessage->TextSupport().SetText(u""); - for (int i = 0; i < 20; ++i) { - CAuiImagePane* pane = - static_cast(xa0_selHud.FindWidget(MP1::CPauseScreenBase::GetImagePaneName(i))); + for (size_t i = 0; i < 20; ++i) { + auto* pane = static_cast(xa0_selHud.FindWidget(MP1::CPauseScreenBase::GetImagePaneName(i))); zeus::CColor color = g_tweakGuiColors->GetScanDisplayImagePaneColor(); color.a() = 0.f; pane->SetColor(color); pane->SetTextureID0({}, g_SimplePool); pane->SetAnimationParms(zeus::skZero2f, 0.f, 0.f); - int pos = -1; - for (int j = 0; j < 4; ++j) { + size_t pos = SIZE_MAX; + for (size_t j = 0; j < CScannableObjectInfo::NumBuckets; ++j) { if (x14_scannableInfo->GetBucket(j).x8_imagePos == i) { pos = j; break; } } - if (pos >= 0) + if (pos != SIZE_MAX) { x170_paneStates[pos].second = pane; + } } - for (int i = 0; i < x170_paneStates.size(); ++i) { + for (size_t i = 0; i < x170_paneStates.size(); ++i) { std::pair& state = x170_paneStates[i]; if (state.second) { const CScannableObjectInfo::SBucket& bucket = x14_scannableInfo->GetBucket(i); @@ -211,22 +220,25 @@ void CScanDisplay::StartScan(TUniqueId id, const CScannableObjectInfo& scanInfo, } state.second->SetTextureID0(bucket.x0_texture, g_SimplePool); state.second->SetFlashFactor(0.f); - float startTime = GetDownloadStartTime(i); - if (scanTime >= startTime) + + const float startTime = GetDownloadStartTime(i); + if (scanTime >= startTime) { x170_paneStates[i].first = 0.f; - else + } else { x170_paneStates[i].first = -1.f; + } } } - CAssetId strId = x14_scannableInfo->GetStringTableId(); - if (strId.IsValid()) + const CAssetId strId = x14_scannableInfo->GetStringTableId(); + if (strId.IsValid()) { x194_scanStr = g_SimplePool->GetObj({FOURCC('STRG'), strId}); + } - for (int i = 0; i < 4; ++i) { - int pos = x14_scannableInfo->GetBucket(i).x8_imagePos; + for (size_t i = 0; i < CScannableObjectInfo::NumBuckets; ++i) { + const u32 pos = x14_scannableInfo->GetBucket(i).x8_imagePos; CDataDot& dot = xbc_dataDots[i]; - if (pos != -1) { + if (pos != UINT32_MAX) { if (GetDownloadStartTime(i) - g_tweakGui->GetScanAppearanceDuration() < scanTime) { dot.SetAlpha(0.f); dot.SetDotState(CDataDot::EDotState::Done); @@ -243,12 +255,14 @@ void CScanDisplay::StartScan(TUniqueId id, const CScannableObjectInfo& scanInfo, } void CScanDisplay::StopScan() { - if (xc_state == EScanState::Done || xc_state == EScanState::Inactive) + if (xc_state == EScanState::Done || xc_state == EScanState::Inactive) { return; + } xc_state = EScanState::Done; - for (int i = 0; i < 4; ++i) - xbc_dataDots[i].SetDesiredAlpha(0.f); + for (auto& dataDot : xbc_dataDots) { + dataDot.SetDesiredAlpha(0.f); + } } void CScanDisplay::SetScanMessageTypeEffect(CGuiTextPane* pane, bool type) { @@ -310,25 +324,30 @@ void CScanDisplay::Update(float dt, float scanningTime) { } } - for (int i = 0; i < 4; ++i) { - if (x170_paneStates[i].second == nullptr) + for (size_t i = 0; i < x170_paneStates.size(); ++i) { + if (x170_paneStates[i].second == nullptr) { continue; + } + if (x170_paneStates[i].first > 0.f) { x170_paneStates[i].first = std::max(0.f, x170_paneStates[i].first - dt); float tmp; - if (x170_paneStates[i].first > g_tweakGui->GetScanPaneFadeOutTime()) + if (x170_paneStates[i].first > g_tweakGui->GetScanPaneFadeOutTime()) { tmp = 1.f - (x170_paneStates[i].first - g_tweakGui->GetScanPaneFadeOutTime()) / g_tweakGui->GetScanPaneFadeInTime(); - else + } else { tmp = x170_paneStates[i].first / g_tweakGui->GetScanPaneFadeOutTime(); + } x170_paneStates[i].second->SetFlashFactor(tmp * g_tweakGui->GetScanPaneFlashFactor() * x1a8_bodyAlpha); } - float alphaMul = + + const float alphaMul = ((xc_state == EScanState::Downloading) ? GetDownloadFraction(i, scanningTime) : 1.f) * x1a8_bodyAlpha; zeus::CColor color = g_tweakGuiColors->GetScanDisplayImagePaneColor(); color.a() *= alphaMul; x170_paneStates[i].second->SetColor(color); x170_paneStates[i].second->SetDeResFactor(1.f - alphaMul); + if (GetDownloadStartTime(i) - g_tweakGui->GetScanAppearanceDuration() < scanningTime) { CDataDot& dot = xbc_dataDots[i]; switch (dot.GetDotState()) { @@ -338,7 +357,7 @@ void CScanDisplay::Update(float dt, float scanningTime) { dot.StartTransitionTo(zeus::skZero2f, g_tweakGui->GetScanAppearanceDuration()); break; case CDataDot::EDotState::RevealPane: { - float tmp = dot.GetTransitionFactor(); + const float tmp = dot.GetTransitionFactor(); if (tmp == 0.f) { dot.SetDotState(CDataDot::EDotState::Done); dot.SetDesiredAlpha(0.f); @@ -353,7 +372,7 @@ void CScanDisplay::Update(float dt, float scanningTime) { } } - for (int i = 0; i < 4; ++i) { + for (size_t i = 0; i < xbc_dataDots.size(); ++i) { CDataDot& dot = xbc_dataDots[i]; switch (dot.GetDotState()) { case CDataDot::EDotState::Hidden: diff --git a/Runtime/GuiSys/CScanDisplay.hpp b/Runtime/GuiSys/CScanDisplay.hpp index 7b9c60d83..45b205bcf 100644 --- a/Runtime/GuiSys/CScanDisplay.hpp +++ b/Runtime/GuiSys/CScanDisplay.hpp @@ -79,8 +79,8 @@ private: float x1b0_aPulse = 1.f; bool x1b4_scanComplete = false; - float GetDownloadStartTime(int idx) const; - float GetDownloadFraction(int idx, float scanningTime) const; + float GetDownloadStartTime(size_t idx) const; + float GetDownloadFraction(size_t idx, float scanningTime) const; static void SetScanMessageTypeEffect(CGuiTextPane* pane, bool type); public: diff --git a/Runtime/MP1/CLogBookScreen.cpp b/Runtime/MP1/CLogBookScreen.cpp index e4dc73fff..7439b7cf4 100644 --- a/Runtime/MP1/CLogBookScreen.cpp +++ b/Runtime/MP1/CLogBookScreen.cpp @@ -214,10 +214,11 @@ void CLogBookScreen::UpdateBodyImagesAndText() { pane->SetAnimationParms(zeus::skZero2f, 0.f, 0.f); } - for (int i = 0; i < 4; ++i) { + for (size_t i = 0; i < CScannableObjectInfo::NumBuckets; ++i) { const CScannableObjectInfo::SBucket& bucket = scan->GetBucket(i); - if (bucket.x8_imagePos == UINT32_MAX) + if (bucket.x8_imagePos == UINT32_MAX) { continue; + } CAuiImagePane* pane = xf0_imagePanes[bucket.x8_imagePos]; if (bucket.x14_interval > 0.f) { pane->SetAnimationParms(zeus::CVector2f(bucket.xc_size.x, bucket.xc_size.y), bucket.x14_interval, diff --git a/Runtime/MP1/CPauseScreenBase.cpp b/Runtime/MP1/CPauseScreenBase.cpp index 0351a5c81..d4b4d3b00 100644 --- a/Runtime/MP1/CPauseScreenBase.cpp +++ b/Runtime/MP1/CPauseScreenBase.cpp @@ -536,7 +536,7 @@ void CPauseScreenBase::OnWidgetScroll(CGuiWidget* widget, const boo::SScrollDelt } } -std::string CPauseScreenBase::GetImagePaneName(u32 i) { +std::string CPauseScreenBase::GetImagePaneName(size_t i) { static constexpr std::array PaneSuffixes{ "0", "1", "2", "3", "01", "12", "23", "012", "123", "0123", "4", "5", "6", "7", "45", "56", "67", "456", "567", "4567", diff --git a/Runtime/MP1/CPauseScreenBase.hpp b/Runtime/MP1/CPauseScreenBase.hpp index 95178d5e2..6272087e9 100644 --- a/Runtime/MP1/CPauseScreenBase.hpp +++ b/Runtime/MP1/CPauseScreenBase.hpp @@ -102,7 +102,7 @@ protected: void OnWidgetScroll(CGuiWidget* widget, const boo::SScrollDelta& delta, int accumX, int accumY); public: - static std::string GetImagePaneName(u32 i); + static std::string GetImagePaneName(size_t i); CPauseScreenBase(const CStateManager& mgr, CGuiFrame& frame, const CStringTable& pauseStrg, bool isLogBook = false); From 6fc32f44df8f7dae461c125abc882e0affd677cb Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 12 Apr 2020 22:41:16 -0400 Subject: [PATCH 131/224] CRumbleGenerator: Make use of fmt::print instead of printf Less need to care about formatting specifiers. --- Runtime/Input/CRumbleGenerator.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Runtime/Input/CRumbleGenerator.cpp b/Runtime/Input/CRumbleGenerator.cpp index 7887c405d..ce2ee350a 100644 --- a/Runtime/Input/CRumbleGenerator.cpp +++ b/Runtime/Input/CRumbleGenerator.cpp @@ -24,8 +24,9 @@ void CRumbleGenerator::Update(float dt) { if (!b_tp) { b_tp = true; s_tp = now; - } else + } else { ms = std::chrono::duration_cast(now - s_tp).count(); + } #endif if (!xf0_24_disabled) { @@ -38,7 +39,7 @@ void CRumbleGenerator::Update(float dt) { if (xe0_commandArray[i] != EMotorState::Stop) { #if PWM_MONITOR s_tp = now; - printf("%lldms ON\n", ms); + fmt::print(FMT_STRING("{}ms ON\n"), ms); #endif xe0_commandArray[i] = EMotorState::Stop; updated = true; @@ -50,7 +51,7 @@ void CRumbleGenerator::Update(float dt) { if (xe0_commandArray[i] != EMotorState::Rumble) { #if PWM_MONITOR s_tp = now; - printf("%lldms Off\n", ms); + fmt::print(FMT_STRING("{}ms Off\n"), ms); #endif xe0_commandArray[i] = EMotorState::Rumble; updated = true; @@ -62,7 +63,7 @@ void CRumbleGenerator::Update(float dt) { if (xe0_commandArray[i] != EMotorState::Stop) { #if PWM_MONITOR s_tp = now; - printf("%lldms ON\n", ms); + fmt::print(FMT_STRING("{}ms ON\n"), ms); #endif xe0_commandArray[i] = EMotorState::Stop; updated = true; From 7d6e466b68e5c86e32abc9c52181849c26b85c5d Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 01:43:00 -0400 Subject: [PATCH 132/224] CDecalManager: Make use of std::nullopt where applicable Same thing, less verbose. --- Runtime/Particle/CDecalManager.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Runtime/Particle/CDecalManager.cpp b/Runtime/Particle/CDecalManager.cpp index 831d5c6f7..19b94ec98 100644 --- a/Runtime/Particle/CDecalManager.cpp +++ b/Runtime/Particle/CDecalManager.cpp @@ -21,8 +21,9 @@ void CDecalManager::Initialize() { return; m_DecalPool.clear(); - for (int i = 0; i < 64; ++i) - m_DecalPool.emplace_back(std::optional{}, 0, i - 1, false); + for (int i = 0; i < 64; ++i) { + m_DecalPool.emplace_back(std::nullopt, 0, i - 1, false); + } m_FreeIndex = 63; m_PoolInitialized = true; @@ -39,8 +40,9 @@ void CDecalManager::Reinitialize() { Initialize(); m_DecalPool.clear(); - for (int i = 0; i < 64; ++i) - m_DecalPool.emplace_back(std::optional{}, 0, i - 1, false); + for (int i = 0; i < 64; ++i) { + m_DecalPool.emplace_back(std::nullopt, 0, i - 1, false); + } m_ActiveIndexList.clear(); From 6838515d3df53e3f505aed4f252efdf05bed794a Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Mon, 13 Apr 2020 00:48:00 -0700 Subject: [PATCH 133/224] Fix ALPH default value --- Runtime/Graphics/CModelBoo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Graphics/CModelBoo.cpp b/Runtime/Graphics/CModelBoo.cpp index 4a40560b1..983274ef1 100644 --- a/Runtime/Graphics/CModelBoo.cpp +++ b/Runtime/Graphics/CModelBoo.cpp @@ -337,7 +337,7 @@ CBooModel::ModelInstance* CBooModel::PushNewModelInstance(int sharedLayoutBuf) { std::array, 12> texs{ g_Renderer->m_clearTexture.get(), g_Renderer->m_clearTexture.get(), g_Renderer->m_clearTexture.get(), g_Renderer->m_clearTexture.get(), g_Renderer->m_clearTexture.get(), g_Renderer->m_clearTexture.get(), - g_Renderer->m_clearTexture.get(), g_Renderer->m_clearTexture.get(), g_Renderer->x220_sphereRamp.get(), + g_Renderer->m_whiteTexture.get(), g_Renderer->m_clearTexture.get(), g_Renderer->x220_sphereRamp.get(), g_Renderer->x220_sphereRamp.get(), g_Renderer->x220_sphereRamp.get(), g_Renderer->x220_sphereRamp.get(), }; if (!g_DummyTextures) { From 2ad45e481fa5758ea4fb2803675b5fac0e2d4e4b Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 10:34:43 -0400 Subject: [PATCH 134/224] CAuxWeapon: Use names for sound IDs Same behavior, but slightly more self-documenting on what they actually are. --- Runtime/Weapon/CAuxWeapon.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Weapon/CAuxWeapon.cpp b/Runtime/Weapon/CAuxWeapon.cpp index 6764dec90..e0e377821 100644 --- a/Runtime/Weapon/CAuxWeapon.cpp +++ b/Runtime/Weapon/CAuxWeapon.cpp @@ -28,7 +28,7 @@ constexpr std::array skComboNames{ }; constexpr std::array skSoundId{ - 1810, 1837, 1847, 1842, 1810, + SFXsfx0712, SFXsfx072D, SFXwpn_combo_wavebuster, SFXwpn_combo_flamethrower, SFXsfx0712, }; CAuxWeapon::CAuxWeapon(TUniqueId playerId) From 29cd228d03ef5bacd1a9ceb442c18082cd4e1823 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 14:10:50 -0400 Subject: [PATCH 135/224] CMorphBall: Eliminate hardcoded sizes We can query the container capacity directly instead of hardcoding it in. --- Runtime/World/CMorphBall.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Runtime/World/CMorphBall.cpp b/Runtime/World/CMorphBall.cpp index deca77d98..f693d900f 100644 --- a/Runtime/World/CMorphBall.cpp +++ b/Runtime/World/CMorphBall.cpp @@ -283,8 +283,9 @@ CMorphBall::CMorphBall(CPlayer& player, float radius) kSpiderBallCollisionRadius = GetBallRadius() + 0.2f; - for (int i = 0; i < 32; ++i) + for (size_t i = 0; i < x19e4_spiderElectricGens.capacity(); ++i) { x19e4_spiderElectricGens.emplace_back(std::make_unique(x19a0_spiderElectric, 0), false); + } LoadAnimationTokens("SamusBallANCS"); InitializeWakeEffects(); @@ -303,10 +304,9 @@ void CMorphBall::LoadAnimationTokens(std::string_view ancsName) { } void CMorphBall::InitializeWakeEffects() { - TToken nullParticle = + const TToken nullParticle = CToken(TObjOwnerDerivedFromIObj::GetNewDerivedObject(std::make_unique())); - for (int i = 0; i < 8; ++i) - x1b84_wakeEffects.push_back(nullParticle); + x1b84_wakeEffects.resize(x1b84_wakeEffects.capacity(), nullParticle); x1b84_wakeEffects[2] = g_SimplePool->GetObj("DirtWake"); x1b84_wakeEffects[0] = g_SimplePool->GetObj("PhazonWake"); @@ -317,7 +317,7 @@ void CMorphBall::InitializeWakeEffects() { x1b84_wakeEffects[6] = g_SimplePool->GetObj("SandWake"); x1b84_wakeEffects[7] = g_SimplePool->GetObj("RainWake"); - x1bc8_wakeEffectGens.resize(8); + x1bc8_wakeEffectGens.resize(x1b84_wakeEffects.capacity()); x1bc8_wakeEffectGens[2] = std::make_unique(x1b84_wakeEffects[2]); x1bc8_wakeEffectGens[0] = std::make_unique(x1b84_wakeEffects[0]); x1bc8_wakeEffectGens[1] = std::make_unique(x1b84_wakeEffects[1]); From 3a5a3e2011b8852e9e78744482bf2acdf006c1ce Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 14:25:54 -0400 Subject: [PATCH 136/224] CHudRadarInterface: Make use of const where applicable Same behavior, but makes it obvious some references are only used in a read-only manner. --- Runtime/GuiSys/CHudRadarInterface.cpp | 69 +++++++++++++++------------ 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/Runtime/GuiSys/CHudRadarInterface.cpp b/Runtime/GuiSys/CHudRadarInterface.cpp index f5ffa5292..51c190db2 100644 --- a/Runtime/GuiSys/CHudRadarInterface.cpp +++ b/Runtime/GuiSys/CHudRadarInterface.cpp @@ -45,19 +45,22 @@ void CHudRadarInterface::DoDrawRadarPaint(const zeus::CVector3f& translate, floa void CHudRadarInterface::DrawRadarPaint(const zeus::CVector3f& enemyPos, float radius, float alpha, const SRadarPaintDrawParms& parms) { - zeus::CVector2f playerToEnemy = enemyPos.toVec2f() - parms.x0_playerPos.toVec2f(); + const zeus::CVector2f playerToEnemy = enemyPos.toVec2f() - parms.x0_playerPos.toVec2f(); + const float zDelta = std::fabs(enemyPos.z() - parms.x0_playerPos.z()); - float zDelta = std::fabs(enemyPos.z() - parms.x0_playerPos.z()); - - if (playerToEnemy.magnitude() <= parms.x78_xyRadius && zDelta <= parms.x7c_zRadius) { - if (zDelta > parms.x80_ZCloseRadius) - alpha *= 1.f - (zDelta - parms.x80_ZCloseRadius) / (parms.x7c_zRadius - parms.x80_ZCloseRadius); - zeus::CVector2f scopeScaled = playerToEnemy * parms.x70_scopeScalar; - zeus::CColor color = g_tweakGuiColors->GetRadarEnemyPaintColor(); - color.a() *= alpha; - color.a() *= parms.x74_alpha; - DoDrawRadarPaint(parms.xc_preTranslate * zeus::CVector3f(scopeScaled.x(), 0.f, scopeScaled.y()), radius, color); + if (playerToEnemy.magnitude() > parms.x78_xyRadius || zDelta > parms.x7c_zRadius) { + return; } + + if (zDelta > parms.x80_ZCloseRadius) { + alpha *= 1.f - (zDelta - parms.x80_ZCloseRadius) / (parms.x7c_zRadius - parms.x80_ZCloseRadius); + } + + const zeus::CVector2f scopeScaled = playerToEnemy * parms.x70_scopeScalar; + zeus::CColor color = g_tweakGuiColors->GetRadarEnemyPaintColor(); + color.a() *= alpha; + color.a() *= parms.x74_alpha; + DoDrawRadarPaint(parms.xc_preTranslate * zeus::CVector3f(scopeScaled.x(), 0.f, scopeScaled.y()), radius, color); } void CHudRadarInterface::SetIsVisibleGame(bool v) { @@ -66,29 +69,33 @@ void CHudRadarInterface::SetIsVisibleGame(bool v) { } void CHudRadarInterface::Update(float dt, const CStateManager& mgr) { - CPlayerState& playerState = *mgr.GetPlayerState(); - float visorTransFactor = (playerState.GetCurrentVisor() == CPlayerState::EPlayerVisor::Combat) - ? playerState.GetVisorTransitionFactor() - : 0.f; + const CPlayerState& playerState = *mgr.GetPlayerState(); + const float visorTransFactor = (playerState.GetCurrentVisor() == CPlayerState::EPlayerVisor::Combat) + ? playerState.GetVisorTransitionFactor() + : 0.f; zeus::CColor color = g_tweakGuiColors->GetRadarStuffColor(); color.a() *= g_GameState->GameOptions().GetHUDAlpha() / 255.f * visorTransFactor; x40_BaseWidget_RadarStuff->SetColor(color); - bool tweakVis = g_tweakGui->GetHudVisMode() >= ITweakGui::EHudVisMode::Three; - if (tweakVis != x3c_25_visibleDebug) { - x3c_25_visibleDebug = tweakVis; - x40_BaseWidget_RadarStuff->SetVisibility(x3c_25_visibleDebug && x3c_24_visibleGame, ETraversalMode::Children); + const bool tweakVis = g_tweakGui->GetHudVisMode() >= ITweakGui::EHudVisMode::Three; + + if (tweakVis == x3c_25_visibleDebug) { + return; } + + x3c_25_visibleDebug = tweakVis; + x40_BaseWidget_RadarStuff->SetVisibility(x3c_25_visibleDebug && x3c_24_visibleGame, ETraversalMode::Children); } void CHudRadarInterface::Draw(const CStateManager& mgr, float alpha) { alpha *= g_GameState->GameOptions().GetHUDAlpha() / 255.f; if (g_tweakGui->GetHudVisMode() == ITweakGui::EHudVisMode::Zero || !x3c_24_visibleGame || !x0_txtrRadarPaint || - !x0_txtrRadarPaint.IsLoaded()) + !x0_txtrRadarPaint.IsLoaded()) { return; + } SRadarPaintDrawParms drawParms; - CPlayer& player = mgr.GetPlayer(); + const CPlayer& player = mgr.GetPlayer(); if (player.IsOverrideRadarRadius()) { drawParms.x78_xyRadius = player.GetRadarXYRadiusOverride(); drawParms.x7c_zRadius = player.GetRadarZRadiusOverride(); @@ -102,13 +109,13 @@ void CHudRadarInterface::Draw(const CStateManager& mgr, float alpha) { drawParms.x6c_scopeRadius = g_tweakGui->GetRadarScopeCoordRadius(); drawParms.x70_scopeScalar = drawParms.x6c_scopeRadius / drawParms.x78_xyRadius; - float camZ = + const float camZ = zeus::CEulerAngles(zeus::CQuaternion(mgr.GetCameraManager()->GetCurrentCamera(mgr)->GetTransform().basis)).z(); zeus::CRelAngle angleZ(camZ); angleZ.makeRel(); drawParms.xc_preTranslate = zeus::CTransform::RotateY(angleZ); drawParms.x3c_postTranslate = x40_BaseWidget_RadarStuff->GetWorldTransform(); - float enemyRadius = g_tweakGui->GetRadarEnemyPaintRadius(); + const float enemyRadius = g_tweakGui->GetRadarEnemyPaintRadius(); m_paintInsts.clear(); x44_camera->Draw(CGuiWidgetDrawParms{0.f, zeus::CVector3f{}}); @@ -118,7 +125,7 @@ void CHudRadarInterface::Draw(const CStateManager& mgr, float alpha) { playerColor.a() *= alpha; DoDrawRadarPaint(zeus::skZero3f, g_tweakGui->GetRadarPlayerPaintRadius(), playerColor); - zeus::CAABox radarBounds( + const zeus::CAABox radarBounds( player.GetTranslation().x() - drawParms.x78_xyRadius, player.GetTranslation().y() - drawParms.x78_xyRadius, player.GetTranslation().z() - drawParms.x7c_zRadius, player.GetTranslation().x() + drawParms.x78_xyRadius, player.GetTranslation().y() + drawParms.x78_xyRadius, player.GetTranslation().z() + drawParms.x7c_zRadius); @@ -132,15 +139,17 @@ void CHudRadarInterface::Draw(const CStateManager& mgr, float alpha) { drawParms.x0_playerPos = mgr.GetPlayer().GetTranslation(); drawParms.x74_alpha = alpha; - for (TUniqueId id : nearList) { - if (TCastToConstPtr act = mgr.GetObjectById(id)) { - if (!act->GetActive()) + for (const TUniqueId id : nearList) { + if (const TCastToConstPtr act = mgr.GetObjectById(id)) { + if (!act->GetActive()) { continue; - if (TCastToConstPtr swarm = act.GetPtr()) { - float radius = enemyRadius * 0.5f; + } + if (const TCastToConstPtr swarm = act.GetPtr()) { + const float radius = enemyRadius * 0.5f; for (const CWallCrawlerSwarm::CBoid& boid : swarm->GetBoids()) { - if (!boid.GetActive()) + if (!boid.GetActive()) { continue; + } DrawRadarPaint(boid.GetTranslation(), radius, 0.5f, drawParms); } } else { From c8be142846f1083f19d583b421f58f3b0d4d30ea Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 14:52:31 -0400 Subject: [PATCH 137/224] CHudDecoInterface: Make virtual calls in constructor explicitly qualified Virtual functions called in a constructor or destructor are statically resolved. Given this is a potential source of bugs, we qualify these functions to make it explicit that this is indeed the kind of behavior desired. --- Runtime/GuiSys/CHudDecoInterface.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Runtime/GuiSys/CHudDecoInterface.cpp b/Runtime/GuiSys/CHudDecoInterface.cpp index d85df6618..c709ca9d3 100644 --- a/Runtime/GuiSys/CHudDecoInterface.cpp +++ b/Runtime/GuiSys/CHudDecoInterface.cpp @@ -34,7 +34,7 @@ CHudDecoInterfaceCombat::CHudDecoInterfaceCombat(CGuiFrame& selHud) { x78_basewidget_tickdeco0->SetColor(g_tweakGuiColors->GetTickDecoColor()); x38_basePosition = x7c_basewidget_frame->GetLocalPosition(); x44_baseRotation = x7c_basewidget_frame->GetLocalTransform().buildMatrix3f(); - UpdateHudAlpha(); + CHudDecoInterfaceCombat::UpdateHudAlpha(); } void CHudDecoInterfaceCombat::UpdateVisibility() { @@ -127,7 +127,7 @@ CHudDecoInterfaceScan::CHudDecoInterfaceScan(CGuiFrame& selHud) : x14_selHud(sel x250_basewidget_rightside->SetLocalPosition(x250_basewidget_rightside->RotateO2P(x224_rightsidePosition - sidesPos)); x234_sidesPositioner = FLT_MAX; - UpdateHudAlpha(); + CHudDecoInterfaceScan::UpdateHudAlpha(); } void CHudDecoInterfaceScan::UpdateVisibility() { @@ -377,7 +377,7 @@ CHudDecoInterfaceXRay::CHudDecoInterfaceXRay(CGuiFrame& selHud) { if (CGuiWidget* w = selHud.FindWidget("model_threatslider")) w->SetDepthWrite(true); - UpdateHudAlpha(); + CHudDecoInterfaceXRay::UpdateHudAlpha(); } void CHudDecoInterfaceXRay::UpdateVisibility() { From 4e6150acc467ce3a9e573d77e3b861b8f2a805e6 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 14:54:12 -0400 Subject: [PATCH 138/224] CHudDecoInterface: Make missed virtual call in constructor explicit Missed this one in the previous commit. --- Runtime/GuiSys/CHudDecoInterface.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/GuiSys/CHudDecoInterface.cpp b/Runtime/GuiSys/CHudDecoInterface.cpp index c709ca9d3..60ad8e98c 100644 --- a/Runtime/GuiSys/CHudDecoInterface.cpp +++ b/Runtime/GuiSys/CHudDecoInterface.cpp @@ -482,7 +482,7 @@ CHudDecoInterfaceThermal::CHudDecoInterfaceThermal(CGuiFrame& selHud) { } x14_pivotPosition = x78_basewidget_pivot->GetIdlePosition(); - UpdateHudAlpha(); + CHudDecoInterfaceThermal::UpdateHudAlpha(); } void CHudDecoInterfaceThermal::UpdateVisibility() { From 67786721ffb192c15c0678d5859e1d3b44cb2c60 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 14:59:44 -0400 Subject: [PATCH 139/224] CHudBossEnergyInterface: Make use of structured bindings in constructor Same behavior, minus a verbose type name. --- Runtime/GuiSys/CHudBossEnergyInterface.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Runtime/GuiSys/CHudBossEnergyInterface.cpp b/Runtime/GuiSys/CHudBossEnergyInterface.cpp index b66374957..3532223d1 100644 --- a/Runtime/GuiSys/CHudBossEnergyInterface.cpp +++ b/Runtime/GuiSys/CHudBossEnergyInterface.cpp @@ -15,10 +15,11 @@ CHudBossEnergyInterface::CHudBossEnergyInterface(CGuiFrame& selHud) { x18_energybart01_bossbar->SetCoordFunc(BossEnergyCoordFunc); x18_energybart01_bossbar->SetTesselation(0.2f); - ITweakGuiColors::VisorEnergyBarColors barColors = g_tweakGuiColors->GetVisorEnergyBarColors(0); - x18_energybart01_bossbar->SetFilledColor(barColors.filled); - x18_energybart01_bossbar->SetShadowColor(barColors.shadow); - x18_energybart01_bossbar->SetEmptyColor(barColors.empty); + + const auto& [filled, empty, shadow] = g_tweakGuiColors->GetVisorEnergyBarColors(0); + x18_energybart01_bossbar->SetFilledColor(filled); + x18_energybart01_bossbar->SetShadowColor(shadow); + x18_energybart01_bossbar->SetEmptyColor(empty); } void CHudBossEnergyInterface::Update(float dt) { From 6806d4914cf62c8a067b6332d2131131e3dc179d Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 15:00:42 -0400 Subject: [PATCH 140/224] CHudBossEnergyInterface: Initialize x0_alpha on construction Provides a deterministic initial state which is helpful for debugging. --- Runtime/GuiSys/CHudBossEnergyInterface.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/GuiSys/CHudBossEnergyInterface.hpp b/Runtime/GuiSys/CHudBossEnergyInterface.hpp index 71263c16f..c9e94f22d 100644 --- a/Runtime/GuiSys/CHudBossEnergyInterface.hpp +++ b/Runtime/GuiSys/CHudBossEnergyInterface.hpp @@ -10,7 +10,7 @@ class CGuiTextPane; class CGuiWidget; class CHudBossEnergyInterface { - float x0_alpha; + float x0_alpha = 0.f; float x4_fader = 0.f; float x8_curEnergy = 0.f; float xc_maxEnergy = 0.f; From 654e3e705ea65e65eda4b14ccbd0de1a186ec18d Mon Sep 17 00:00:00 2001 From: Luke Street Date: Mon, 13 Apr 2020 15:01:57 -0400 Subject: [PATCH 141/224] Update hecl; disable MP1_VARIABLE_DELTA_TIME --- Runtime/MP1/MP1.cpp | 2 +- Runtime/MP1/MP1.hpp | 2 +- hecl | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Runtime/MP1/MP1.cpp b/Runtime/MP1/MP1.cpp index ee5eb0094..ac4a6bf10 100644 --- a/Runtime/MP1/MP1.cpp +++ b/Runtime/MP1/MP1.cpp @@ -844,7 +844,7 @@ bool CMain::Proc() { m_firstFrame = false; } else { using delta_duration = std::chrono::duration>; - dt = std::min(std::chrono::duration_cast(now - m_prevFrameTime).count(), dt); + dt = std::min(std::chrono::duration_cast(now - m_prevFrameTime).count(), 1 / 30.f); } m_prevFrameTime = now; #endif diff --git a/Runtime/MP1/MP1.hpp b/Runtime/MP1/MP1.hpp index eea752799..62eb6d958 100644 --- a/Runtime/MP1/MP1.hpp +++ b/Runtime/MP1/MP1.hpp @@ -4,7 +4,7 @@ #define MP1_USE_BOO 0 #endif #ifndef MP1_VARIABLE_DELTA_TIME -#define MP1_VARIABLE_DELTA_TIME 1 +#define MP1_VARIABLE_DELTA_TIME 0 #endif #include "IMain.hpp" diff --git a/hecl b/hecl index f64ed44fe..29c768f82 160000 --- a/hecl +++ b/hecl @@ -1 +1 @@ -Subproject commit f64ed44fe8164b06ed5bef6344d9f743e2c5d638 +Subproject commit 29c768f8231fac3b1c6812829faa42457e98b47f From 50ba80247b7a4fdf3689a5662911237bcb5d4e4f Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 16:16:15 -0400 Subject: [PATCH 142/224] CTextExecuteBuffer: Initialize xac_curY and xb0_curX in the constructor Provides a deterministic initial state upon construction for easier debugging. --- Runtime/GuiSys/CTextExecuteBuffer.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Runtime/GuiSys/CTextExecuteBuffer.hpp b/Runtime/GuiSys/CTextExecuteBuffer.hpp index e84d1043d..eaf976e11 100644 --- a/Runtime/GuiSys/CTextExecuteBuffer.hpp +++ b/Runtime/GuiSys/CTextExecuteBuffer.hpp @@ -27,8 +27,8 @@ class CTextExecuteBuffer { CBlockInstruction* xa0_curBlock = nullptr; CLineInstruction* xa4_curLine = nullptr; InstList::iterator xa8_curWordIt; - s32 xac_curY; - s32 xb0_curX; + s32 xac_curY = 0; + s32 xb0_curX = 0; s32 xb4_curWordX = 0; s32 xb8_curWordY = 0; s32 xbc_spaceDistance = 0; From 786675f307d21e62635c2f130e82ed9c57eeb447 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 16:18:38 -0400 Subject: [PATCH 143/224] CTextExecuteBuffer: Move initialization of xa8_curWordIt into initializer list --- Runtime/GuiSys/CTextExecuteBuffer.hpp | 2 +- hecl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Runtime/GuiSys/CTextExecuteBuffer.hpp b/Runtime/GuiSys/CTextExecuteBuffer.hpp index eaf976e11..e7dd10e75 100644 --- a/Runtime/GuiSys/CTextExecuteBuffer.hpp +++ b/Runtime/GuiSys/CTextExecuteBuffer.hpp @@ -37,7 +37,7 @@ class CTextExecuteBuffer { u32 xd8_ = 0; public: - CTextExecuteBuffer() { xa8_curWordIt = x0_instList.begin(); } + CTextExecuteBuffer() : xa8_curWordIt{x0_instList.begin()} {} CTextRenderBuffer BuildRenderBuffer(CGuiWidget::EGuiModelDrawFlags df) const; CTextRenderBuffer BuildRenderBufferPage(InstList::const_iterator start, InstList::const_iterator pgStart, diff --git a/hecl b/hecl index 29c768f82..f64ed44fe 160000 --- a/hecl +++ b/hecl @@ -1 +1 @@ -Subproject commit 29c768f8231fac3b1c6812829faa42457e98b47f +Subproject commit f64ed44fe8164b06ed5bef6344d9f743e2c5d638 From 93622d9b4bff91471528c8f54d1560935b2c2449 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 16:20:47 -0400 Subject: [PATCH 144/224] CIntElement: Initialize x14_holdVal in CIESampleAndHold Provides a deterministic initial state upon construction, which makes for nicer debugging. --- Runtime/Particle/CIntElement.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Particle/CIntElement.hpp b/Runtime/Particle/CIntElement.hpp index f2a8a4267..f9d490b86 100644 --- a/Runtime/Particle/CIntElement.hpp +++ b/Runtime/Particle/CIntElement.hpp @@ -137,7 +137,7 @@ class CIESampleAndHold : public CIntElement { mutable int x8_nextSampleFrame = 0; std::unique_ptr xc_waitFramesMin; std::unique_ptr x10_waitFramesMax; - mutable int x14_holdVal; + mutable int x14_holdVal = 0; public: CIESampleAndHold(std::unique_ptr&& a, std::unique_ptr&& b, std::unique_ptr&& c) From 5b9a689703102204db427b403b058acf43f438c7 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 16:23:05 -0400 Subject: [PATCH 145/224] CParticleSwoosh: Initialize x68_frame on construction Provides a deterministic initial state, which makes for nicer debugging. --- Runtime/Particle/CParticleSwoosh.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Particle/CParticleSwoosh.hpp b/Runtime/Particle/CParticleSwoosh.hpp index 626e976a5..f72ae7fcb 100644 --- a/Runtime/Particle/CParticleSwoosh.hpp +++ b/Runtime/Particle/CParticleSwoosh.hpp @@ -34,7 +34,7 @@ class CParticleSwoosh : public CParticleGen { float x30_irot; // Rotation bias once per system update float x34_rotm; // Rotation bias once per particle instance zeus::CTransform x38_orientation; // Updated by user code - int x68_frame; // Frame index of evaluated data + int x68_frame = 0; // Frame index of evaluated data zeus::CColor x6c_color; // Updated by COLR int x70_startFrame; zeus::CVector3f x74_velocity; From 498c9404798cf439bbdc8e47c87e5cc242c664d1 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 16:25:34 -0400 Subject: [PATCH 146/224] CFluidPlane: Initialize all members of SRippleInfo Provides a deterministic initial state, which is useful for debugging. --- Runtime/World/CFluidPlane.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Runtime/World/CFluidPlane.hpp b/Runtime/World/CFluidPlane.hpp index 4bb69e546..817ed97fe 100644 --- a/Runtime/World/CFluidPlane.hpp +++ b/Runtime/World/CFluidPlane.hpp @@ -84,10 +84,10 @@ public: struct SRippleInfo { const CRipple& x0_ripple; - int x4_fromX; - int x8_toX; - int xc_fromY; - int x10_toY; + int x4_fromX = 0; + int x8_toX = 0; + int xc_fromY = 0; + int x10_toY = 0; int x14_gfromX; int x18_gtoX; int x1c_gfromY; From 9f21f8ef5563294c842b3affbbcf97b923cefcba Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 16:27:18 -0400 Subject: [PATCH 147/224] CFluidPlaneCPU: Initialize m_cachedDoubleLightmapBlend and m_cachedAdditive Provides a deterministic initial state upon construction. --- Runtime/World/CFluidPlaneCPU.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Runtime/World/CFluidPlaneCPU.hpp b/Runtime/World/CFluidPlaneCPU.hpp index b7a569d5a..3b4b4d311 100644 --- a/Runtime/World/CFluidPlaneCPU.hpp +++ b/Runtime/World/CFluidPlaneCPU.hpp @@ -60,8 +60,8 @@ protected: u32 m_maxVertCount; bool m_tessellation = false; - bool m_cachedDoubleLightmapBlend; - bool m_cachedAdditive; + bool m_cachedDoubleLightmapBlend = false; + bool m_cachedAdditive = false; static bool PrepareRipple(const CRipple& ripple, const CFluidPlaneRender::SPatchInfo& info, CFluidPlaneRender::SRippleInfo& rippleOut); From a554e5d4a608cc84c2eb87d0e203878d051eea2a Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 16:29:09 -0400 Subject: [PATCH 148/224] CPathFindSearch: Initialize xcc_result in constructor Provides a deterministic initial state upon construction. --- Runtime/World/CPathFindSearch.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/World/CPathFindSearch.hpp b/Runtime/World/CPathFindSearch.hpp index 1843b6042..26eeef532 100644 --- a/Runtime/World/CPathFindSearch.hpp +++ b/Runtime/World/CPathFindSearch.hpp @@ -27,7 +27,7 @@ private: CPFArea* x0_area; rstl::reserved_vector x4_waypoints; u32 xc8_curWaypoint = 0; - EResult xcc_result; + EResult xcc_result{}; float xd0_chHeight; float xd4_chRadius; float xd8_padding = 10.f; From 4341dfae50e4f3e901d67b98f31bfeb90145be5a Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 16:31:25 -0400 Subject: [PATCH 149/224] CScriptPickup: Initialize x274_tractorTime in constructor Provides a deterministic initial state upon construction. --- Runtime/World/CScriptPickup.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/World/CScriptPickup.hpp b/Runtime/World/CScriptPickup.hpp index 234d9fde2..ec4e5b0ba 100644 --- a/Runtime/World/CScriptPickup.hpp +++ b/Runtime/World/CScriptPickup.hpp @@ -15,7 +15,7 @@ class CScriptPickup : public CPhysicsActor { float x268_fadeInTime; float x26c_lifeTime; float x270_curTime = 0.f; - float x274_tractorTime; + float x274_tractorTime = 0.f; float x278_delayTimer; TLockedToken x27c_pickupParticleDesc; From 0d97104cf28624ce8a1d108ce0590f2b8271ec35 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 16:32:39 -0400 Subject: [PATCH 150/224] CScriptSpindleCamera: Initialize x33c_24_inResetThink in constructor Provides a deterministic initial state. --- Runtime/World/CScriptSpindleCamera.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/World/CScriptSpindleCamera.hpp b/Runtime/World/CScriptSpindleCamera.hpp index 5f6fe7983..4e9d15d8f 100644 --- a/Runtime/World/CScriptSpindleCamera.hpp +++ b/Runtime/World/CScriptSpindleCamera.hpp @@ -78,7 +78,7 @@ class CScriptSpindleCamera : public CGameCamera { float x328_maxAzimuthInterpTimer = 0.f; bool x32c_outsideClampedAzimuth = false; zeus::CVector3f x330_lookDir; - bool x33c_24_inResetThink; + bool x33c_24_inResetThink = false; float GetInVar(const SSpindleProperty& seg) const { return x18c_inVars[int(seg.x4_input)]; } From 7fcd6f41cff70459e57f1db55754b5381104a7f3 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 16:34:15 -0400 Subject: [PATCH 151/224] CStateMachine: Initialize data members where applicable Provides a deterministic initial state. --- Runtime/World/CStateMachine.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Runtime/World/CStateMachine.hpp b/Runtime/World/CStateMachine.hpp index 5de15655a..7964294f6 100644 --- a/Runtime/World/CStateMachine.hpp +++ b/Runtime/World/CStateMachine.hpp @@ -50,8 +50,8 @@ class CAiState { friend class CStateMachineState; CAiStateFunc x0_func; char xc_name[32] = {}; - u32 x2c_numTriggers; - CAiTrigger* x30_firstTrigger; + u32 x2c_numTriggers = 0; + CAiTrigger* x30_firstTrigger = nullptr; public: CAiState(CAiStateFunc func, const char* name) { @@ -88,7 +88,7 @@ class CStateMachineState { float x8_time = 0.f; float xc_random = 0.f; float x10_delay = 0.f; - float x14_; + float x14_ = 0.f; bool x18_24_codeTrigger : 1; public: From 2850b7e7fbd2b79ebdfd8c84eadb9cf910c1c5a0 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 16:36:21 -0400 Subject: [PATCH 152/224] CWallCrawlerSwarm: Initialize all CBoid members Provides a deterministic initial state. --- Runtime/World/CWallCrawlerSwarm.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Runtime/World/CWallCrawlerSwarm.hpp b/Runtime/World/CWallCrawlerSwarm.hpp index 8bc77ee5e..88381b209 100644 --- a/Runtime/World/CWallCrawlerSwarm.hpp +++ b/Runtime/World/CWallCrawlerSwarm.hpp @@ -38,7 +38,7 @@ public: CCollisionSurface x50_surface = CCollisionSurface(zeus::CVector3f(0.f, 0.f, 1.f), zeus::CVector3f(0.f, 1.f, 0.f), zeus::CVector3f(1.f, 0.f, 0.f), 0xffffffff); - float x78_health; + float x78_health = 0.f; int x7c_framesNotOnSurface : 8; int x7c_idx : 10; int x7c_remainingLaunchNotOnSurfaceFrames : 8; @@ -53,6 +53,7 @@ public: : x0_xf(xf) , x7c_framesNotOnSurface(0) , x7c_idx(idx) + , x7c_remainingLaunchNotOnSurfaceFrames(0) , x80_24_active(false) , x80_25_inFrustum(false) , x80_26_launched(false) From c6278c0e9facb676332dddd61a851f774e9465f0 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 16:41:24 -0400 Subject: [PATCH 153/224] CCompoundTargetReticle: Initialize all data members Provides deterministic initial state. --- Runtime/GuiSys/CCompoundTargetReticle.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Runtime/GuiSys/CCompoundTargetReticle.hpp b/Runtime/GuiSys/CCompoundTargetReticle.hpp index 6a6b4da8b..dec5f904d 100644 --- a/Runtime/GuiSys/CCompoundTargetReticle.hpp +++ b/Runtime/GuiSys/CCompoundTargetReticle.hpp @@ -120,9 +120,9 @@ private: bool x219_missileShot = false; bool x21a_fullyCharged = false; u8 x21b_ = 0; - u32 x21c_; - u32 x220_; - u32 x228_; + u32 x21c_ = 0; + u32 x220_ = 0; + u32 x228_ = 0; struct SScanReticuleRenderer { std::optional m_lineRenderers[2]; From e26afe887f97614696da6e1b5ceeabc1198dd00d Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 16:44:39 -0400 Subject: [PATCH 154/224] CCompoundTargetReticle: Make use of std::array where applicable Same behavior, stronger typing. While we're at it, we can eliminate a case of variable shadowing. --- Runtime/GuiSys/CCompoundTargetReticle.cpp | 29 ++++++++++++----------- Runtime/GuiSys/CCompoundTargetReticle.hpp | 5 ++-- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/Runtime/GuiSys/CCompoundTargetReticle.cpp b/Runtime/GuiSys/CCompoundTargetReticle.cpp index af9e138d1..9430ac06c 100644 --- a/Runtime/GuiSys/CCompoundTargetReticle.cpp +++ b/Runtime/GuiSys/CCompoundTargetReticle.cpp @@ -71,10 +71,11 @@ CCompoundTargetReticle::CCompoundTargetReticle(const CStateManager& mgr) CCompoundTargetReticle::SScanReticuleRenderer::SScanReticuleRenderer() { CGraphics::CommitResources([this](boo::IGraphicsDataFactory::Context& ctx) { - for (int i = 0; i < 2; ++i) { + for (size_t i = 0; i < m_lineRenderers.size(); ++i) { m_lineRenderers[i].emplace(ctx, CLineRenderer::EPrimitiveMode::Lines, 8, nullptr, true, true); - for (int j = 0; j < 4; ++j) - m_stripRenderers[i][j].emplace(ctx, CLineRenderer::EPrimitiveMode::LineStrip, 4, nullptr, true, true); + for (auto& stripRenderer : m_stripRenderers[i]) { + stripRenderer.emplace(ctx, CLineRenderer::EPrimitiveMode::LineStrip, 4, nullptr, true, true); + } } return true; } BooTrace); @@ -822,8 +823,8 @@ void CCompoundTargetReticle::DrawNextLockOnGroup(const zeus::CMatrix3f& rot, con float alpha = 0.5f * factor; zeus::CColor color = g_tweakGuiColors->GetScanReticuleColor(); color.a() *= alpha; - for (int i = 0; i < 2; ++i) { - float lineWidth = i ? 2.5f : 1.f; + for (size_t i = 0; i < m_scanRetRenderer.m_lineRenderers.size(); ++i) { + float lineWidth = i != 0 ? 2.5f : 1.f; auto& rend = *m_scanRetRenderer.m_lineRenderers[i]; rend.Reset(); rend.AddVertex({-0.5f, 0.f, 0.f}, color, lineWidth); @@ -836,17 +837,17 @@ void CCompoundTargetReticle::DrawNextLockOnGroup(const zeus::CMatrix3f& rot, con rend.AddVertex({0.f, 0.f, 20.5f}, color, lineWidth); rend.Render(); - for (int j = 0; j < 4; ++j) { + for (size_t j = 0; j < m_scanRetRenderer.m_stripRenderers[i].size(); ++j) { float xSign = j < 2 ? -1.f : 1.f; - float zSign = (j & 0x1) ? -1.f : 1.f; + float zSign = (j & 0x1) != 0 ? -1.f : 1.f; // begin line strip - auto& rend = *m_scanRetRenderer.m_stripRenderers[i][j]; - rend.Reset(); - rend.AddVertex({0.5f * xSign, 0.f, 0.1f * zSign}, color, lineWidth); - rend.AddVertex({0.5f * xSign, 0.f, 0.35f * zSign}, color, lineWidth); - rend.AddVertex({0.35f * xSign, 0.f, 0.5f * zSign}, color, lineWidth); - rend.AddVertex({0.1f * xSign, 0.f, 0.5f * zSign}, color, lineWidth); - rend.Render(); + auto& stripRend = *m_scanRetRenderer.m_stripRenderers[i][j]; + stripRend.Reset(); + stripRend.AddVertex({0.5f * xSign, 0.f, 0.1f * zSign}, color, lineWidth); + stripRend.AddVertex({0.5f * xSign, 0.f, 0.35f * zSign}, color, lineWidth); + stripRend.AddVertex({0.35f * xSign, 0.f, 0.5f * zSign}, color, lineWidth); + stripRend.AddVertex({0.1f * xSign, 0.f, 0.5f * zSign}, color, lineWidth); + stripRend.Render(); } } } diff --git a/Runtime/GuiSys/CCompoundTargetReticle.hpp b/Runtime/GuiSys/CCompoundTargetReticle.hpp index dec5f904d..5049a1c45 100644 --- a/Runtime/GuiSys/CCompoundTargetReticle.hpp +++ b/Runtime/GuiSys/CCompoundTargetReticle.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include "Runtime/CPlayerState.hpp" @@ -125,8 +126,8 @@ private: u32 x228_ = 0; struct SScanReticuleRenderer { - std::optional m_lineRenderers[2]; - std::optional m_stripRenderers[2][4]; + std::array, 2> m_lineRenderers; + std::array, 4>, 2> m_stripRenderers; SScanReticuleRenderer(); }; SScanReticuleRenderer m_scanRetRenderer; From 1767338aba818a1a4d024c3e3ba3e42a94264219 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 16:51:59 -0400 Subject: [PATCH 155/224] CCompoundTargetReticle: Make eliminate hardcoded size We can just query the capacity to dehardcode it. --- Runtime/GuiSys/CCompoundTargetReticle.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Runtime/GuiSys/CCompoundTargetReticle.cpp b/Runtime/GuiSys/CCompoundTargetReticle.cpp index 9430ac06c..49e553d1f 100644 --- a/Runtime/GuiSys/CCompoundTargetReticle.cpp +++ b/Runtime/GuiSys/CCompoundTargetReticle.cpp @@ -64,8 +64,9 @@ CCompoundTargetReticle::CCompoundTargetReticle(const CStateManager& mgr) , x100_laggingTargetPos(CalculateOrbitZoneReticlePosition(mgr, true)) , x208_lockonTimer(g_tweakTargeting->GetLockonDuration()) { xe0_outerBeamIconSquares.reserve(9); - for (u32 i = 0; i < 9; ++i) + for (size_t i = 0; i < xe0_outerBeamIconSquares.capacity(); ++i) { xe0_outerBeamIconSquares.emplace_back(fmt::format(FMT_STRING("{}{}"), skOuterBeamIconSquareNameBase, i)); + } x34_crosshairs.Lock(); } From 85f930ef2e06bf590b29c126663aeed32d749c5e Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 16:54:40 -0400 Subject: [PATCH 156/224] CCompoundTargetReticle: Convert unnecessary floats into bools Using floats here is extremely suspect and almost certainly unintentional. --- Runtime/GuiSys/CCompoundTargetReticle.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Runtime/GuiSys/CCompoundTargetReticle.cpp b/Runtime/GuiSys/CCompoundTargetReticle.cpp index 49e553d1f..4c7c5fa50 100644 --- a/Runtime/GuiSys/CCompoundTargetReticle.cpp +++ b/Runtime/GuiSys/CCompoundTargetReticle.cpp @@ -117,10 +117,10 @@ void CCompoundTargetReticle::Update(float dt, const CStateManager& mgr) { } if (x20_prevState != x24_nextState && x28_noDrawTicks <= 0) { x20_prevState = x24_nextState; - float combat = false; - float scan = false; - float xray = false; - float thermal = false; + bool combat = false; + bool scan = false; + bool xray = false; + bool thermal = false; switch (x24_nextState) { case EReticleState::Combat: combat = true; From 2c7d10c4b47fa28bd1c94c7921e4b6b2276d1aef Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 17:03:38 -0400 Subject: [PATCH 157/224] CCompoundTargetReticle: Brace statements where applicable --- Runtime/GuiSys/CCompoundTargetReticle.cpp | 527 +++++++++++++--------- 1 file changed, 315 insertions(+), 212 deletions(-) diff --git a/Runtime/GuiSys/CCompoundTargetReticle.cpp b/Runtime/GuiSys/CCompoundTargetReticle.cpp index 4c7c5fa50..684a56455 100644 --- a/Runtime/GuiSys/CCompoundTargetReticle.cpp +++ b/Runtime/GuiSys/CCompoundTargetReticle.cpp @@ -97,12 +97,13 @@ CCompoundTargetReticle::EReticleState CCompoundTargetReticle::GetDesiredReticleS } void CCompoundTargetReticle::Update(float dt, const CStateManager& mgr) { - float angle = x10_laggingOrientation.angleFrom(x0_leadingOrientation).asDegrees(); + const float angle = x10_laggingOrientation.angleFrom(x0_leadingOrientation).asDegrees(); float t; - if (angle < 0.1f || angle > 45.f) + if (angle < 0.1f || angle > 45.f) { t = 1.f; - else + } else { t = std::min(1.f, g_tweakTargeting->GetAngularLagSpeed() * dt / angle); + } x10_laggingOrientation = t == 1.f ? x0_leadingOrientation : zeus::CQuaternion::slerp(x10_laggingOrientation, x0_leadingOrientation, t); xf4_targetPos = CalculateOrbitZoneReticlePosition(mgr, false); @@ -110,7 +111,7 @@ void CCompoundTargetReticle::Update(float dt, const CStateManager& mgr) { UpdateCurrLockOnGroup(dt, mgr); UpdateNextLockOnGroup(dt, mgr); UpdateOrbitZoneGroup(dt, mgr); - EReticleState desiredState = GetDesiredReticleState(mgr); + const EReticleState desiredState = GetDesiredReticleState(mgr); if (desiredState != x20_prevState && x20_prevState == x24_nextState) { x24_nextState = desiredState; x28_noDrawTicks = 2; @@ -137,90 +138,110 @@ void CCompoundTargetReticle::Update(float dt, const CStateManager& mgr) { default: break; } - if (combat) + if (combat) { x40_seeker.Lock(); - else + } else { x40_seeker.Unlock(); - if (combat) + } + if (combat) { x4c_lockConfirm.Lock(); - else + } else { x4c_lockConfirm.Unlock(); - if (combat) + } + if (combat) { x58_targetFlower.Lock(); - else + } else { x58_targetFlower.Unlock(); - if (combat) + } + if (combat) { x64_missileBracket.Lock(); - else + } else { x64_missileBracket.Unlock(); - if (combat) + } + if (combat) { x70_innerBeamIcon.Lock(); - else + } else { x70_innerBeamIcon.Unlock(); - if (combat) + } + if (combat) { x7c_lockFire.Lock(); - else + } else { x7c_lockFire.Unlock(); - if (combat) + } + if (combat) { x88_lockDagger.Lock(); - else + } else { x88_lockDagger.Unlock(); - if (combat) + } + if (combat) { xa0_chargeTickFirst.Lock(); - else + } else { xa0_chargeTickFirst.Unlock(); - if (xray) + } + if (xray) { xac_xrayRetRing.Lock(); - else + } else { xac_xrayRetRing.Unlock(); - if (thermal) + } + if (thermal) { xb8_thermalReticle.Lock(); - else + } else { xb8_thermalReticle.Unlock(); - if (combat) + } + if (combat) { xc4_chargeGauge.x0_model.Lock(); - else + } else { xc4_chargeGauge.x0_model.Unlock(); - if (!scan) + } + if (!scan) { x94_grapple.Lock(); - else + } else { x94_grapple.Unlock(); + } for (SOuterItemInfo& info : xe0_outerBeamIconSquares) { - if (combat) + if (combat) { info.x0_model.Lock(); - else + } else { info.x0_model.Unlock(); + } } } - CPlayerGun* gun = mgr.GetPlayer().GetPlayerGun(); - bool fullyCharged = (gun->IsCharging() ? gun->GetChargeBeamFactor() : 0.f) >= 1.f; - if (fullyCharged != x21a_fullyCharged) + + const CPlayerGun* gun = mgr.GetPlayer().GetPlayerGun(); + const bool fullyCharged = (gun->IsCharging() ? gun->GetChargeBeamFactor() : 0.f) >= 1.f; + if (fullyCharged != x21a_fullyCharged) { x21a_fullyCharged = fullyCharged; - if (x21a_fullyCharged) + } + if (x21a_fullyCharged) { x214_fullChargeFadeTimer = std::min(dt / g_tweakTargeting->GetFullChargeFadeDuration() + x214_fullChargeFadeTimer, g_tweakTargeting->GetFullChargeFadeDuration()); - else + } else { x214_fullChargeFadeTimer = std::max(x214_fullChargeFadeTimer - dt / g_tweakTargeting->GetFullChargeFadeDuration(), 0.f); - bool missileActive = gun->GetMissleMode() == CPlayerGun::EMissleMode::Active; + } + + const bool missileActive = gun->GetMissleMode() == CPlayerGun::EMissleMode::Active; if (missileActive != x1f4_missileActive) { - if (x1f8_missileBracketTimer != 0.f) + if (x1f8_missileBracketTimer != 0.f) { x1f8_missileBracketTimer = FLT_EPSILON - x1f8_missileBracketTimer; - else + } else { x1f8_missileBracketTimer = FLT_EPSILON; + } x1f4_missileActive = missileActive; } - CPlayerState::EBeamId beam = gun->GetCurrentBeam(); + + const CPlayerState::EBeamId beam = gun->GetCurrentBeam(); if (beam != x200_beam) { x204_chargeGaugeOvershootTimer = g_tweakTargeting->GetChargeGaugeOvershootDuration(); - for (int i = 0; i < 9; ++i) { + for (size_t i = 0; i < xe0_outerBeamIconSquares.size(); ++i) { zeus::CRelAngle baseAngle = g_tweakTargeting->GetOuterBeamSquareAngles(int(beam))[i]; baseAngle.makeRel(); SOuterItemInfo& icon = xe0_outerBeamIconSquares[i]; zeus::CRelAngle offshootAngleDelta = baseAngle.asRadians() - icon.x10_rotAng; - if ((i & 0x1) == 1) + if ((i & 0x1) == 1) { offshootAngleDelta = (baseAngle > 0.f) ? zeus::CRelAngle(-2.f * M_PIF - baseAngle) : zeus::CRelAngle(2.f * M_PIF + baseAngle); + } icon.xc_offshootBaseAngle = icon.x10_rotAng; icon.x18_offshootAngleDelta = offshootAngleDelta; icon.x14_baseAngle = baseAngle; @@ -228,36 +249,43 @@ void CCompoundTargetReticle::Update(float dt, const CStateManager& mgr) { zeus::CRelAngle baseAngle = g_tweakTargeting->GetChargeGaugeAngle(int(beam)); baseAngle.makeRel(); float offshootAngleDelta = baseAngle.asRadians() - xc4_chargeGauge.x10_rotAng; - if ((rand() & 0x1) == 1) + if ((rand() & 0x1) == 1) { offshootAngleDelta = (offshootAngleDelta > 0.f) ? -2.f * M_PIF - offshootAngleDelta : 2.f * M_PIF + offshootAngleDelta; + } xc4_chargeGauge.xc_offshootBaseAngle = xc4_chargeGauge.x10_rotAng; xc4_chargeGauge.x18_offshootAngleDelta = offshootAngleDelta; xc4_chargeGauge.x14_baseAngle = baseAngle; x200_beam = beam; x208_lockonTimer = 0.f; } - if (gun->GetLastFireButtonStates() & 0x1) { - if (!x218_beamShot) + + if ((gun->GetLastFireButtonStates() & 0x1) != 0) { + if (!x218_beamShot) { x210_lockFireTimer = g_tweakTargeting->GetLockFireDuration(); + } x218_beamShot = true; } else { x218_beamShot = false; } - if (gun->GetLastFireButtonStates() & 0x2) { - if (!x219_missileShot) + + if ((gun->GetLastFireButtonStates() & 0x2) != 0) { + if (!x219_missileShot) { x1fc_missileBracketScaleTimer = g_tweakTargeting->GetMissileBracketScaleDuration(); + } x219_missileShot = true; } else { x219_missileShot = false; } - if (TCastToConstPtr point = mgr.GetObjectById(xf2_nextTargetId)) { + + if (const TCastToConstPtr point = mgr.GetObjectById(xf2_nextTargetId)) { if (point->GetUniqueId() != x1dc_grapplePoint0) { float tmp; - if (point->GetUniqueId() == x1de_grapplePoint1) + if (point->GetUniqueId() == x1de_grapplePoint1) { tmp = std::max(FLT_EPSILON, x1e4_grapplePoint1T); - else + } else { tmp = FLT_EPSILON; + } x1de_grapplePoint1 = x1dc_grapplePoint0; x1e4_grapplePoint1T = x1e0_grapplePoint0T; x1e0_grapplePoint0T = tmp; @@ -269,13 +297,18 @@ void CCompoundTargetReticle::Update(float dt, const CStateManager& mgr) { x1e0_grapplePoint0T = 0.f; x1dc_grapplePoint0 = kInvalidUniqueId; } - if (x1e0_grapplePoint0T > 0.f) + + if (x1e0_grapplePoint0T > 0.f) { x1e0_grapplePoint0T = std::min(dt / 0.5f + x1e0_grapplePoint0T, 1.f); + } + if (x1e4_grapplePoint1T > 0.f) { x1e4_grapplePoint1T = std::max(0.f, x1e4_grapplePoint1T - dt / 0.5f); - if (x1e4_grapplePoint1T == 0.f) + if (x1e4_grapplePoint1T == 0.f) { x1de_grapplePoint1 = kInvalidUniqueId; + } } + x1f0_xrayRetAngle = zeus::CRelAngle(zeus::degToRad(g_tweakTargeting->GetXRayRetAngleSpeed() * dt) + x1f0_xrayRetAngle).asRel(); x1ec_seekerAngle = zeus::CRelAngle(zeus::degToRad(g_tweakTargeting->GetSeekerAngleSpeed() * dt) + x1ec_seekerAngle). @@ -285,18 +318,19 @@ void CCompoundTargetReticle::Update(float dt, const CStateManager& mgr) { void CTargetReticleRenderState::InterpolateWithClamp(const CTargetReticleRenderState& a, CTargetReticleRenderState& out, const CTargetReticleRenderState& b, float t) { t = zeus::clamp(0.f, t, 1.f); - float omt = 1.f - t; + const float omt = 1.f - t; out.x4_radiusWorld = omt * a.x4_radiusWorld + t * b.x4_radiusWorld; out.x14_factor = omt * a.x14_factor + t * b.x14_factor; out.x18_minVpClampScale = omt * a.x18_minVpClampScale + t * b.x18_minVpClampScale; out.x8_positionWorld = zeus::CVector3f::lerp(a.x8_positionWorld, b.x8_positionWorld, t); - if (t == 1.f) + if (t == 1.f) { out.x0_target = b.x0_target; - else if (t == 0.f) + } else if (t == 0.f) { out.x0_target = a.x0_target; - else + } else { out.x0_target = kInvalidUniqueId; + } } static bool IsDamageOrbit(CPlayer::EPlayerOrbitRequest req) { @@ -313,13 +347,14 @@ static bool IsDamageOrbit(CPlayer::EPlayerOrbitRequest req) { } void CCompoundTargetReticle::UpdateCurrLockOnGroup(float dt, const CStateManager& mgr) { - TUniqueId targetId = mgr.GetPlayer().GetOrbitTargetId(); + const TUniqueId targetId = mgr.GetPlayer().GetOrbitTargetId(); if (targetId != xf0_targetId) { if (targetId != kInvalidUniqueId) { - if (TCastToConstPtr point = mgr.GetObjectById(targetId)) + if (const TCastToConstPtr point = mgr.GetObjectById(targetId)) { CSfxManager::SfxStart(SFXui_lockon_grapple, 1.f, 0.f, false, 0x7f, false, kInvalidAreaId); - else + } else { CSfxManager::SfxStart(SFXui_lockon_poi, 1.f, 0.f, false, 0x7f, false, kInvalidAreaId); + } } if (targetId == kInvalidUniqueId) { @@ -329,17 +364,20 @@ void CCompoundTargetReticle::UpdateCurrLockOnGroup(float dt, const CStateManager IsDamageOrbit(mgr.GetPlayer().GetOrbitRequest()) ? 0.65f : g_tweakTargeting->GetCurrLockOnEnterDuration(); } else { x12c_currGroupA = x10c_currGroupInterp; - if (xf0_targetId == kInvalidUniqueId) + if (xf0_targetId == kInvalidUniqueId) { x12c_currGroupA.SetTargetId(targetId); + } x14c_currGroupB = CTargetReticleRenderState( targetId, 1.f, zeus::skZero3f, 1.f, IsGrappleTarget(targetId, mgr) ? g_tweakTargeting->GetGrappleMinClampScale() : 1.f, false); x16c_currGroupDur = xf0_targetId == kInvalidUniqueId ? g_tweakTargeting->GetCurrLockOnExitDuration() : g_tweakTargeting->GetCurrLockOnSwitchDuration(); } + x170_currGroupTimer = x16c_currGroupDur; xf0_targetId = targetId; } + if (x170_currGroupTimer > 0.f) { UpdateTargetParameters(x12c_currGroupA, mgr); UpdateTargetParameters(x14c_currGroupB, mgr); @@ -349,46 +387,54 @@ void CCompoundTargetReticle::UpdateCurrLockOnGroup(float dt, const CStateManager } else { UpdateTargetParameters(x10c_currGroupInterp, mgr); } + if (x1f8_missileBracketTimer != 0.f && x1f8_missileBracketTimer < g_tweakTargeting->GetMissileBracketDuration()) { - if (x1f8_missileBracketTimer < 0.f) + if (x1f8_missileBracketTimer < 0.f) { x1f8_missileBracketTimer = std::min(0.f, x1f8_missileBracketTimer + dt); - else + } else { x1f8_missileBracketTimer = std::min(g_tweakTargeting->GetMissileBracketDuration(), x1f8_missileBracketTimer + dt); + } } + if (x204_chargeGaugeOvershootTimer > 0.f) { x204_chargeGaugeOvershootTimer = std::max(0.f, x204_chargeGaugeOvershootTimer - dt); if (x204_chargeGaugeOvershootTimer == 0.f) { - for (int i = 0; i < 9; ++i) - xe0_outerBeamIconSquares[i].x10_rotAng = xe0_outerBeamIconSquares[i].x14_baseAngle; + for (auto& iconSquare : xe0_outerBeamIconSquares) { + iconSquare.x10_rotAng = iconSquare.x14_baseAngle; + } xc4_chargeGauge.x10_rotAng = xc4_chargeGauge.x14_baseAngle; x208_lockonTimer = FLT_EPSILON; } else { - float offshoot = + const float offshoot = offshoot_func(x2c_overshootOffsetHalf, x30_premultOvershootOffset, 1.f - x204_chargeGaugeOvershootTimer / g_tweakTargeting->GetChargeGaugeOvershootDuration()); - for (int i = 0; i < 9; ++i) { - SOuterItemInfo& item = xe0_outerBeamIconSquares[i]; - item.x10_rotAng = zeus::CRelAngle(item.x18_offshootAngleDelta * offshoot + item.xc_offshootBaseAngle). - asRel(); + for (auto& item : xe0_outerBeamIconSquares) { + item.x10_rotAng = zeus::CRelAngle(item.x18_offshootAngleDelta * offshoot + item.xc_offshootBaseAngle).asRel(); } xc4_chargeGauge.x10_rotAng = zeus::CRelAngle(xc4_chargeGauge.x18_offshootAngleDelta * offshoot + xc4_chargeGauge.xc_offshootBaseAngle). asRel(); } } - if (x208_lockonTimer > 0.f && x208_lockonTimer < g_tweakTargeting->GetLockonDuration()) + + if (x208_lockonTimer > 0.f && x208_lockonTimer < g_tweakTargeting->GetLockonDuration()) { x208_lockonTimer = std::min(g_tweakTargeting->GetLockonDuration(), x208_lockonTimer + dt); - if (x210_lockFireTimer > 0.f) + } + if (x210_lockFireTimer > 0.f) { x210_lockFireTimer = std::max(0.f, x210_lockFireTimer - dt); - if (x1fc_missileBracketScaleTimer > 0.f) + } + if (x1fc_missileBracketScaleTimer > 0.f) { x1fc_missileBracketScaleTimer = std::max(0.f, x1fc_missileBracketScaleTimer - dt); + } } void CCompoundTargetReticle::UpdateNextLockOnGroup(float dt, const CStateManager& mgr) { TUniqueId nextTargetId = mgr.GetPlayer().GetOrbitNextTargetId(); if (mgr.GetPlayerState()->GetCurrentVisor() == CPlayerState::EPlayerVisor::Scan && - mgr.GetPlayer().GetOrbitTargetId() != kInvalidUniqueId) + mgr.GetPlayer().GetOrbitTargetId() != kInvalidUniqueId) { nextTargetId = mgr.GetPlayer().GetOrbitTargetId(); + } + if (nextTargetId != xf2_nextTargetId) { if (nextTargetId == kInvalidUniqueId) { x194_nextGroupA = x174_nextGroupInterp; @@ -410,6 +456,7 @@ void CCompoundTargetReticle::UpdateNextLockOnGroup(float dt, const CStateManager xf2_nextTargetId = nextTargetId; } } + if (x1d8_nextGroupTimer > 0.f) { UpdateTargetParameters(x194_nextGroupA, mgr); UpdateTargetParameters(x1b4_nextGroupB, mgr); @@ -422,22 +469,25 @@ void CCompoundTargetReticle::UpdateNextLockOnGroup(float dt, const CStateManager } void CCompoundTargetReticle::UpdateOrbitZoneGroup(float dt, const CStateManager& mgr) { - if (xf0_targetId == kInvalidUniqueId && xf2_nextTargetId != kInvalidUniqueId) + if (xf0_targetId == kInvalidUniqueId && xf2_nextTargetId != kInvalidUniqueId) { x20c_ = std::min(1.f, 2.f * dt + x20c_); - else + } else { x20c_ = std::max(0.f, x20c_ - 2.f * dt); + } + if (mgr.GetPlayer().IsShowingCrosshairs() && - mgr.GetPlayerState()->GetCurrentVisor() != CPlayerState::EPlayerVisor::Scan) + mgr.GetPlayerState()->GetCurrentVisor() != CPlayerState::EPlayerVisor::Scan) { x1e8_crosshairsScale = std::min(1.f, dt / g_tweakTargeting->GetCrosshairsScaleDuration() + x1e8_crosshairsScale); - else + } else { x1e8_crosshairsScale = std::max(0.f, x1e8_crosshairsScale - dt / g_tweakTargeting->GetCrosshairsScaleDuration()); + } } void CCompoundTargetReticle::Draw(const CStateManager& mgr, bool hideLockon) { if (mgr.GetPlayer().GetMorphballTransitionState() == CPlayer::EPlayerMorphBallState::Unmorphed && !mgr.GetCameraManager()->IsInCinematicCamera()) { SCOPED_GRAPHICS_DEBUG_GROUP("CCompoundTargetReticle::Draw", zeus::skCyan); - zeus::CTransform camXf = mgr.GetCameraManager()->GetCurrentCameraTransform(mgr); + const zeus::CTransform camXf = mgr.GetCameraManager()->GetCurrentCameraTransform(mgr); CGraphics::SetViewPointMatrix(camXf); if (!hideLockon) { DrawCurrLockOnGroup(camXf.basis, mgr); @@ -446,18 +496,23 @@ void CCompoundTargetReticle::Draw(const CStateManager& mgr, bool hideLockon) { } DrawGrappleGroup(camXf.basis, mgr, hideLockon); } - if (x28_noDrawTicks > 0) + + if (x28_noDrawTicks > 0) { --x28_noDrawTicks; + } } void CCompoundTargetReticle::DrawGrapplePoint(const CScriptGrapplePoint& point, float t, const CStateManager& mgr, const zeus::CMatrix3f& rot, bool zEqual) const { zeus::CVector3f orbitPos = point.GetOrbitPosition(mgr); zeus::CColor color; - if (point.GetGrappleParameters().GetLockSwingTurn()) + + if (point.GetGrappleParameters().GetLockSwingTurn()) { color = g_tweakTargeting->GetLockedGrapplePointSelectColor(); - else + } else { color = g_tweakTargeting->GetGrapplePointSelectColor(); + } + color = zeus::CColor::lerp(g_tweakTargeting->GetGrapplePointColor(), color, t); zeus::CMatrix3f scale( CalculateClampedScale(orbitPos, 1.f, g_tweakTargeting->GetGrappleClampMin(), @@ -471,8 +526,9 @@ void CCompoundTargetReticle::DrawGrapplePoint(const CScriptGrapplePoint& point, void CCompoundTargetReticle::DrawGrappleGroup(const zeus::CMatrix3f& rot, const CStateManager& mgr, bool hideLockon) const { - if (x28_noDrawTicks > 0) + if (x28_noDrawTicks > 0) { return; + } if (mgr.GetPlayerState()->HasPowerUp(CPlayerState::EItemType::GrappleBeam) && x94_grapple.IsLoaded() && x20_prevState != EReticleState::Scan) { @@ -482,39 +538,45 @@ void CCompoundTargetReticle::DrawGrappleGroup(const zeus::CMatrix3f& rot, const if (point->GetActive()) { if (point->GetAreaIdAlways() != kInvalidAreaId) { const CGameArea* area = mgr.GetWorld()->GetAreaAlways(point->GetAreaIdAlways()); - CGameArea::EOcclusionState occState = + const auto occState = area->IsPostConstructed() ? area->GetOcclusionState() : CGameArea::EOcclusionState::Occluded; - if (occState != CGameArea::EOcclusionState::Visible) + if (occState != CGameArea::EOcclusionState::Visible) { continue; + } } float t = 0.f; - if (point->GetUniqueId() == x1dc_grapplePoint0) + if (point->GetUniqueId() == x1dc_grapplePoint0) { t = x1e0_grapplePoint0T; - else if (point->GetUniqueId() == x1de_grapplePoint1) + } else if (point->GetUniqueId() == x1de_grapplePoint1) { t = x1e4_grapplePoint1T; - if (std::fabs(t) < 0.00001f) + } + if (std::fabs(t) < 0.00001f) { DrawGrapplePoint(*point, t, mgr, rot, true); + } } } } } else { - TCastToConstPtr point0 = mgr.GetObjectById(x1dc_grapplePoint0); - TCastToConstPtr point1 = mgr.GetObjectById(x1de_grapplePoint1); + const TCastToConstPtr point0 = mgr.GetObjectById(x1dc_grapplePoint0); + const TCastToConstPtr point1 = mgr.GetObjectById(x1de_grapplePoint1); for (int i = 0; i < 2; ++i) { const CScriptGrapplePoint* point = i == 0 ? point0.GetPtr() : point1.GetPtr(); - float t = i == 0 ? x1e0_grapplePoint0T : x1e4_grapplePoint1T; - if (point) + const float t = i == 0 ? x1e0_grapplePoint0T : x1e4_grapplePoint1T; + if (point) { DrawGrapplePoint(*point, t, mgr, rot, false); + } } } } } void CCompoundTargetReticle::DrawCurrLockOnGroup(const zeus::CMatrix3f& rot, const CStateManager& mgr) const { - if (x28_noDrawTicks > 0) + if (x28_noDrawTicks > 0) { return; - if (x1e0_grapplePoint0T + x1e4_grapplePoint1T > 0 || x10c_currGroupInterp.GetFactor() == 0.f) + } + if (x1e0_grapplePoint0T + x1e4_grapplePoint1T > 0 || x10c_currGroupInterp.GetFactor() == 0.f) { return; + } float lockBreakAlpha = x10c_currGroupInterp.GetFactor(); float visorFactor = mgr.GetPlayerState()->GetVisorTransitionFactor(); @@ -537,79 +599,83 @@ void CCompoundTargetReticle::DrawCurrLockOnGroup(const zeus::CMatrix3f& rot, con if (IsDamageOrbit(mgr.GetPlayer().GetOrbitRequest()) && x14c_currGroupB.GetFactor() == 0.f) { zeus::CMatrix3f lockBreakRM; for (int i = 0; i < 4; ++i) { - int a = rand() % 9; - auto b = std::div(a, 3); + const int a = rand() % 9; + const auto b = std::div(a, 3); lockBreakRM[b.rem][b.quot] += rand() / float(RAND_MAX) - 0.5f; } lockBreakXf = lockBreakRM.transposed(); - if (x10c_currGroupInterp.GetFactor() > 0.8f) + if (x10c_currGroupInterp.GetFactor() > 0.8f) { lockBreakColor = zeus::CColor(1.f, (x10c_currGroupInterp.GetFactor() - 0.8f) * 0.3f / 0.2f); + } lockBreakAlpha = x10c_currGroupInterp.GetFactor() > 0.75f ? 1.f : std::max(0.f, (x10c_currGroupInterp.GetFactor() - 0.55f) / 0.2f); } if (lockConfirm && x4c_lockConfirm.IsLoaded()) { - zeus::CMatrix3f scale(CalculateClampedScale(x10c_currGroupInterp.GetTargetPositionWorld(), - x10c_currGroupInterp.GetRadiusWorld(), - x10c_currGroupInterp.GetMinViewportClampScale() * - g_tweakTargeting->GetLockConfirmClampMin(), - g_tweakTargeting->GetLockConfirmClampMax(), mgr) * - g_tweakTargeting->GetLockConfirmScale() / x10c_currGroupInterp.GetFactor()); - zeus::CTransform modelXf(lockBreakXf * (rot * zeus::CMatrix3f::RotateY(x1ec_seekerAngle) * scale), - x10c_currGroupInterp.GetTargetPositionWorld()); + const zeus::CMatrix3f scale(CalculateClampedScale(x10c_currGroupInterp.GetTargetPositionWorld(), + x10c_currGroupInterp.GetRadiusWorld(), + x10c_currGroupInterp.GetMinViewportClampScale() * + g_tweakTargeting->GetLockConfirmClampMin(), + g_tweakTargeting->GetLockConfirmClampMax(), mgr) * + g_tweakTargeting->GetLockConfirmScale() / x10c_currGroupInterp.GetFactor()); + const zeus::CTransform modelXf(lockBreakXf * (rot * zeus::CMatrix3f::RotateY(x1ec_seekerAngle) * scale), + x10c_currGroupInterp.GetTargetPositionWorld()); CGraphics::SetModelMatrix(modelXf); zeus::CColor color = g_tweakTargeting->GetLockConfirmColor(); color.a() *= lockBreakAlpha; - CModelFlags flags(7, 0, 0, lockBreakColor + color); + const CModelFlags flags(7, 0, 0, lockBreakColor + color); x4c_lockConfirm->Draw(flags); } if (lockReticule) { if (x58_targetFlower.IsLoaded()) { - zeus::CMatrix3f scale(CalculateClampedScale(x10c_currGroupInterp.GetTargetPositionWorld(), - x10c_currGroupInterp.GetRadiusWorld(), - x10c_currGroupInterp.GetMinViewportClampScale() * - g_tweakTargeting->GetTargetFlowerClampMin(), - g_tweakTargeting->GetTargetFlowerClampMax(), mgr) * - g_tweakTargeting->GetTargetFlowerScale() / lockBreakAlpha); - zeus::CTransform modelXf(lockBreakXf * (rot * zeus::CMatrix3f::RotateY(x1f0_xrayRetAngle) * scale), - x10c_currGroupInterp.GetTargetPositionWorld()); + const zeus::CMatrix3f scale(CalculateClampedScale(x10c_currGroupInterp.GetTargetPositionWorld(), + x10c_currGroupInterp.GetRadiusWorld(), + x10c_currGroupInterp.GetMinViewportClampScale() * + g_tweakTargeting->GetTargetFlowerClampMin(), + g_tweakTargeting->GetTargetFlowerClampMax(), mgr) * + g_tweakTargeting->GetTargetFlowerScale() / lockBreakAlpha); + const zeus::CTransform modelXf(lockBreakXf * (rot * zeus::CMatrix3f::RotateY(x1f0_xrayRetAngle) * scale), + x10c_currGroupInterp.GetTargetPositionWorld()); CGraphics::SetModelMatrix(modelXf); zeus::CColor color = g_tweakTargeting->GetTargetFlowerColor(); color.a() *= lockBreakAlpha * visorFactor; - CModelFlags flags(7, 0, 0, lockBreakColor + color); + const CModelFlags flags(7, 0, 0, lockBreakColor + color); x58_targetFlower->Draw(flags); } + if (x1f8_missileBracketTimer != 0.f && x64_missileBracket.IsLoaded()) { - float t = std::fabs((x1fc_missileBracketScaleTimer - 0.5f * g_tweakTargeting->GetMissileBracketScaleDuration()) / - 0.5f * g_tweakTargeting->GetMissileBracketScaleDuration()); - float tscale = ((1.f - t) * g_tweakTargeting->GetMissileBracketScaleEnd() + - t * g_tweakTargeting->GetMissileBracketScaleStart()); - zeus::CMatrix3f scale(CalculateClampedScale(x10c_currGroupInterp.GetTargetPositionWorld(), - x10c_currGroupInterp.GetRadiusWorld(), - x10c_currGroupInterp.GetMinViewportClampScale() * - g_tweakTargeting->GetMissileBracketClampMin(), - g_tweakTargeting->GetMissileBracketClampMax(), mgr) * - std::fabs(x1f8_missileBracketTimer) / g_tweakTargeting->GetMissileBracketDuration() * - tscale / x10c_currGroupInterp.GetFactor()); + const float t = + std::fabs((x1fc_missileBracketScaleTimer - 0.5f * g_tweakTargeting->GetMissileBracketScaleDuration()) / 0.5f * + g_tweakTargeting->GetMissileBracketScaleDuration()); + const float tscale = ((1.f - t) * g_tweakTargeting->GetMissileBracketScaleEnd() + + t * g_tweakTargeting->GetMissileBracketScaleStart()); + const zeus::CMatrix3f scale(CalculateClampedScale(x10c_currGroupInterp.GetTargetPositionWorld(), + x10c_currGroupInterp.GetRadiusWorld(), + x10c_currGroupInterp.GetMinViewportClampScale() * + g_tweakTargeting->GetMissileBracketClampMin(), + g_tweakTargeting->GetMissileBracketClampMax(), mgr) * + std::fabs(x1f8_missileBracketTimer) / g_tweakTargeting->GetMissileBracketDuration() * + tscale / x10c_currGroupInterp.GetFactor()); for (int i = 0; i < 4; ++i) { - zeus::CTransform modelXf( + const zeus::CTransform modelXf( lockBreakXf * rot * zeus::CMatrix3f(zeus::CVector3f{i < 2 ? 1.f : -1.f, 1.f, i & 0x1 ? 1.f : -1.f}) * scale, x10c_currGroupInterp.GetTargetPositionWorld()); CGraphics::SetModelMatrix(modelXf); zeus::CColor color = g_tweakTargeting->GetMissileBracketColor(); color.a() *= lockBreakAlpha * visorFactor; - CModelFlags flags(7, 0, 0, lockBreakColor + color); + const CModelFlags flags(7, 0, 0, lockBreakColor + color); x64_missileBracket->Draw(flags); } } - zeus::CMatrix3f scale(CalculateClampedScale(x10c_currGroupInterp.GetTargetPositionWorld(), - x10c_currGroupInterp.GetRadiusWorld(), - x10c_currGroupInterp.GetMinViewportClampScale() * - g_tweakTargeting->GetChargeGaugeClampMin(), - g_tweakTargeting->GetChargeGaugeClampMax(), mgr) * - 1.f / x10c_currGroupInterp.GetFactor() * g_tweakTargeting->GetOuterBeamSquaresScale()); + + const zeus::CMatrix3f scale(CalculateClampedScale(x10c_currGroupInterp.GetTargetPositionWorld(), + x10c_currGroupInterp.GetRadiusWorld(), + x10c_currGroupInterp.GetMinViewportClampScale() * + g_tweakTargeting->GetChargeGaugeClampMin(), + g_tweakTargeting->GetChargeGaugeClampMax(), mgr) * + 1.f / x10c_currGroupInterp.GetFactor() * g_tweakTargeting->GetOuterBeamSquaresScale()); zeus::CMatrix3f outerBeamXf = rot * scale; for (int i = 0; i < 9; ++i) { const SOuterItemInfo& info = xe0_outerBeamIconSquares[i]; @@ -623,16 +689,18 @@ void CCompoundTargetReticle::DrawCurrLockOnGroup(const zeus::CMatrix3f& rot, con info.x0_model->Draw(flags); } } + if (xc4_chargeGauge.x0_model.IsLoaded()) { - zeus::CMatrix3f scale(CalculateClampedScale(x10c_currGroupInterp.GetTargetPositionWorld(), - x10c_currGroupInterp.GetRadiusWorld(), - x10c_currGroupInterp.GetMinViewportClampScale() * - g_tweakTargeting->GetChargeGaugeClampMin(), - g_tweakTargeting->GetChargeGaugeClampMax(), mgr) * - g_tweakTargeting->GetChargeGaugeScale() / x10c_currGroupInterp.GetFactor()); - zeus::CMatrix3f chargeGaugeXf = rot * scale * zeus::CMatrix3f::RotateY(xc4_chargeGauge.x10_rotAng); - float pulseT = std::fabs(std::fmod(CGraphics::GetSecondsMod900(), g_tweakTargeting->GetChargeGaugePulsePeriod())); - zeus::CColor gaugeColor = + const zeus::CMatrix3f scale(CalculateClampedScale(x10c_currGroupInterp.GetTargetPositionWorld(), + x10c_currGroupInterp.GetRadiusWorld(), + x10c_currGroupInterp.GetMinViewportClampScale() * + g_tweakTargeting->GetChargeGaugeClampMin(), + g_tweakTargeting->GetChargeGaugeClampMax(), mgr) * + g_tweakTargeting->GetChargeGaugeScale() / x10c_currGroupInterp.GetFactor()); + const zeus::CMatrix3f chargeGaugeXf = rot * scale * zeus::CMatrix3f::RotateY(xc4_chargeGauge.x10_rotAng); + const float pulseT = + std::fabs(std::fmod(CGraphics::GetSecondsMod900(), g_tweakTargeting->GetChargeGaugePulsePeriod())); + const zeus::CColor gaugeColor = zeus::CColor::lerp(g_tweakTargeting->GetChargeGaugeNonFullColor(), zeus::CColor::lerp(g_tweakTargeting->GetChargeGaugePulseColorHigh(), g_tweakTargeting->GetChargeGaugePulseColorLow(), @@ -645,21 +713,22 @@ void CCompoundTargetReticle::DrawCurrLockOnGroup(const zeus::CMatrix3f& rot, con CGraphics::SetModelMatrix(modelXf); zeus::CColor color = gaugeColor; color.a() *= lockBreakAlpha * visorFactor; - CModelFlags flags(7, 0, 0, lockBreakColor + color); + const CModelFlags flags(7, 0, 0, lockBreakColor + color); xc4_chargeGauge.x0_model->Draw(flags); if (xa0_chargeTickFirst.IsLoaded()) { const CPlayerGun* gun = mgr.GetPlayer().GetPlayerGun(); - int numTicks = + const int numTicks = int(g_tweakTargeting->GetChargeTickCount() * (gun->IsCharging() ? gun->GetChargeBeamFactor() : 0.f)); for (int i = 0; i < numTicks; ++i) { - CModelFlags flags(7, 0, 0, lockBreakColor + color); - xa0_chargeTickFirst->Draw(flags); + const CModelFlags tickFlags(7, 0, 0, lockBreakColor + color); + xa0_chargeTickFirst->Draw(tickFlags); modelXf.rotateLocalY(g_tweakTargeting->GetChargeTickAnglePitch()); CGraphics::SetModelMatrix(modelXf); } } } + if (x208_lockonTimer > 0.f && x70_innerBeamIcon.IsLoaded()) { const zeus::CColor* iconColor; switch (x200_beam) { @@ -676,41 +745,44 @@ void CCompoundTargetReticle::DrawCurrLockOnGroup(const zeus::CMatrix3f& rot, con iconColor = &g_tweakTargeting->GetInnerBeamColorPlasma(); break; } - zeus::CMatrix3f scale( + + const zeus::CMatrix3f scale( CalculateClampedScale(x10c_currGroupInterp.GetTargetPositionWorld(), x10c_currGroupInterp.GetRadiusWorld(), x10c_currGroupInterp.GetMinViewportClampScale() * g_tweakTargeting->GetInnerBeamClampMin(), g_tweakTargeting->GetInnerBeamClampMax(), mgr) * g_tweakTargeting->GetInnerBeamScale() * (x208_lockonTimer / g_tweakTargeting->GetLockonDuration()) / x10c_currGroupInterp.GetFactor()); - zeus::CTransform modelXf(lockBreakXf * rot * scale, x10c_currGroupInterp.GetTargetPositionWorld()); + const zeus::CTransform modelXf(lockBreakXf * rot * scale, x10c_currGroupInterp.GetTargetPositionWorld()); CGraphics::SetModelMatrix(modelXf); zeus::CColor color = *iconColor; color.a() *= lockBreakAlpha * visorFactor; - CModelFlags flags(7, 0, 0, lockBreakColor + color); + const CModelFlags flags(7, 0, 0, lockBreakColor + color); x70_innerBeamIcon->Draw(flags); } + if (x210_lockFireTimer > 0.f && x7c_lockFire.IsLoaded()) { - zeus::CMatrix3f scale(CalculateClampedScale(x10c_currGroupInterp.GetTargetPositionWorld(), - x10c_currGroupInterp.GetRadiusWorld(), - x10c_currGroupInterp.GetMinViewportClampScale() * - g_tweakTargeting->GetLockFireClampMin(), - g_tweakTargeting->GetLockFireClampMax(), mgr) * - g_tweakTargeting->GetLockFireScale() / x10c_currGroupInterp.GetFactor()); - zeus::CTransform modelXf(lockBreakXf * rot * scale * zeus::CMatrix3f::RotateY(x1f0_xrayRetAngle), - x10c_currGroupInterp.GetTargetPositionWorld()); + const zeus::CMatrix3f scale(CalculateClampedScale(x10c_currGroupInterp.GetTargetPositionWorld(), + x10c_currGroupInterp.GetRadiusWorld(), + x10c_currGroupInterp.GetMinViewportClampScale() * + g_tweakTargeting->GetLockFireClampMin(), + g_tweakTargeting->GetLockFireClampMax(), mgr) * + g_tweakTargeting->GetLockFireScale() / x10c_currGroupInterp.GetFactor()); + const zeus::CTransform modelXf(lockBreakXf * rot * scale * zeus::CMatrix3f::RotateY(x1f0_xrayRetAngle), + x10c_currGroupInterp.GetTargetPositionWorld()); CGraphics::SetModelMatrix(modelXf); zeus::CColor color = g_tweakTargeting->GetLockFireColor(); color.a() *= visorFactor * lockBreakAlpha * (x210_lockFireTimer / g_tweakTargeting->GetLockFireDuration()); - CModelFlags flags(7, 0, 0, lockBreakColor + color); + const CModelFlags flags(7, 0, 0, lockBreakColor + color); x7c_lockFire->Draw(flags); } + if (x208_lockonTimer > 0.f && x88_lockDagger.IsLoaded()) { - float t = std::fabs((x210_lockFireTimer - 0.5f * g_tweakTargeting->GetLockFireDuration()) / 0.5f * - g_tweakTargeting->GetLockFireDuration()); - float tscale = + const float t = std::fabs((x210_lockFireTimer - 0.5f * g_tweakTargeting->GetLockFireDuration()) / 0.5f * + g_tweakTargeting->GetLockFireDuration()); + const float tscale = ((1.f - t) * g_tweakTargeting->GetLockDaggerScaleEnd() + t * g_tweakTargeting->GetLockDaggerScaleStart()); - zeus::CMatrix3f scale( + const zeus::CMatrix3f scale( CalculateClampedScale(x10c_currGroupInterp.GetTargetPositionWorld(), x10c_currGroupInterp.GetRadiusWorld(), x10c_currGroupInterp.GetMinViewportClampScale() * g_tweakTargeting->GetLockDaggerClampMin(), @@ -730,12 +802,12 @@ void CCompoundTargetReticle::DrawCurrLockOnGroup(const zeus::CMatrix3f& rot, con ang = g_tweakTargeting->GetLockDaggerAngle2(); break; } - zeus::CTransform modelXf(lockBreakXf * lockDaggerXf * zeus::CMatrix3f::RotateY(ang), - x10c_currGroupInterp.GetTargetPositionWorld()); + const zeus::CTransform modelXf(lockBreakXf * lockDaggerXf * zeus::CMatrix3f::RotateY(ang), + x10c_currGroupInterp.GetTargetPositionWorld()); CGraphics::SetModelMatrix(modelXf); zeus::CColor color = g_tweakTargeting->GetLockDaggerColor(); color.a() *= visorFactor * lockBreakAlpha; - CModelFlags flags(7, 0, 0, lockBreakColor + color); + const CModelFlags flags(7, 0, 0, lockBreakColor + color); x88_lockDagger->Draw(flags); } } @@ -768,64 +840,64 @@ void CCompoundTargetReticle::DrawNextLockOnGroup(const zeus::CMatrix3f& rot, con } if (!xrayRet && x174_nextGroupInterp.GetFactor() > 0.f && x40_seeker.IsLoaded()) { - zeus::CMatrix3f scale( + const zeus::CMatrix3f scale( CalculateClampedScale(position, x174_nextGroupInterp.GetRadiusWorld(), x174_nextGroupInterp.GetMinViewportClampScale() * g_tweakTargeting->GetSeekerClampMin(), g_tweakTargeting->GetSeekerClampMax(), mgr) * g_tweakTargeting->GetSeekerScale()); - zeus::CTransform modelXf(rot * zeus::CMatrix3f::RotateY(x1ec_seekerAngle) * scale, - x174_nextGroupInterp.GetTargetPositionWorld()); + const zeus::CTransform modelXf(rot * zeus::CMatrix3f::RotateY(x1ec_seekerAngle) * scale, + x174_nextGroupInterp.GetTargetPositionWorld()); CGraphics::SetModelMatrix(modelXf); zeus::CColor color = g_tweakTargeting->GetSeekerColor(); color.a() *= x174_nextGroupInterp.GetFactor(); - CModelFlags flags(7, 0, 0, color); + const CModelFlags flags(7, 0, 0, color); x40_seeker->Draw(flags); } if (xrayRet && xac_xrayRetRing.IsLoaded()) { - zeus::CMatrix3f scale( + const zeus::CMatrix3f scale( CalculateClampedScale(position, x174_nextGroupInterp.GetRadiusWorld(), x174_nextGroupInterp.GetMinViewportClampScale() * g_tweakTargeting->GetReticuleClampMin(), g_tweakTargeting->GetReticuleClampMax(), mgr) * g_tweakTargeting->GetReticuleScale()); - zeus::CTransform modelXf(rot * scale * zeus::CMatrix3f::RotateY(x1f0_xrayRetAngle), - x174_nextGroupInterp.GetTargetPositionWorld()); + const zeus::CTransform modelXf(rot * scale * zeus::CMatrix3f::RotateY(x1f0_xrayRetAngle), + x174_nextGroupInterp.GetTargetPositionWorld()); CGraphics::SetModelMatrix(modelXf); zeus::CColor color = g_tweakTargeting->GetXRayRetRingColor(); color.a() *= visorFactor; - CModelFlags flags(7, 0, 0, color); + const CModelFlags flags(7, 0, 0, color); xac_xrayRetRing->Draw(flags); } if (thermalRet && xb8_thermalReticle.IsLoaded()) { - zeus::CMatrix3f scale( + const zeus::CMatrix3f scale( CalculateClampedScale(position, x174_nextGroupInterp.GetRadiusWorld(), x174_nextGroupInterp.GetMinViewportClampScale() * g_tweakTargeting->GetReticuleClampMin(), g_tweakTargeting->GetReticuleClampMax(), mgr) * g_tweakTargeting->GetReticuleScale()); - zeus::CTransform modelXf(rot * scale, x174_nextGroupInterp.GetTargetPositionWorld()); + const zeus::CTransform modelXf(rot * scale, x174_nextGroupInterp.GetTargetPositionWorld()); CGraphics::SetModelMatrix(modelXf); zeus::CColor color = g_tweakTargeting->GetThermalReticuleColor(); color.a() *= visorFactor; - CModelFlags flags(7, 0, 0, color); + const CModelFlags flags(7, 0, 0, color); xb8_thermalReticle->Draw(flags); } if (scanRet && visorFactor > 0.f) { float factor = visorFactor * x174_nextGroupInterp.GetFactor(); - zeus::CMatrix3f scale(CalculateClampedScale(position, x174_nextGroupInterp.GetRadiusWorld(), - x174_nextGroupInterp.GetMinViewportClampScale() * - g_tweakTargeting->GetScanTargetClampMin(), - g_tweakTargeting->GetScanTargetClampMax(), mgr) * - (1.f / factor)); - zeus::CTransform modelXf(rot * scale, x174_nextGroupInterp.GetTargetPositionWorld()); + const zeus::CMatrix3f scale(CalculateClampedScale(position, x174_nextGroupInterp.GetRadiusWorld(), + x174_nextGroupInterp.GetMinViewportClampScale() * + g_tweakTargeting->GetScanTargetClampMin(), + g_tweakTargeting->GetScanTargetClampMax(), mgr) * + (1.f / factor)); + const zeus::CTransform modelXf(rot * scale, x174_nextGroupInterp.GetTargetPositionWorld()); CGraphics::SetModelMatrix(modelXf); // compare, GX_LESS, no update float alpha = 0.5f * factor; zeus::CColor color = g_tweakGuiColors->GetScanReticuleColor(); color.a() *= alpha; for (size_t i = 0; i < m_scanRetRenderer.m_lineRenderers.size(); ++i) { - float lineWidth = i != 0 ? 2.5f : 1.f; + const float lineWidth = i != 0 ? 2.5f : 1.f; auto& rend = *m_scanRetRenderer.m_lineRenderers[i]; rend.Reset(); rend.AddVertex({-0.5f, 0.f, 0.f}, color, lineWidth); @@ -839,8 +911,8 @@ void CCompoundTargetReticle::DrawNextLockOnGroup(const zeus::CMatrix3f& rot, con rend.Render(); for (size_t j = 0; j < m_scanRetRenderer.m_stripRenderers[i].size(); ++j) { - float xSign = j < 2 ? -1.f : 1.f; - float zSign = (j & 0x1) != 0 ? -1.f : 1.f; + const float xSign = j < 2 ? -1.f : 1.f; + const float zSign = (j & 0x1) != 0 ? -1.f : 1.f; // begin line strip auto& stripRend = *m_scanRetRenderer.m_stripRenderers[i][j]; stripRend.Reset(); @@ -855,20 +927,21 @@ void CCompoundTargetReticle::DrawNextLockOnGroup(const zeus::CMatrix3f& rot, con } void CCompoundTargetReticle::DrawOrbitZoneGroup(const zeus::CMatrix3f& rot, const CStateManager& mgr) const { - if (x28_noDrawTicks > 0) + if (x28_noDrawTicks > 0) { return; + } if (x1e8_crosshairsScale > 0.f && x34_crosshairs.IsLoaded()) { CGraphics::SetModelMatrix(zeus::CTransform(rot, xf4_targetPos) * zeus::CTransform::Scale(x1e8_crosshairsScale)); zeus::CColor color = g_tweakTargeting->GetCrosshairsColor(); color.a() *= x1e8_crosshairsScale; - CModelFlags flags(7, 0, 0, color); + const CModelFlags flags(7, 0, 0, color); x34_crosshairs->Draw(flags); } } void CCompoundTargetReticle::UpdateTargetParameters(CTargetReticleRenderState& state, const CStateManager& mgr) { - if (auto act = TCastToConstPtr(mgr.GetAllObjectList().GetObjectById(state.GetTargetId()))) { + if (const auto act = TCastToConstPtr(mgr.GetAllObjectList().GetObjectById(state.GetTargetId()))) { state.SetRadiusWorld(CalculateRadiusWorld(*act, mgr)); state.SetTargetPositionWorld(CalculatePositionWorld(*act, mgr)); } else if (state.GetIsOrbitZoneIdlePosition()) { @@ -880,11 +953,11 @@ void CCompoundTargetReticle::UpdateTargetParameters(CTargetReticleRenderState& s } float CCompoundTargetReticle::CalculateRadiusWorld(const CActor& act, const CStateManager& mgr) const { - auto tb = act.GetTouchBounds(); - zeus::CAABox aabb = tb ? *tb : zeus::CAABox(act.GetAimPosition(mgr, 0.f), act.GetAimPosition(mgr, 0.f)); + const auto tb = act.GetTouchBounds(); + const zeus::CAABox aabb = tb ? *tb : zeus::CAABox(act.GetAimPosition(mgr, 0.f), act.GetAimPosition(mgr, 0.f)); float radius; - zeus::CVector3f delta = aabb.max - aabb.min; + const zeus::CVector3f delta = aabb.max - aabb.min; switch (g_tweakTargeting->GetTargetRadiusMode()) { case 0: { radius = std::min(delta.x(), std::min(delta.y(), delta.z())) * 0.5f; @@ -904,19 +977,21 @@ float CCompoundTargetReticle::CalculateRadiusWorld(const CActor& act, const CSta } zeus::CVector3f CCompoundTargetReticle::CalculatePositionWorld(const CActor& act, const CStateManager& mgr) const { - if (x20_prevState == EReticleState::Scan) + if (x20_prevState == EReticleState::Scan) { return act.GetOrbitPosition(mgr); + } return act.GetAimPosition(mgr, 0.f); } zeus::CVector3f CCompoundTargetReticle::CalculateOrbitZoneReticlePosition(const CStateManager& mgr, bool lag) const { const CGameCamera* curCam = mgr.GetCameraManager()->GetCurrentCamera(mgr); - float distMul = + const float distMul = 224.f / float(g_tweakPlayer->GetOrbitScreenBoxHalfExtentY(0)) / std::tan(zeus::degToRad(0.5f * curCam->GetFov())); - zeus::CTransform camXf = mgr.GetCameraManager()->GetCurrentCameraTransform(mgr); + const zeus::CTransform camXf = mgr.GetCameraManager()->GetCurrentCameraTransform(mgr); zeus::CVector3f lookDir = camXf.basis[1]; - if (lag) + if (lag) { lookDir = x10_laggingOrientation.transform(lookDir); + } return lookDir * distMul + camXf.origin; } @@ -930,42 +1005,70 @@ float CCompoundTargetReticle::CalculateClampedScale(const zeus::CVector3f& pos, mgr.GetCameraManager()->GetCurrentCameraTransform(mgr); zeus::CVector3f viewPos = cam->GetTransform().transposeRotate(pos - cam->GetTransform().origin); viewPos = zeus::CVector3f(viewPos.x(), viewPos.z(), -viewPos.y()); - float realX = cam->GetPerspectiveMatrix().multiplyOneOverW(viewPos).x(); - float offsetX = cam->GetPerspectiveMatrix().multiplyOneOverW(viewPos + zeus::CVector3f(scale, 0.f, 0.f)).x(); - float unclampedX = (offsetX - realX) * 640; + const float realX = cam->GetPerspectiveMatrix().multiplyOneOverW(viewPos).x(); + const float offsetX = cam->GetPerspectiveMatrix().multiplyOneOverW(viewPos + zeus::CVector3f(scale, 0.f, 0.f)).x(); + const float unclampedX = (offsetX - realX) * 640; return zeus::clamp(clampMin, unclampedX, clampMax) / unclampedX * scale; } void CCompoundTargetReticle::Touch() { - if (x34_crosshairs.IsLoaded()) + if (x34_crosshairs.IsLoaded()) { x34_crosshairs->Touch(0); - if (x40_seeker.IsLoaded()) + } + + if (x40_seeker.IsLoaded()) { x40_seeker->Touch(0); - if (x4c_lockConfirm.IsLoaded()) + } + + if (x4c_lockConfirm.IsLoaded()) { x4c_lockConfirm->Touch(0); - if (x58_targetFlower.IsLoaded()) + } + + if (x58_targetFlower.IsLoaded()) { x58_targetFlower->Touch(0); - if (x64_missileBracket.IsLoaded()) + } + + if (x64_missileBracket.IsLoaded()) { x64_missileBracket->Touch(0); - if (x70_innerBeamIcon.IsLoaded()) + } + + if (x70_innerBeamIcon.IsLoaded()) { x70_innerBeamIcon->Touch(0); - if (x7c_lockFire.IsLoaded()) + } + + if (x7c_lockFire.IsLoaded()) { x7c_lockFire->Touch(0); - if (x88_lockDagger.IsLoaded()) + } + + if (x88_lockDagger.IsLoaded()) { x88_lockDagger->Touch(0); - if (x94_grapple.IsLoaded()) + } + + if (x94_grapple.IsLoaded()) { x94_grapple->Touch(0); - if (xa0_chargeTickFirst.IsLoaded()) + } + + if (xa0_chargeTickFirst.IsLoaded()) { xa0_chargeTickFirst->Touch(0); - if (xac_xrayRetRing.IsLoaded()) + } + + if (xac_xrayRetRing.IsLoaded()) { xac_xrayRetRing->Touch(0); - if (xb8_thermalReticle.IsLoaded()) + } + + if (xb8_thermalReticle.IsLoaded()) { xb8_thermalReticle->Touch(0); - if (xc4_chargeGauge.x0_model.IsLoaded()) + } + + if (xc4_chargeGauge.x0_model.IsLoaded()) { xc4_chargeGauge.x0_model->Touch(0); - for (SOuterItemInfo& info : xe0_outerBeamIconSquares) - if (info.x0_model.IsLoaded()) + } + + for (SOuterItemInfo& info : xe0_outerBeamIconSquares) { + if (info.x0_model.IsLoaded()) { info.x0_model->Touch(0); + } + } } } // namespace urde From 59a788a9872f7ae98afa1ed27814c9c26d891712 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Mon, 13 Apr 2020 18:44:47 -0400 Subject: [PATCH 158/224] CParticleGlobals: Eliminate implicit type conversions Makes them all explicit for the reader. --- Runtime/Particle/CParticleGlobals.hpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Runtime/Particle/CParticleGlobals.hpp b/Runtime/Particle/CParticleGlobals.hpp index 12b89d65b..cea7df8f4 100644 --- a/Runtime/Particle/CParticleGlobals.hpp +++ b/Runtime/Particle/CParticleGlobals.hpp @@ -21,24 +21,24 @@ public: float m_EmitterTimeReal = 0.f; void SetEmitterTime(int frame) { m_EmitterTime = frame; - m_EmitterTimeReal = frame; + m_EmitterTimeReal = float(frame); } int m_ParticleLifetime = 0; float m_ParticleLifetimeReal = 0.f; void SetParticleLifetime(int frame) { m_ParticleLifetime = frame; - m_ParticleLifetimeReal = frame; + m_ParticleLifetimeReal = float(frame); } int m_ParticleLifetimePercentage = 0; float m_ParticleLifetimePercentageReal = 0.f; float m_ParticleLifetimePercentageRemainder = 0.f; void UpdateParticleLifetimeTweenValues(int frame) { - float lt = m_ParticleLifetime != 0.0f ? m_ParticleLifetime : 1.0f; - m_ParticleLifetimePercentageReal = 100.0f * frame / lt; + const float lt = m_ParticleLifetime != 0 ? float(m_ParticleLifetime) : 1.0f; + m_ParticleLifetimePercentageReal = 100.0f * float(frame) / lt; m_ParticleLifetimePercentage = int(m_ParticleLifetimePercentageReal); - m_ParticleLifetimePercentageRemainder = m_ParticleLifetimePercentageReal - m_ParticleLifetimePercentage; + m_ParticleLifetimePercentageRemainder = m_ParticleLifetimePercentageReal - float(m_ParticleLifetimePercentage); m_ParticleLifetimePercentage = zeus::clamp(0, m_ParticleLifetimePercentage, 100); } From 2ce1b6047df57919f9cf1be44708fc93e1e6080a Mon Sep 17 00:00:00 2001 From: Luke Street Date: Tue, 14 Apr 2020 00:15:17 -0400 Subject: [PATCH 159/224] DNA/ANCS: Ensure CINFs extracted --- DataSpec/DNACommon/ANCS.cpp | 33 ++++++++++++++++++++++++++------- DataSpec/DNACommon/ANCS.hpp | 2 +- DataSpec/DNAMP1/ANCS.cpp | 3 +-- DataSpec/DNAMP2/ANCS.hpp | 3 +-- DataSpec/DNAMP3/CHAR.hpp | 3 +-- 5 files changed, 30 insertions(+), 14 deletions(-) diff --git a/DataSpec/DNACommon/ANCS.cpp b/DataSpec/DNACommon/ANCS.cpp index 0ee44741d..03f89f3a9 100644 --- a/DataSpec/DNACommon/ANCS.cpp +++ b/DataSpec/DNACommon/ANCS.cpp @@ -15,10 +15,11 @@ namespace DataSpec::DNAANCS { template -bool ReadANCSToBlender(hecl::blender::Connection& conn, const ANCSDNA& ancs, const hecl::ProjectPath& outPath, +bool ReadANCSToBlender(hecl::blender::Token& btok, const ANCSDNA& ancs, const hecl::ProjectPath& outPath, PAKRouter& pakRouter, const typename PAKRouter::EntryType& entry, const SpecBase& dataspec, std::function fileChanged, bool force) { - /* Extract character CMDL/CSKR first */ + auto& conn = btok.getBlenderConnection(); + /* Extract character CMDL/CSKR/CINF first */ std::vector> chResInfo; ancs.getCharacterResInfo(chResInfo); for (const auto& info : chResInfo) { @@ -49,11 +50,19 @@ bool ReadANCSToBlender(hecl::blender::Connection& conn, const ANCSDNA& ancs, con conn.saveBlend(); } } + if (const typename PAKRouter::EntryType* cinfE = pakRouter.lookupEntry(info.cinf, &node, true, false)) { + hecl::ProjectPath cinfPath = pakRouter.getWorking(cinfE); + if (cinfPath.getPathType() == hecl::ProjectPath::Type::None) { + PAKEntryReadStream rs = cinfE->beginReadStream(*node); + ANCSDNA::CINFType::Extract(dataspec, rs, cinfPath, pakRouter, *cinfE, false, btok, fileChanged); + } + } } - /* Extract attachment CMDL/CSKRs first */ + /* Extract attachment CMDL/CSKR/CINFs first */ auto attRange = pakRouter.lookupCharacterAttachmentRigs(entry.id); for (auto it = attRange.first; it != attRange.second; ++it) { + auto cinfid = it->second.first.cinf; auto cmdlid = it->second.first.cmdl; const nod::Node* node; @@ -61,8 +70,9 @@ bool ReadANCSToBlender(hecl::blender::Connection& conn, const ANCSDNA& ancs, con hecl::ProjectPath cmdlPath = pakRouter.getWorking(cmdlE); if (force || cmdlPath.isNone()) { cmdlPath.makeDirChain(false); - if (!conn.createBlend(cmdlPath, hecl::blender::BlendType::Mesh)) + if (!conn.createBlend(cmdlPath, hecl::blender::BlendType::Mesh)) { return false; + } std::string bestName = pakRouter.getBestEntryName(*cmdlE); hecl::SystemStringConv bestNameView(bestName); @@ -84,6 +94,15 @@ bool ReadANCSToBlender(hecl::blender::Connection& conn, const ANCSDNA& ancs, con conn.saveBlend(); } } + if (cinfid.isValid()) { + if (const typename PAKRouter::EntryType* cinfE = pakRouter.lookupEntry(cinfid, &node, true, false)) { + hecl::ProjectPath cinfPath = pakRouter.getWorking(cinfE); + if (cinfPath.getPathType() == hecl::ProjectPath::Type::None) { + PAKEntryReadStream rs = cinfE->beginReadStream(*node); + ANCSDNA::CINFType::Extract(dataspec, rs, cinfPath, pakRouter, *cinfE, false, btok, fileChanged); + } + } + } } std::string bestName = pakRouter.getBestEntryName(entry); @@ -253,17 +272,17 @@ bool ReadANCSToBlender(hecl::blender::Connection& conn, const ANCSDNA& ancs, con template bool ReadANCSToBlender, DNAMP1::ANCS, DNAMP1::MaterialSet, DNACMDL::SurfaceHeader_1, 2>( - hecl::blender::Connection& conn, const DNAMP1::ANCS& ancs, const hecl::ProjectPath& outPath, + hecl::blender::Token& btok, const DNAMP1::ANCS& ancs, const hecl::ProjectPath& outPath, PAKRouter& pakRouter, const typename PAKRouter::EntryType& entry, const SpecBase& dataspec, std::function fileChanged, bool force); template bool ReadANCSToBlender, DNAMP2::ANCS, DNAMP2::MaterialSet, DNACMDL::SurfaceHeader_2, 4>( - hecl::blender::Connection& conn, const DNAMP2::ANCS& ancs, const hecl::ProjectPath& outPath, + hecl::blender::Token& btok, const DNAMP2::ANCS& ancs, const hecl::ProjectPath& outPath, PAKRouter& pakRouter, const typename PAKRouter::EntryType& entry, const SpecBase& dataspec, std::function fileChanged, bool force); template bool ReadANCSToBlender, DNAMP3::CHAR, DNAMP3::MaterialSet, DNACMDL::SurfaceHeader_3, 4>( - hecl::blender::Connection& conn, const DNAMP3::CHAR& ancs, const hecl::ProjectPath& outPath, + hecl::blender::Token& btok, const DNAMP3::CHAR& ancs, const hecl::ProjectPath& outPath, PAKRouter& pakRouter, const typename PAKRouter::EntryType& entry, const SpecBase& dataspec, std::function fileChanged, bool force); diff --git a/DataSpec/DNACommon/ANCS.hpp b/DataSpec/DNACommon/ANCS.hpp index 6064fa6bd..2cf7ef811 100644 --- a/DataSpec/DNACommon/ANCS.hpp +++ b/DataSpec/DNACommon/ANCS.hpp @@ -41,7 +41,7 @@ struct AnimationResInfo { }; template -bool ReadANCSToBlender(hecl::blender::Connection& conn, const ANCSDNA& ancs, const hecl::ProjectPath& outPath, +bool ReadANCSToBlender(hecl::blender::Token& btok, const ANCSDNA& ancs, const hecl::ProjectPath& outPath, PAKRouter& pakRouter, const typename PAKRouter::EntryType& entry, const SpecBase& dataspec, std::function fileChanged, bool force = false); diff --git a/DataSpec/DNAMP1/ANCS.cpp b/DataSpec/DNAMP1/ANCS.cpp index e3c67b451..642da411f 100644 --- a/DataSpec/DNAMP1/ANCS.cpp +++ b/DataSpec/DNAMP1/ANCS.cpp @@ -975,9 +975,8 @@ bool ANCS::Extract(const SpecBase& dataSpec, PAKEntryReadStream& rs, const hecl: } if (force || blendType == hecl::ProjectPath::Type::None) { - hecl::blender::Connection& conn = btok.getBlenderConnection(); DNAANCS::ReadANCSToBlender, ANCS, MaterialSet, DNACMDL::SurfaceHeader_1, 2>( - conn, ancs, blendPath, pakRouter, entry, dataSpec, fileChanged, force); + btok, ancs, blendPath, pakRouter, entry, dataSpec, fileChanged, force); } } diff --git a/DataSpec/DNAMP2/ANCS.hpp b/DataSpec/DNAMP2/ANCS.hpp index e78d4a558..7a2e48ef1 100644 --- a/DataSpec/DNAMP2/ANCS.hpp +++ b/DataSpec/DNAMP2/ANCS.hpp @@ -215,9 +215,8 @@ struct ANCS : BigDNA { } if (force || blendType == hecl::ProjectPath::Type::None) { - hecl::blender::Connection& conn = btok.getBlenderConnection(); DNAANCS::ReadANCSToBlender, ANCS, MaterialSet, DNACMDL::SurfaceHeader_2, 4>( - conn, ancs, blendPath, pakRouter, entry, dataSpec, fileChanged, force); + btok, ancs, blendPath, pakRouter, entry, dataSpec, fileChanged, force); } } diff --git a/DataSpec/DNAMP3/CHAR.hpp b/DataSpec/DNAMP3/CHAR.hpp index 0ee8b495b..af6e71b75 100644 --- a/DataSpec/DNAMP3/CHAR.hpp +++ b/DataSpec/DNAMP3/CHAR.hpp @@ -283,9 +283,8 @@ struct CHAR : BigDNA { } if (force || blendType == hecl::ProjectPath::Type::None) { - hecl::blender::Connection& conn = btok.getBlenderConnection(); DNAANCS::ReadANCSToBlender, CHAR, MaterialSet, DNACMDL::SurfaceHeader_3, 4>( - conn, aChar, blendPath, pakRouter, entry, dataSpec, fileChanged, force); + btok, aChar, blendPath, pakRouter, entry, dataSpec, fileChanged, force); } } From 6ae6806c0d880f3ee47384661069fd7d6d2903e4 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Tue, 14 Apr 2020 00:19:05 -0400 Subject: [PATCH 160/224] DNAMP3: Add FrontEnd.pak to GetNoShare --- DataSpec/DNAMP3/DNAMP3.cpp | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/DataSpec/DNAMP3/DNAMP3.cpp b/DataSpec/DNAMP3/DNAMP3.cpp index 60b68b85b..e5b4e3461 100644 --- a/DataSpec/DNAMP3/DNAMP3.cpp +++ b/DataSpec/DNAMP3/DNAMP3.cpp @@ -22,15 +22,10 @@ namespace DataSpec::DNAMP3 { logvisor::Module Log("urde::DNAMP3"); static bool GetNoShare(std::string_view name) { - if (name == "UniverseArea.pak"sv) - return false; std::string lowerName(name); std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower); - if (!lowerName.compare(0, 7, "metroid")) - return false; - if (!lowerName.compare(0, 5, "rs5fe")) - return false; - return true; + return !lowerName.starts_with("metroid"sv) && !lowerName.starts_with("frontend"sv) && + !lowerName.starts_with("rs5fe"sv) && !lowerName.starts_with("universearea"sv); } PAKBridge::PAKBridge(const nod::Node& node, bool doExtract) From 480d27e68cd0ceb0b21c657ed370f3dab74c0df6 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Tue, 14 Apr 2020 03:26:31 -0400 Subject: [PATCH 161/224] CParticleSwoosh: Initialize class data members Makes for deterministic initial state. --- Runtime/Particle/CParticleSwoosh.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Runtime/Particle/CParticleSwoosh.hpp b/Runtime/Particle/CParticleSwoosh.hpp index f72ae7fcb..7eef5119c 100644 --- a/Runtime/Particle/CParticleSwoosh.hpp +++ b/Runtime/Particle/CParticleSwoosh.hpp @@ -79,11 +79,11 @@ class CParticleSwoosh : public CParticleGen { int x1b0_SPLN = 0; int x1b4_LENG = 0; int x1b8_SIDE = 0; - GX::Primitive x1bc_prim; + GX::Primitive x1bc_prim{}; CRandom16 x1c0_rand; float x1c4_ = 0.f; float x1c8_ = 0.f; - float x1cc_TSPN; + float x1cc_TSPN = 0.f; bool x1d0_24_emitting : 1; bool x1d0_25_AALP : 1; bool x1d0_26_forceOneUpdate : 1; From 6fbf6734c2033b003b96c778536ed58c5fe0db44 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Tue, 14 Apr 2020 03:31:31 -0400 Subject: [PATCH 162/224] CParticleSwoosh: Eliminate variable shadowing --- Runtime/Particle/CParticleSwoosh.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Runtime/Particle/CParticleSwoosh.cpp b/Runtime/Particle/CParticleSwoosh.cpp index 01efb394a..375c08792 100644 --- a/Runtime/Particle/CParticleSwoosh.cpp +++ b/Runtime/Particle/CParticleSwoosh.cpp @@ -28,10 +28,11 @@ CParticleSwoosh::CParticleSwoosh(const TToken& desc, int len , x1d1_24_constantUv(false) { ++g_ParticleSystemAliveCount; - if (leng > 0) + if (leng > 0) { x1b4_LENG = leng; - else if (CIntElement* leng = x1c_desc->x10_LENG.get()) - leng->GetValue(0, x1b4_LENG); + } else if (CIntElement* lengElement = x1c_desc->x10_LENG.get()) { + lengElement->GetValue(0, x1b4_LENG); + } x1b4_LENG += 1; if (CIntElement* side = x1c_desc->x18_SIDE.get()) From fed72614efa678d57291b406011efc8fbff43cb9 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Tue, 14 Apr 2020 03:56:24 -0400 Subject: [PATCH 163/224] CParticleSwoosh: Use const where applicable Given the length of some functions, this makes following flow nicer, since it's easier to visually see which variables get modified. --- Runtime/Particle/CParticleSwoosh.cpp | 402 ++++++++++++++++----------- 1 file changed, 235 insertions(+), 167 deletions(-) diff --git a/Runtime/Particle/CParticleSwoosh.cpp b/Runtime/Particle/CParticleSwoosh.cpp index 375c08792..78512b2b8 100644 --- a/Runtime/Particle/CParticleSwoosh.cpp +++ b/Runtime/Particle/CParticleSwoosh.cpp @@ -35,32 +35,36 @@ CParticleSwoosh::CParticleSwoosh(const TToken& desc, int len } x1b4_LENG += 1; - if (CIntElement* side = x1c_desc->x18_SIDE.get()) + if (CIntElement* side = x1c_desc->x18_SIDE.get()) { side->GetValue(0, x1b8_SIDE); + } x1d0_28_LLRD = x1c_desc->x44_24_LLRD; x1d0_29_VLS1 = x1c_desc->x44_26_VLS1; x1d0_30_VLS2 = x1c_desc->x44_27_VLS2; if (IsValid()) { - if (CIntElement* pslt = x1c_desc->x0_PSLT.get()) + if (CIntElement* pslt = x1c_desc->x0_PSLT.get()) { pslt->GetValue(0, x2c_PSLT); - else + } else { x2c_PSLT = INT_MAX; + } x1d0_25_AALP = x1c_desc->x44_31_AALP; - if (CIntElement* spln = x1c_desc->x38_SPLN.get()) + if (CIntElement* spln = x1c_desc->x38_SPLN.get()) { spln->GetValue(0, x1b0_SPLN); - if (x1b0_SPLN < 0) + } + if (x1b0_SPLN < 0) { x1b0_SPLN = 0; + } x15c_swooshes.clear(); x15c_swooshes.reserve(x1b4_LENG); - for (int i = 0; i < x1b4_LENG; ++i) - x15c_swooshes.emplace_back(zeus::skZero3f, zeus::skZero3f, 0.f, 0.f, 0, false, - zeus::CTransform(), zeus::skZero3f, 0.f, 0.f, - zeus::skClear); + for (int i = 0; i < x1b4_LENG; ++i) { + x15c_swooshes.emplace_back(zeus::skZero3f, zeus::skZero3f, 0.f, 0.f, 0, false, zeus::CTransform(), zeus::skZero3f, + 0.f, 0.f, zeus::skClear); + } SetOrientation(zeus::CTransform()); @@ -70,11 +74,11 @@ CParticleSwoosh::CParticleSwoosh(const TToken& desc, int len x19c_p3.resize(x1b8_SIDE); if (x1c_desc->x44_29_WIRE) { - int maxVerts = x1b4_LENG * (x1b0_SPLN + 1) * x1b8_SIDE * 12; + const int maxVerts = x1b4_LENG * (x1b0_SPLN + 1) * x1b8_SIDE * 12; m_lineRenderer.reset( new CLineRenderer(CLineRenderer::EPrimitiveMode::Lines, maxVerts * 2, nullptr, x1d0_25_AALP)); } else { - int maxVerts = x1b4_LENG * (x1b0_SPLN + 1) * x1b8_SIDE * 4; + const auto maxVerts = size_t(x1b4_LENG * (x1b0_SPLN + 1) * x1b8_SIDE * 4); m_cachedVerts.reserve(maxVerts); CGraphics::CommitResources([&](boo::IGraphicsDataFactory::Context& ctx) { m_vertBuf = ctx.newDynamicBuffer(boo::BufferUse::Vertex, sizeof(CParticleSwooshShaders::Vert), maxVerts); @@ -134,14 +138,16 @@ void CParticleSwoosh::UpdateTranslationAndOrientation() { swoosh.x68_frame = x28_curFrame - swoosh.x70_startFrame; CParticleGlobals::instance()->UpdateParticleLifetimeTweenValues(swoosh.x68_frame); if (x1c_desc->x44_28_SROT) { - if (CRealElement* irot = x1c_desc->x1c_IROT.get()) + if (CRealElement* irot = x1c_desc->x1c_IROT.get()) { irot->GetValue(x28_curFrame, swoosh.x30_irot); + } swoosh.x34_rotm = 0.f; } else { - if (CRealElement* rotm = x1c_desc->x20_ROTM.get()) + if (CRealElement* rotm = x1c_desc->x20_ROTM.get()) { rotm->GetValue(x28_curFrame, swoosh.x34_rotm); - else + } else { swoosh.x34_rotm = 0.f; + } } if (CModVectorElement* velm = x1c_desc->x30_VELM.get()) { @@ -197,8 +203,9 @@ void CParticleSwoosh::UpdateTranslationAndOrientation() { } bool CParticleSwoosh::Update(double dt) { - if (!IsValid()) + if (!IsValid()) { return false; + } CParticleGlobals::instance()->SetParticleLifetime(x1b4_LENG); CParticleGlobals::instance()->SetEmitterTime(x28_curFrame); @@ -207,24 +214,27 @@ bool CParticleSwoosh::Update(double dt) { double evalTime = x28_curFrame / 60.0; float time = 1.f; - if (CRealElement* timeElem = x1c_desc->x4_TIME.get()) + if (CRealElement* timeElem = x1c_desc->x4_TIME.get()) { timeElem->GetValue(x28_curFrame, time); + } x30_curTime += std::max(0.0, dt * time); while (x1d0_26_forceOneUpdate || evalTime < x30_curTime) { x1d0_26_forceOneUpdate = false; x158_curParticle += 1; - if (x158_curParticle >= x15c_swooshes.size()) + if (x158_curParticle >= x15c_swooshes.size()) { x158_curParticle = 0; + } if (x1d0_24_emitting && x28_curFrame < x2c_PSLT) { UpdateSwooshTranslation(x38_translation); - if (CRealElement* irot = x1c_desc->x1c_IROT.get()) + if (CRealElement* irot = x1c_desc->x1c_IROT.get()) { irot->GetValue(x28_curFrame, x15c_swooshes[x158_curParticle].x30_irot); - else + } else { x15c_swooshes[x158_curParticle].x30_irot = 0.f; + } x15c_swooshes[x158_curParticle].x34_rotm = 0.f; x15c_swooshes[x158_curParticle].x70_startFrame = x28_curFrame; @@ -241,20 +251,23 @@ bool CParticleSwoosh::Update(double dt) { x15c_swooshes[x158_curParticle].x74_velocity = x44_orientation * x15c_swooshes[x158_curParticle].x74_velocity; } - if (CVectorElement* pofs = x1c_desc->x24_POFS.get()) + if (CVectorElement* pofs = x1c_desc->x24_POFS.get()) { pofs->GetValue(x28_curFrame, x15c_swooshes[x158_curParticle].x18_offset); + } x15c_swooshes[x158_curParticle].x24_useOffset = x15c_swooshes[x158_curParticle].x18_offset; - if (CColorElement* colr = x1c_desc->x14_COLR.get()) + if (CColorElement* colr = x1c_desc->x14_COLR.get()) { colr->GetValue(x28_curFrame, x15c_swooshes[x158_curParticle].x6c_color); - else + } else { x15c_swooshes[x158_curParticle].x6c_color = zeus::skWhite; + } int tspn = 0; - if (CIntElement* tspnElem = x1c_desc->x40_TSPN.get()) + if (CIntElement* tspnElem = x1c_desc->x40_TSPN.get()) { tspnElem->GetValue(x28_curFrame, tspn); - x1cc_TSPN = tspn; + } + x1cc_TSPN = float(tspn); } else if (x15c_swooshes[x158_curParticle].x0_active) { x1ac_particleCount = std::max(0, int(x1ac_particleCount) - 1); x15c_swooshes[x158_curParticle].x0_active = false; @@ -271,28 +284,32 @@ bool CParticleSwoosh::Update(double dt) { zeus::CVector3f CParticleSwoosh::GetSplinePoint(const zeus::CVector3f& p0, const zeus::CVector3f& p1, const zeus::CVector3f& p2, const zeus::CVector3f& p3, float t) { - if (t > 0.f) + if (t > 0.f) { return p1; - if (t >= 1.f) + } + if (t >= 1.f) { return p2; + } // Tricubic spline interpolation - float t2 = t * t; - float t3 = t2 * t; + const float t2 = t * t; + const float t3 = t2 * t; - float p0Coef = -0.5f * t3 + t2 - 0.5f * t; - float p1Coef = 1.5f * t3 - 2.5f * t2 + 1.f; - float p2Coef = -1.5f * t3 + 2.f * t2 + 0.5f * t; - float p3Coef = 0.5f * t3 + 0.5f * t2; + const float p0Coef = -0.5f * t3 + t2 - 0.5f * t; + const float p1Coef = 1.5f * t3 - 2.5f * t2 + 1.f; + const float p2Coef = -1.5f * t3 + 2.f * t2 + 0.5f * t; + const float p3Coef = 0.5f * t3 + 0.5f * t2; return p0 * p0Coef + p1 * p1Coef + p2 * p2Coef + p3 * p3Coef; } int CParticleSwoosh::WrapIndex(int i) const { - while (i < 0) + while (i < 0) { i += x1b4_LENG; - while (i >= x1b4_LENG) + } + while (i >= x1b4_LENG) { i -= x1b4_LENG; + } return i; } @@ -305,112 +322,125 @@ void CParticleSwoosh::RenderNSidedSpline() { } bool cros = x1c_desc->x44_25_CROS; - if (x1b8_SIDE >= 4 || x1b8_SIDE & 0x1) + if (x1b8_SIDE >= 4 || (x1b8_SIDE & 0x1) != 0) { cros = false; + } int curIdx = x158_curParticle; for (size_t i = 0; i < x15c_swooshes.size(); ++i) { - bool a0 = x15c_swooshes[WrapIndex(curIdx - 1)].x0_active; - bool a1 = x15c_swooshes[WrapIndex(curIdx)].x0_active; + const bool a0 = x15c_swooshes[WrapIndex(curIdx - 1)].x0_active; + const bool a1 = x15c_swooshes[WrapIndex(curIdx)].x0_active; if (!a1 || (a1 && !a0)) { curIdx -= 1; - if (curIdx < 0) + if (curIdx < 0) { curIdx = x15c_swooshes.size() - 1; + } continue; } - SSwooshData& refSwoosh = x15c_swooshes[curIdx]; + const SSwooshData& refSwoosh = x15c_swooshes[curIdx]; - float sideDiv = 360.f / float(x1b8_SIDE); + const float sideDiv = 360.f / float(x1b8_SIDE); for (int j = 0; j < 4; ++j) { int crossRefIdx = 0; if (j == 0) { crossRefIdx = WrapIndex(curIdx + 1); - if (!x15c_swooshes[crossRefIdx].x0_active) + if (!x15c_swooshes[crossRefIdx].x0_active) { crossRefIdx = curIdx; + } } else if (j == 1) { crossRefIdx = WrapIndex(curIdx); } else if (j == 2) { crossRefIdx = WrapIndex(curIdx - 1); } else if (j == 3) { crossRefIdx = WrapIndex(curIdx - 2); - if (!x15c_swooshes[crossRefIdx].x0_active) + if (!x15c_swooshes[crossRefIdx].x0_active) { crossRefIdx = WrapIndex(curIdx - 1); + } } if (x1b4_LENG == 2) { - if (j == 0) + if (j == 0) { crossRefIdx = WrapIndex(curIdx); - if (j == 3) + } + if (j == 3) { crossRefIdx = WrapIndex(curIdx - 1); + } } else if (x158_curParticle == curIdx && j == 0) { crossRefIdx = x158_curParticle; } else { - if (WrapIndex(x158_curParticle + 2) == curIdx && j == 3) + if (WrapIndex(x158_curParticle + 2) == curIdx && j == 3) { crossRefIdx = WrapIndex(x158_curParticle + 1); - else if (x1ac_particleCount - 2 == i && j == 3) + } else if (x1ac_particleCount - 2 == i && j == 3) { crossRefIdx = 0; + } } - SSwooshData& crossSwoosh = x15c_swooshes[crossRefIdx]; + const SSwooshData& crossSwoosh = x15c_swooshes[crossRefIdx]; for (int k = 0; k < x1b8_SIDE; ++k) { - float n = sideDiv * k; + const float n = sideDiv * k; float ang = zeus::degToRad(n + crossSwoosh.x30_irot + crossSwoosh.x34_rotm); if (std::fabs(ang) > M_PIF) { ang -= std::floor(ang / (2.f * M_PIF)) * 2.f * M_PIF; - if (ang > M_PIF) + if (ang > M_PIF) { ang -= 2.f * M_PIF; - else if (ang < -M_PIF) + } else if (ang < -M_PIF) { ang += 2.f * M_PIF; + } } - float z = std::sin(ang); - float x = std::cos(ang); + const float z = std::sin(ang); + const float x = std::cos(ang); - float rad = (n > 0.f && n <= 180.f) ? crossSwoosh.x4_leftRad : crossSwoosh.x8_rightRad; - zeus::CVector3f offset = crossSwoosh.xc_translation + crossSwoosh.x24_useOffset; + const float rad = (n > 0.f && n <= 180.f) ? crossSwoosh.x4_leftRad : crossSwoosh.x8_rightRad; + const zeus::CVector3f offset = crossSwoosh.xc_translation + crossSwoosh.x24_useOffset; - if (j == 0) + if (j == 0) { x16c_p0[k] = crossSwoosh.x38_orientation * zeus::CVector3f(rad * x, 0.f, rad * z) + offset; - else if (j == 1) + } else if (j == 1) { x17c_p1[k] = crossSwoosh.x38_orientation * zeus::CVector3f(rad * x, 0.f, rad * z) + offset; - else if (j == 2) + } else if (j == 2) { x18c_p2[k] = crossSwoosh.x38_orientation * zeus::CVector3f(rad * x, 0.f, rad * z) + offset; - else if (j == 3) + } else if (j == 3) { x19c_p3[k] = crossSwoosh.x38_orientation * zeus::CVector3f(rad * x, 0.f, rad * z) + offset; + } } } if (x1c_desc->x3c_TEXR) { - if (x1ec_TSPN > 0) + if (x1ec_TSPN > 0) { x1d4_uvs.xMin = float((i % x1ec_TSPN) * x1e8_uvSpan); - else + } else { x1d4_uvs.xMin = float(i * x1e8_uvSpan); + } } - float segUvSpan = x1e8_uvSpan / float(x1b0_SPLN + 1); + const float segUvSpan = x1e8_uvSpan / float(x1b0_SPLN + 1); for (int j = 0; j < x1b0_SPLN + 1; ++j) { - float t0 = j / float(x1b0_SPLN + 1); - float t1 = (j + 1) / float(x1b0_SPLN + 1); + const float t0 = j / float(x1b0_SPLN + 1); + const float t1 = (j + 1) / float(x1b0_SPLN + 1); int faces = x1b8_SIDE; - if (x1b8_SIDE <= 2) + if (x1b8_SIDE <= 2) { faces = 1; - else if (cros) + } else if (cros) { faces = x1b8_SIDE / 2; + } x1d4_uvs.xMax = x1d4_uvs.xMin + segUvSpan; for (int k = 0; k < faces; ++k) { int otherK = k + 1; - if (k + 1 >= x1b8_SIDE) + if (k + 1 >= x1b8_SIDE) { otherK = 0; - zeus::CColor color = refSwoosh.x6c_color * x20c_moduColor; + } + + const zeus::CColor color = refSwoosh.x6c_color * x20c_moduColor; if (cros) { otherK = k + x1b8_SIDE / 2; - zeus::CVector3f v0 = GetSplinePoint(x16c_p0[k], x17c_p1[k], x18c_p2[k], x19c_p3[k], t0); - zeus::CVector3f v1 = GetSplinePoint(x16c_p0[otherK], x17c_p1[otherK], x18c_p2[otherK], x19c_p3[otherK], t0); - zeus::CVector3f v2 = GetSplinePoint(x16c_p0[otherK], x17c_p1[otherK], x18c_p2[otherK], x19c_p3[otherK], t1); - zeus::CVector3f v3 = GetSplinePoint(x16c_p0[k], x17c_p1[k], x18c_p2[k], x19c_p3[k], t1); + const auto v0 = GetSplinePoint(x16c_p0[k], x17c_p1[k], x18c_p2[k], x19c_p3[k], t0); + const auto v1 = GetSplinePoint(x16c_p0[otherK], x17c_p1[otherK], x18c_p2[otherK], x19c_p3[otherK], t0); + const auto v2 = GetSplinePoint(x16c_p0[otherK], x17c_p1[otherK], x18c_p2[otherK], x19c_p3[otherK], t1); + const auto v3 = GetSplinePoint(x16c_p0[k], x17c_p1[k], x18c_p2[k], x19c_p3[k], t1); m_cachedVerts.push_back({v0, {x1d4_uvs.xMin, x1d4_uvs.yMin}, color}); m_cachedVerts.push_back({v1, {x1d4_uvs.xMin, x1d4_uvs.yMax}, color}); @@ -418,10 +448,10 @@ void CParticleSwoosh::RenderNSidedSpline() { m_cachedVerts.push_back({v3, {x1d4_uvs.xMax, x1d4_uvs.yMax}, color}); CGraphics::DrawArray(m_cachedVerts.size() - 4, 4); } else { - zeus::CVector3f v0 = GetSplinePoint(x16c_p0[k], x17c_p1[k], x18c_p2[k], x19c_p3[k], t0); - zeus::CVector3f v1 = GetSplinePoint(x16c_p0[otherK], x17c_p1[otherK], x18c_p2[otherK], x19c_p3[otherK], t0); - zeus::CVector3f v2 = GetSplinePoint(x16c_p0[otherK], x17c_p1[otherK], x18c_p2[otherK], x19c_p3[otherK], t1); - zeus::CVector3f v3 = GetSplinePoint(x16c_p0[k], x17c_p1[k], x18c_p2[k], x19c_p3[k], t1); + const auto v0 = GetSplinePoint(x16c_p0[k], x17c_p1[k], x18c_p2[k], x19c_p3[k], t0); + const auto v1 = GetSplinePoint(x16c_p0[otherK], x17c_p1[otherK], x18c_p2[otherK], x19c_p3[otherK], t0); + const auto v2 = GetSplinePoint(x16c_p0[otherK], x17c_p1[otherK], x18c_p2[otherK], x19c_p3[otherK], t1); + const auto v3 = GetSplinePoint(x16c_p0[k], x17c_p1[k], x18c_p2[k], x19c_p3[k], t1); if (x1bc_prim == GX::LINES) { m_lineRenderer->AddVertex(v0, color, 1.f); @@ -446,57 +476,65 @@ void CParticleSwoosh::RenderNSidedSpline() { } } - if (x1c_desc->x3c_TEXR && x1b0_SPLN > 0) + if (x1c_desc->x3c_TEXR && x1b0_SPLN > 0) { x1d4_uvs.xMin += segUvSpan; + } } curIdx -= 1; - if (curIdx < 0) + if (curIdx < 0) { curIdx = x15c_swooshes.size() - 1; + } } - if (x1bc_prim == GX::LINES) + if (x1bc_prim == GX::LINES) { m_lineRenderer->Render(g_Renderer->IsThermalVisorHotPass()); + } } void CParticleSwoosh::RenderNSidedNoSpline() { RenderNSidedSpline(); } void CParticleSwoosh::Render3SidedSolidSpline() { - if (x15c_swooshes.size() < 2) + if (x15c_swooshes.size() < 2) { return; + } int curIdx = x158_curParticle; float curUvSpan = -x1e8_uvSpan; zeus::CColor prevColor0 = zeus::skClear; for (size_t i = 0; i < x15c_swooshes.size(); ++i) { - SSwooshData& swoosh = x15c_swooshes[curIdx]; + const SSwooshData& swoosh = x15c_swooshes[curIdx]; curIdx -= 1; - if (curIdx < 0) + if (curIdx < 0) { curIdx = x15c_swooshes.size() - 1; + } float ang1 = zeus::degToRad(swoosh.x30_irot + swoosh.x34_rotm); if (std::fabs(ang1) > M_PIF) { ang1 -= std::floor(ang1 / (2.f * M_PIF)) * 2.f * M_PIF; - if (ang1 > M_PIF) + if (ang1 > M_PIF) { ang1 -= 2.f * M_PIF; - else if (ang1 < -M_PIF) + } else if (ang1 < -M_PIF) { ang1 += 2.f * M_PIF; + } } - zeus::CVector3f ang1Vec(std::sin(ang1) * swoosh.x4_leftRad, 0.f, std::cos(ang1) * swoosh.x4_leftRad); + const zeus::CVector3f ang1Vec(std::sin(ang1) * swoosh.x4_leftRad, 0.f, std::cos(ang1) * swoosh.x4_leftRad); float ang2 = ang1 + 2.0943952f; // +120 degrees - if (ang2 > M_PIF) + if (ang2 > M_PIF) { ang2 -= 2.f * M_PIF; + } - zeus::CVector3f ang2Vec(std::sin(ang2) * swoosh.x4_leftRad, 0.f, std::cos(ang2) * swoosh.x4_leftRad); + const zeus::CVector3f ang2Vec(std::sin(ang2) * swoosh.x4_leftRad, 0.f, std::cos(ang2) * swoosh.x4_leftRad); float ang3 = ang2 + 2.0943952f; // +120 degrees - if (ang3 > M_PIF) + if (ang3 > M_PIF) { ang3 -= 2.f * M_PIF; + } - zeus::CVector3f ang3Vec(std::sin(ang3) * swoosh.x4_leftRad, 0.f, std::cos(ang3) * swoosh.x4_leftRad); + const zeus::CVector3f ang3Vec(std::sin(ang3) * swoosh.x4_leftRad, 0.f, std::cos(ang3) * swoosh.x4_leftRad); if (i == 2) { x19c_p3[0] = x17c_p1[0] * 2.f - x16c_p0[0]; @@ -516,15 +554,15 @@ void CParticleSwoosh::Render3SidedSolidSpline() { x17c_p1[1] = x16c_p0[1]; x17c_p1[2] = x16c_p0[2]; - zeus::CVector3f useOffset = swoosh.xc_translation + swoosh.x24_useOffset; + const zeus::CVector3f useOffset = swoosh.xc_translation + swoosh.x24_useOffset; x16c_p0[0] = swoosh.x38_orientation * ang1Vec + useOffset; x16c_p0[1] = swoosh.x38_orientation * ang2Vec + useOffset; x16c_p0[2] = swoosh.x38_orientation * ang3Vec + useOffset; - zeus::CColor useColor0 = prevColor0; + const zeus::CColor useColor0 = prevColor0; if (swoosh.x0_active) { - zeus::CColor prevColor1 = prevColor0; + const zeus::CColor prevColor1 = prevColor0; prevColor0 = swoosh.x6c_color * x20c_moduColor; float prevUvSpan = curUvSpan; curUvSpan += x1e8_uvSpan; @@ -584,8 +622,9 @@ void CParticleSwoosh::Render3SidedSolidSpline() { } void CParticleSwoosh::Render3SidedSolidNoSplineNoGaps() { - if (x15c_swooshes.size() < 2) + if (x15c_swooshes.size() < 2) { return; + } std::array p0; std::array p1; @@ -596,36 +635,40 @@ void CParticleSwoosh::Render3SidedSolidNoSplineNoGaps() { zeus::CColor c0 = zeus::skClear; float uv0 = -x1e8_uvSpan; for (size_t i = 0; i < x15c_swooshes.size(); ++i) { - SSwooshData& swoosh = x15c_swooshes[curIdx]; + const SSwooshData& swoosh = x15c_swooshes[curIdx]; curIdx -= 1; - if (curIdx < 0) + if (curIdx < 0) { curIdx = x15c_swooshes.size() - 1; + } float ang1 = zeus::degToRad(swoosh.x30_irot + swoosh.x34_rotm); if (std::fabs(ang1) > M_PIF) { ang1 -= std::floor(ang1 / (2.f * M_PIF)) * 2.f * M_PIF; - if (ang1 > M_PIF) + if (ang1 > M_PIF) { ang1 -= 2.f * M_PIF; - else if (ang1 < -M_PIF) + } else if (ang1 < -M_PIF) { ang1 += 2.f * M_PIF; + } } - zeus::CVector3f ang1Vec(std::sin(ang1) * swoosh.x4_leftRad, 0.f, std::cos(ang1) * swoosh.x4_leftRad); + const zeus::CVector3f ang1Vec(std::sin(ang1) * swoosh.x4_leftRad, 0.f, std::cos(ang1) * swoosh.x4_leftRad); float ang2 = ang1 + 2.0943952f; // +120 degrees - if (ang2 > M_PIF) + if (ang2 > M_PIF) { ang2 -= 2.f * M_PIF; + } - zeus::CVector3f ang2Vec(std::sin(ang2) * swoosh.x4_leftRad, 0.f, std::cos(ang2) * swoosh.x4_leftRad); + const zeus::CVector3f ang2Vec(std::sin(ang2) * swoosh.x4_leftRad, 0.f, std::cos(ang2) * swoosh.x4_leftRad); float ang3 = ang2 + 2.0943952f; // +120 degrees - if (ang3 > M_PIF) + if (ang3 > M_PIF) { ang3 -= 2.f * M_PIF; + } - zeus::CVector3f ang3Vec(std::sin(ang3) * swoosh.x4_leftRad, 0.f, std::cos(ang3) * swoosh.x4_leftRad); + const zeus::CVector3f ang3Vec(std::sin(ang3) * swoosh.x4_leftRad, 0.f, std::cos(ang3) * swoosh.x4_leftRad); - zeus::CVector3f useOffset = swoosh.xc_translation + swoosh.x24_useOffset; + const zeus::CVector3f useOffset = swoosh.xc_translation + swoosh.x24_useOffset; p0[i & 1] = swoosh.x38_orientation * ang1Vec + useOffset; p1[i & 1] = swoosh.x38_orientation * ang2Vec + useOffset; p2[i & 1] = swoosh.x38_orientation * ang3Vec + useOffset; @@ -641,10 +684,10 @@ void CParticleSwoosh::Render3SidedSolidNoSplineNoGaps() { } lastActive = true; - zeus::CColor c1 = c0; + const zeus::CColor c1 = c0; c0 = swoosh.x6c_color * x20c_moduColor; - float uv1 = uv0; + const float uv1 = uv0; uv0 += x1e8_uvSpan; m_cachedVerts.push_back({p0[i & 1], {uv0, x1d4_uvs.yMin}, c0}); @@ -674,12 +717,13 @@ void CParticleSwoosh::Render2SidedNoSplineGaps() { bool streaming = false; int curIdx = x158_curParticle; for (size_t i = 0; i < x15c_swooshes.size(); ++i) { - SSwooshData& swoosh = x15c_swooshes[curIdx]; - bool otherActive = x15c_swooshes[WrapIndex(curIdx - 1)].x0_active; + const SSwooshData& swoosh = x15c_swooshes[curIdx]; + const bool otherActive = x15c_swooshes[WrapIndex(curIdx - 1)].x0_active; curIdx -= 1; - if (curIdx < 0) + if (curIdx < 0) { curIdx = x15c_swooshes.size() - 2; + } if (!swoosh.x0_active) { if (streaming) { @@ -690,10 +734,12 @@ void CParticleSwoosh::Render2SidedNoSplineGaps() { } if (!streaming) { - if (!otherActive) + if (!otherActive) { continue; - if (i >= x15c_swooshes.size() - 2) + } + if (i >= x15c_swooshes.size() - 2) { continue; + } streaming = true; drawStart = m_cachedVerts.size(); } @@ -701,24 +747,25 @@ void CParticleSwoosh::Render2SidedNoSplineGaps() { float ang = zeus::degToRad(swoosh.x30_irot + swoosh.x34_rotm); if (std::fabs(ang) > M_PIF) { ang -= std::floor(ang / (2.f * M_PIF)) * 2.f * M_PIF; - if (ang > M_PIF) + if (ang > M_PIF) { ang -= 2.f * M_PIF; - else if (ang < -M_PIF) + } else if (ang < -M_PIF) { ang += 2.f * M_PIF; + } } - float sinAng = std::sin(ang); - float cosAng = std::cos(ang); + const float sinAng = std::sin(ang); + const float cosAng = std::cos(ang); - zeus::CVector3f useOffset = swoosh.xc_translation + swoosh.x24_useOffset; - zeus::CVector3f v0 = + const zeus::CVector3f useOffset = swoosh.xc_translation + swoosh.x24_useOffset; + const zeus::CVector3f v0 = swoosh.x38_orientation * zeus::CVector3f(cosAng * swoosh.x4_leftRad, 0.f, sinAng * swoosh.x4_leftRad) + useOffset; - zeus::CVector3f v1 = + const zeus::CVector3f v1 = swoosh.x38_orientation * zeus::CVector3f(-cosAng * swoosh.x8_rightRad, 0.f, -sinAng * swoosh.x8_rightRad) + useOffset; - zeus::CColor color = swoosh.x6c_color * x20c_moduColor; + const zeus::CColor color = swoosh.x6c_color * x20c_moduColor; m_cachedVerts.push_back({v0, {1.f, x1d4_uvs.yMin}, color}); m_cachedVerts.push_back({v1, {1.f, x1d4_uvs.yMax}, color}); @@ -735,43 +782,47 @@ void CParticleSwoosh::Render2SidedNoSplineNoGaps() { int curIdx = x158_curParticle; int particleCount = x1ac_particleCount; float uvOffset = 0.f; + if (x1c_desc->x3c_TEXR) { if (x1c_desc->x45_25_ORNT) { - zeus::CVector3f camToParticle = + const zeus::CVector3f camToParticle = ((zeus::CTransform::Translate(xa4_globalTranslation) * xb0_globalOrientation * xec_scaleXf).inverse() * CGraphics::g_ViewMatrix) .origin; zeus::CVector3f dotVec = zeus::skZero3f; for (size_t i = 0; i < x15c_swooshes.size(); ++i) { - SSwooshData& swoosh = x15c_swooshes[curIdx]; + const SSwooshData& swoosh = x15c_swooshes[curIdx]; curIdx -= 1; - if (curIdx < 0) + if (curIdx < 0) { curIdx = x15c_swooshes.size() - 1; + } if (swoosh.x0_active) { particleCount -= 1; int otherIdx = curIdx - 1; - if (otherIdx < 0) + if (otherIdx < 0) { otherIdx = x15c_swooshes.size() - 1; + } - SSwooshData& otherSwoosh = x15c_swooshes[otherIdx]; + const SSwooshData& otherSwoosh = x15c_swooshes[otherIdx]; zeus::CVector3f delta = otherSwoosh.xc_translation - swoosh.xc_translation; - if (otherIdx == x158_curParticle) + if (otherIdx == x158_curParticle) { delta = swoosh.xc_translation - x15c_swooshes[(curIdx + 1) % x15c_swooshes.size()].xc_translation; + } if (delta.canBeNormalized()) { zeus::CVector3f deltaCross = delta.cross(camToParticle - swoosh.xc_translation); if (deltaCross.canBeNormalized()) { deltaCross.normalize(); dotVec = (deltaCross.dot(dotVec) < 0.f ? -1.f : 1.f) * deltaCross; - zeus::CVector3f useOffset = swoosh.xc_translation + swoosh.x24_useOffset; - zeus::CVector3f v0 = dotVec * swoosh.x4_leftRad + useOffset; - zeus::CVector3f v1 = dotVec * -swoosh.x8_rightRad + useOffset; + const zeus::CVector3f useOffset = swoosh.xc_translation + swoosh.x24_useOffset; + const zeus::CVector3f v0 = dotVec * swoosh.x4_leftRad + useOffset; + const zeus::CVector3f v1 = dotVec * -swoosh.x8_rightRad + useOffset; - zeus::CColor color = swoosh.x6c_color * x20c_moduColor; + const zeus::CColor color = swoosh.x6c_color * x20c_moduColor; m_cachedVerts.push_back({v0, {uvOffset, x1d4_uvs.yMin}, color}); m_cachedVerts.push_back({v1, {uvOffset, x1d4_uvs.yMax}, color}); @@ -783,21 +834,23 @@ void CParticleSwoosh::Render2SidedNoSplineNoGaps() { m_cachedVerts.push_back({v1, {uvOffset, x1d4_uvs.yMax}, color}); } - if (x1ec_TSPN > 0) + if (x1ec_TSPN > 0) { uvOffset += x1e8_uvSpan; - else + } else { uvOffset = float(i * x1e8_uvSpan); + } } } } } } else { for (size_t i = 0; i < x15c_swooshes.size(); ++i) { - SSwooshData& swoosh = x15c_swooshes[curIdx]; + const SSwooshData& swoosh = x15c_swooshes[curIdx]; curIdx -= 1; - if (curIdx < 0) + if (curIdx < 0) { curIdx = x15c_swooshes.size() - 1; + } if (swoosh.x0_active) { particleCount -= 1; @@ -805,24 +858,25 @@ void CParticleSwoosh::Render2SidedNoSplineNoGaps() { float ang = zeus::degToRad(swoosh.x30_irot + swoosh.x34_rotm); if (std::fabs(ang) > M_PIF) { ang -= std::floor(ang / (2.f * M_PIF)) * 2.f * M_PIF; - if (ang > M_PIF) + if (ang > M_PIF) { ang -= 2.f * M_PIF; - else if (ang < -M_PIF) + } else if (ang < -M_PIF) { ang += 2.f * M_PIF; + } } float sinAng = std::sin(ang); float cosAng = std::cos(ang); - zeus::CVector3f useOffset = swoosh.xc_translation + swoosh.x24_useOffset; - zeus::CVector3f v0 = + const zeus::CVector3f useOffset = swoosh.xc_translation + swoosh.x24_useOffset; + const zeus::CVector3f v0 = swoosh.x38_orientation * zeus::CVector3f(cosAng * swoosh.x4_leftRad, 0.f, sinAng * swoosh.x4_leftRad) + useOffset; - zeus::CVector3f v1 = swoosh.x38_orientation * - zeus::CVector3f(-cosAng * swoosh.x8_rightRad, 0.f, -sinAng * swoosh.x8_rightRad) + - useOffset; + const zeus::CVector3f v1 = swoosh.x38_orientation * zeus::CVector3f(-cosAng * swoosh.x8_rightRad, 0.f, + -sinAng * swoosh.x8_rightRad) + + useOffset; - zeus::CColor color = swoosh.x6c_color * x20c_moduColor; + const zeus::CColor color = swoosh.x6c_color * x20c_moduColor; m_cachedVerts.push_back({v0, {uvOffset, x1d4_uvs.yMin}, color}); m_cachedVerts.push_back({v1, {uvOffset, x1d4_uvs.yMax}, color}); @@ -834,43 +888,46 @@ void CParticleSwoosh::Render2SidedNoSplineNoGaps() { m_cachedVerts.push_back({v1, {uvOffset, x1d4_uvs.yMax}, color}); } - if (x1ec_TSPN > 0) + if (x1ec_TSPN > 0) { uvOffset += x1e8_uvSpan; - else - uvOffset = float(i* x1e8_uvSpan); + } else { + uvOffset = float(i * x1e8_uvSpan); + } } } } } else { for (size_t i = 0; i < x15c_swooshes.size(); ++i) { - SSwooshData& swoosh = x15c_swooshes[curIdx]; + const SSwooshData& swoosh = x15c_swooshes[curIdx]; curIdx -= 1; - if (curIdx < 0) + if (curIdx < 0) { curIdx = x15c_swooshes.size() - 1; + } if (swoosh.x0_active) { float ang = zeus::degToRad(swoosh.x30_irot + swoosh.x34_rotm); if (std::fabs(ang) > M_PIF) { ang -= std::floor(ang / (2.f * M_PIF)) * 2.f * M_PIF; - if (ang > M_PIF) + if (ang > M_PIF) { ang -= 2.f * M_PIF; - else if (ang < -M_PIF) + } else if (ang < -M_PIF) { ang += 2.f * M_PIF; + } } - float sinAng = std::sin(ang); - float cosAng = std::cos(ang); + const float sinAng = std::sin(ang); + const float cosAng = std::cos(ang); - zeus::CVector3f useOffset = swoosh.xc_translation + swoosh.x24_useOffset; - zeus::CVector3f v0 = + const zeus::CVector3f useOffset = swoosh.xc_translation + swoosh.x24_useOffset; + const zeus::CVector3f v0 = swoosh.x38_orientation * zeus::CVector3f(cosAng * swoosh.x4_leftRad, 0.f, sinAng * swoosh.x4_leftRad) + useOffset; - zeus::CVector3f v1 = + const zeus::CVector3f v1 = swoosh.x38_orientation * zeus::CVector3f(-cosAng * swoosh.x8_rightRad, 0.f, -sinAng * swoosh.x8_rightRad) + useOffset; - zeus::CColor color = swoosh.x6c_color * x20c_moduColor; + const zeus::CColor color = swoosh.x6c_color * x20c_moduColor; m_cachedVerts.push_back({v0, {}, color}); m_cachedVerts.push_back({v1, {}, color}); } @@ -881,14 +938,17 @@ void CParticleSwoosh::Render2SidedNoSplineNoGaps() { } void CParticleSwoosh::Render(const CActorLights*) { - if (x1b4_LENG < 2 || x1ac_particleCount <= 1) + if (x1b4_LENG < 2 || x1ac_particleCount <= 1) { return; + } + SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CParticleSwoosh::Render {}"), *x1c_desc.GetObjectTag()).c_str(), zeus::skYellow); m_cachedVerts.clear(); - if (m_dataBind[0]) + if (m_dataBind[0]) { CGraphics::SetShaderDataBinding(m_dataBind[g_Renderer->IsThermalVisorHotPass()]); + } CParticleGlobals::instance()->SetParticleLifetime(x1b4_LENG); CGlobalRandom gr(x1c0_rand); @@ -911,15 +971,18 @@ void CParticleSwoosh::Render(const CActorLights*) { x1d0_31_constantTex = texr->HasConstantTexture(); x1d1_24_constantUv = texr->HasConstantUV(); - if (CIntElement* tspn = x1c_desc->x40_TSPN.get()) + if (CIntElement* tspn = x1c_desc->x40_TSPN.get()) { tspn->GetValue(x28_curFrame, x1ec_TSPN); + } - if (x1ec_TSPN <= 0) + if (x1ec_TSPN <= 0) { x1ec_TSPN = x15c_swooshes.size() - 1; + } x1e8_uvSpan = 1.f; - if (x1ec_TSPN > 0) + if (x1ec_TSPN > 0) { x1e8_uvSpan = 1.f / float(x1ec_TSPN); + } // TEV0 modulate } else { @@ -930,29 +993,33 @@ void CParticleSwoosh::Render(const CActorLights*) { if (x1b8_SIDE == 2) { if (x1b0_SPLN <= 0) { - if (x1d0_27_renderGaps) + if (x1d0_27_renderGaps) { Render2SidedNoSplineGaps(); - else + } else { Render2SidedNoSplineNoGaps(); + } } else { Render2SidedSpline(); } } else if (x1b8_SIDE == 3) { - if (x1b0_SPLN > 0) + if (x1b0_SPLN > 0) { Render3SidedSolidSpline(); - else + } else { Render3SidedSolidNoSplineNoGaps(); + } } else { - if (x1b0_SPLN > 0) + if (x1b0_SPLN > 0) { RenderNSidedSpline(); - else + } else { RenderNSidedNoSpline(); + } } zeus::CMatrix4f mvp = CGraphics::GetPerspectiveProjectionMatrix(true) * CGraphics::g_GXModelView.toMatrix4f(); m_uniformBuf->load(&mvp, sizeof(zeus::CMatrix4f)); - if (m_cachedVerts.size()) + if (m_cachedVerts.size()) { m_vertBuf->load(m_cachedVerts.data(), m_cachedVerts.size() * sizeof(CParticleSwooshShaders::Vert)); + } } void CParticleSwoosh::SetOrientation(const zeus::CTransform& xf) { @@ -995,18 +1062,19 @@ const zeus::CVector3f& CParticleSwoosh::GetGlobalScale() const { return xe0_glob const zeus::CColor& CParticleSwoosh::GetModulationColor() const { return x20c_moduColor; } bool CParticleSwoosh::IsSystemDeletable() const { - if (x1d0_24_emitting && x28_curFrame < x2c_PSLT) + if (x1d0_24_emitting && x28_curFrame < x2c_PSLT) { return false; + } return GetParticleCount() < 2; } std::optional CParticleSwoosh::GetBounds() const { if (GetParticleCount() <= 1) { - zeus::CVector3f trans = x38_translation + xa4_globalTranslation; + const zeus::CVector3f trans = x38_translation + xa4_globalTranslation; return zeus::CAABox(trans, trans); } else { - zeus::CTransform xf = zeus::CTransform::Translate(xa4_globalTranslation) * xb0_globalOrientation * xec_scaleXf; + const zeus::CTransform xf = zeus::CTransform::Translate(xa4_globalTranslation) * xb0_globalOrientation * xec_scaleXf; return zeus::CAABox(x1f0_aabbMin - x208_maxRadius, x1fc_aabbMax + x208_maxRadius).getTransformedAABox(xf); } } From 8aef2cf95d233044c94d2f1c59eb81f696e2ba10 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Tue, 14 Apr 2020 04:08:40 -0400 Subject: [PATCH 164/224] CParticleElectric: Make use of const where applicable Makes it easier to read long functions by knowing which variables are mutable. --- Runtime/Particle/CParticleElectric.cpp | 319 ++++++++++++++++--------- 1 file changed, 201 insertions(+), 118 deletions(-) diff --git a/Runtime/Particle/CParticleElectric.cpp b/Runtime/Particle/CParticleElectric.cpp index 777c83593..f2b9ef28b 100644 --- a/Runtime/Particle/CParticleElectric.cpp +++ b/Runtime/Particle/CParticleElectric.cpp @@ -1,5 +1,7 @@ #include "Runtime/Particle/CParticleElectric.hpp" +#include + #include "Runtime/GameGlobalObjects.hpp" #include "Runtime/Graphics/CBooRenderer.hpp" #include "Runtime/Graphics/CGraphics.hpp" @@ -31,18 +33,21 @@ CParticleElectric::CParticleElectric(const TToken& token) CElectricDescription* desc = x1c_elecDesc.GetObj(); - if (CIntElement* sseg = desc->x10_SSEG.get()) + if (CIntElement* sseg = desc->x10_SSEG.get()) { sseg->GetValue(x28_currentFrame, x150_SSEG); + } - if (CIntElement* scnt = desc->xc_SCNT.get()) + if (CIntElement* scnt = desc->xc_SCNT.get()) { scnt->GetValue(x28_currentFrame, x154_SCNT); + } x154_SCNT = std::min(x154_SCNT, 32); - if (CIntElement* life = desc->x0_LIFE.get()) + if (CIntElement* life = desc->x0_LIFE.get()) { life->GetValue(0, x2c_LIFE); - else + } else { x2c_LIFE = INT_MAX; + } if (desc->x40_SSWH) { x450_27_haveSSWH = true; @@ -84,8 +89,9 @@ CParticleElectric::CParticleElectric(const TToken& token) } void CParticleElectric::RenderSwooshes() { - for (CParticleElectricManager& elec : x3e8_electricManagers) + for (const CParticleElectricManager& elec : x3e8_electricManagers) { x1e0_swooshGenerators[elec.x0_idx]->Render(); + } } void CParticleElectric::SetupLineGXMaterial() { @@ -94,18 +100,21 @@ void CParticleElectric::SetupLineGXMaterial() { void CParticleElectric::DrawLineStrip(const std::vector& verts, float width, const zeus::CColor& color) { - size_t useIdx = m_nextLineRenderer; - if (++m_nextLineRenderer > m_lineRenderers.size()) + const size_t useIdx = m_nextLineRenderer; + if (++m_nextLineRenderer > m_lineRenderers.size()) { m_lineRenderers.resize(m_nextLineRenderer); - if (!m_lineRenderers[useIdx]) + } + if (!m_lineRenderers[useIdx]) { m_lineRenderers[useIdx] = std::make_unique(CLineRenderer::EPrimitiveMode::LineStrip, x150_SSEG, nullptr, true, true); + } CLineRenderer& renderer = *m_lineRenderers[useIdx]; - zeus::CColor useColor = x1b8_moduColor * color; + const zeus::CColor useColor = x1b8_moduColor * color; renderer.Reset(); - for (const zeus::CVector3f& vert : verts) + for (const zeus::CVector3f& vert : verts) { renderer.AddVertex(vert, useColor, width); + } renderer.Render(g_Renderer->IsThermalVisorHotPass()); } @@ -122,12 +131,15 @@ void CParticleElectric::RenderLines() { SetupLineGXMaterial(); for (CParticleElectricManager& elec : x3e8_electricManagers) { CLineManager& line = *x2e4_lineManagers[elec.x0_idx]; - if (x1c_elecDesc->x28_LWD1) + if (x1c_elecDesc->x28_LWD1) { DrawLineStrip(line.x0_verts, line.x10_widths[0], line.x1c_colors[0]); - if (x1c_elecDesc->x2c_LWD2) + } + if (x1c_elecDesc->x2c_LWD2) { DrawLineStrip(line.x0_verts, line.x10_widths[1], line.x1c_colors[1]); - if (x1c_elecDesc->x30_LWD3) + } + if (x1c_elecDesc->x30_LWD3) { DrawLineStrip(line.x0_verts, line.x10_widths[2], line.x1c_colors[2]); + } } // Enable culling @@ -143,19 +155,25 @@ void CParticleElectric::UpdateCachedTransform() { void CParticleElectric::UpdateLine(int idx, int frame) { CLineManager& line = *x2e4_lineManagers[idx]; - if (CColorElement* lcl1 = x1c_elecDesc->x34_LCL1.get()) + if (CColorElement* lcl1 = x1c_elecDesc->x34_LCL1.get()) { lcl1->GetValue(frame, line.x1c_colors[0]); - if (CColorElement* lcl2 = x1c_elecDesc->x38_LCL2.get()) + } + if (CColorElement* lcl2 = x1c_elecDesc->x38_LCL2.get()) { lcl2->GetValue(frame, line.x1c_colors[1]); - if (CColorElement* lcl3 = x1c_elecDesc->x3c_LCL3.get()) + } + if (CColorElement* lcl3 = x1c_elecDesc->x3c_LCL3.get()) { lcl3->GetValue(frame, line.x1c_colors[2]); + } - if (CRealElement* lwd1 = x1c_elecDesc->x28_LWD1.get()) + if (CRealElement* lwd1 = x1c_elecDesc->x28_LWD1.get()) { lwd1->GetValue(frame, line.x10_widths[0]); - if (CRealElement* lwd2 = x1c_elecDesc->x2c_LWD2.get()) + } + if (CRealElement* lwd2 = x1c_elecDesc->x2c_LWD2.get()) { lwd2->GetValue(frame, line.x10_widths[1]); - if (CRealElement* lwd3 = x1c_elecDesc->x30_LWD3.get()) + } + if (CRealElement* lwd3 = x1c_elecDesc->x30_LWD3.get()) { lwd3->GetValue(frame, line.x10_widths[2]); + } } void CParticleElectric::UpdateElectricalEffects() { @@ -163,28 +181,32 @@ void CParticleElectric::UpdateElectricalEffects() { CParticleElectricManager& elec = *it; if (elec.x4_slif <= 1) { x1bc_allocated[elec.x0_idx] = false; - if (elec.x10_gpsmIdx != -1) + if (elec.x10_gpsmIdx != -1) { x400_gpsmGenerators[elec.x10_gpsmIdx]->SetParticleEmission(false); - if (elec.x14_epsmIdx != -1) + } + if (elec.x14_epsmIdx != -1) { x410_epsmGenerators[elec.x14_epsmIdx]->SetParticleEmission(false); + } it = x3e8_electricManagers.erase(it); continue; } CParticleGlobals::instance()->SetParticleLifetime(elec.xc_endFrame - elec.x8_startFrame); - int frame = x28_currentFrame - elec.x8_startFrame; + const int frame = x28_currentFrame - elec.x8_startFrame; CParticleGlobals::instance()->UpdateParticleLifetimeTweenValues(frame); if (x450_27_haveSSWH) { CParticleSwoosh& swoosh = *x1e0_swooshGenerators[elec.x0_idx]; zeus::CColor color = zeus::skWhite; - if (CColorElement* colr = x1c_elecDesc->x14_COLR.get()) + if (CColorElement* colr = x1c_elecDesc->x14_COLR.get()) { colr->GetValue(frame, color); + } swoosh.SetModulationColor(color * x1b8_moduColor); } - if (x450_28_haveLWD) + if (x450_28_haveLWD) { UpdateLine(elec.x0_idx, frame); + } elec.x4_slif -= 1; ++it; @@ -192,28 +214,34 @@ void CParticleElectric::UpdateElectricalEffects() { } void CParticleElectric::CalculateFractal(int start, int end, float ampl, float ampd) { - float tmp = (end - start) / float(x430_fractalMags.size()) * ampl; - int storeIdx = (start + end) / 2; + const float tmp = float(end - start) / float(x430_fractalMags.size()) * ampl; + const int storeIdx = (start + end) / 2; x430_fractalMags[storeIdx] = (x430_fractalMags[start] + x430_fractalMags[end]) * 0.5f + tmp * x14c_randState.Float() - tmp * 0.5f + ampd * x14c_randState.Float() - ampd * 0.5f; - if ((start + end) & 1) + if ((start + end) & 1) { x430_fractalMags[end - 1] = x430_fractalMags[end]; + } - if (storeIdx - start > 1) + if (storeIdx - start > 1) { CalculateFractal(start, storeIdx, ampl, ampd); - if (end - storeIdx > 1) + } + if (end - storeIdx > 1) { CalculateFractal(storeIdx, end, ampl, ampd); + } } void CParticleElectric::CalculatePoints() { zeus::CVector3f pos, vel; - if (CEmitterElement* iemt = x1c_elecDesc->x18_IEMT.get()) + if (CEmitterElement* iemt = x1c_elecDesc->x18_IEMT.get()) { iemt->GetValue(x28_currentFrame, pos, vel); + } - if (x178_overrideIPos) + if (x178_overrideIPos) { pos = *x178_overrideIPos; - if (x188_overrideIVel) + } + if (x188_overrideIVel) { vel = *x188_overrideIVel; + } rstl::reserved_vector points; @@ -227,13 +255,16 @@ void CParticleElectric::CalculatePoints() { zeus::CVector3f fpos = zeus::skForward; zeus::CVector3f fvel; - if (CEmitterElement* femt = x1c_elecDesc->x1c_FEMT.get()) + if (CEmitterElement* femt = x1c_elecDesc->x1c_FEMT.get()) { femt->GetValue(x28_currentFrame, fpos, fvel); + } - if (x198_overrideFPos) + if (x198_overrideFPos) { fpos = *x198_overrideFPos; - if (x1a8_overrideFVel) + } + if (x1a8_overrideFVel) { fvel = *x1a8_overrideFVel; + } if (!fvel.isZero()) { if (points.size() == 3) { @@ -249,21 +280,21 @@ void CParticleElectric::CalculatePoints() { } if (points.size() == 4) { - int segs = x150_SSEG - 1; - float segDiv = 1.f / float(segs); + const int segs = x150_SSEG - 1; + const float segDiv = 1.f / float(segs); float curDiv = segDiv; for (int i = 1; i < segs; ++i) { - float t = segDiv * x14c_randState.Range(-0.45f, 0.45f) + curDiv; + const float t = segDiv * x14c_randState.Range(-0.45f, 0.45f) + curDiv; x420_calculatedVerts[i] = zeus::getBezierPoint(points[0], points[1], points[2], points[3], t); curDiv += segDiv; } x420_calculatedVerts[segs] = points[3]; } else { x420_calculatedVerts[0] = pos; - int segs = x150_SSEG - 1; - float segDiv = 1.f / float(segs); + const int segs = x150_SSEG - 1; + const float segDiv = 1.f / float(segs); zeus::CVector3f accum = x420_calculatedVerts[0]; - zeus::CVector3f segDelta = (fpos - pos) * segDiv; + const zeus::CVector3f segDelta = (fpos - pos) * segDiv; for (int i = 1; i < segs; ++i) { float r = x14c_randState.Range(-0.45f, 0.45f); x420_calculatedVerts[i] = segDelta * r + accum; @@ -272,8 +303,9 @@ void CParticleElectric::CalculatePoints() { x420_calculatedVerts[segs] = fpos; } - for (int i = 0; i < x150_SSEG; ++i) + for (int i = 0; i < x150_SSEG; ++i) { x430_fractalMags[i] = 0.f; + } float amplVal = 1.f; if (CRealElement* ampl = x1c_elecDesc->x20_AMPL.get()) { @@ -282,8 +314,9 @@ void CParticleElectric::CalculatePoints() { } float ampdVal = 0.f; - if (CRealElement* ampd = x1c_elecDesc->x24_AMPD.get()) + if (CRealElement* ampd = x1c_elecDesc->x24_AMPD.get()) { ampd->GetValue(x28_currentFrame, ampdVal); + } CalculateFractal(0, x420_calculatedVerts.size() - 1, amplVal, ampdVal); @@ -294,55 +327,63 @@ void CParticleElectric::CalculatePoints() { v0.normalize(); v1.normalize(); float dot = v0.dot(v1); - if (dot < 0) + if (dot < 0) { dot = -dot; - if (std::fabs(dot - 1.f) < 0.00001f) + } + if (std::fabs(dot - 1.f) < 0.00001f) { upVec = zeus::lookAt(x420_calculatedVerts[0], x420_calculatedVerts[1]).basis[2]; - else + } else { upVec = v0.cross(v1).normalized(); + } } else if (x420_calculatedVerts[0] != x420_calculatedVerts[1]) { upVec = zeus::lookAt(x420_calculatedVerts[0], x420_calculatedVerts[1]).basis[2]; } - float commonRand = x14c_randState.Range(0.f, 360.f); + const float commonRand = x14c_randState.Range(0.f, 360.f); - for (int i = 1; i < x420_calculatedVerts.size() - 1; ++i) { - zeus::CVector3f delta = x420_calculatedVerts[i] - x420_calculatedVerts[i - 1]; + for (size_t i = 1; i < x420_calculatedVerts.size() - 1; ++i) { + const zeus::CVector3f delta = x420_calculatedVerts[i] - x420_calculatedVerts[i - 1]; if (!delta.isZero()) { - zeus::CRelAngle angle = + const zeus::CRelAngle angle = zeus::degToRad(x430_fractalMags[i] / amplVal * 16.f * x14c_randState.Range(-1.f, 1.f) + commonRand); x440_fractalOffsets[i] = zeus::CQuaternion::fromAxisAngle(delta, angle).transform(x430_fractalMags[i] * upVec); } } - for (int i = 1; i < x420_calculatedVerts.size() - 1; ++i) + for (size_t i = 1; i < x420_calculatedVerts.size() - 1; ++i) { x420_calculatedVerts[i] += x440_fractalOffsets[i]; + } - if (x1c_elecDesc->x70_ZERY) - for (int i = 0; i < x420_calculatedVerts.size(); ++i) - x420_calculatedVerts[i].y() = 0.f; + if (x1c_elecDesc->x70_ZERY) { + for (auto& calculatedVert : x420_calculatedVerts) { + calculatedVert.y() = 0.f; + } + } } void CParticleElectric::CreateNewParticles(int count) { int allocIdx = 0; + for (int i = 0; i < count; ++i) { if (x3e8_electricManagers.size() < x154_SCNT) { - zeus::CTransform cachedRot = xf8_cachedXf.getRotation(); + const zeus::CTransform cachedRot = xf8_cachedXf.getRotation(); - int toAdd = x1bc_allocated.size() - allocIdx; + const int toAdd = x1bc_allocated.size() - allocIdx; for (int j = 0; j < toAdd; ++j, ++allocIdx) { - if (x1bc_allocated[allocIdx]) + if (x1bc_allocated[allocIdx]) { continue; + } x1bc_allocated[allocIdx] = true; int lifetime = 1; - if (CIntElement* slif = x1c_elecDesc->x4_SLIF.get()) + if (CIntElement* slif = x1c_elecDesc->x4_SLIF.get()) { slif->GetValue(x28_currentFrame, lifetime); + } x3e8_electricManagers.emplace_back(allocIdx, lifetime, x28_currentFrame); CParticleElectricManager& elec = x3e8_electricManagers.back(); CParticleGlobals::instance()->SetParticleLifetime(elec.xc_endFrame - elec.x8_startFrame); - int frame = x28_currentFrame - elec.x8_startFrame; + const int frame = x28_currentFrame - elec.x8_startFrame; CParticleGlobals::instance()->UpdateParticleLifetimeTweenValues(frame); CalculatePoints(); @@ -354,8 +395,9 @@ void CParticleElectric::CreateNewParticles(int count) { swoosh.SetGlobalScale(xe0_globalScale); swoosh.SetLocalScale(xec_localScale); zeus::CColor color = zeus::skWhite; - if (CColorElement* colr = x1c_elecDesc->x14_COLR.get()) + if (CColorElement* colr = x1c_elecDesc->x14_COLR.get()) { colr->GetValue(frame, color); + } swoosh.SetModulationColor(color * x1b8_moduColor); swoosh.DoElectricCreate(x420_calculatedVerts); } @@ -366,8 +408,9 @@ void CParticleElectric::CreateNewParticles(int count) { UpdateLine(allocIdx, 0); if (x450_27_haveSSWH) { x130_buildBounds = zeus::CAABox(); - for (const zeus::CVector3f& vec : x420_calculatedVerts) + for (const zeus::CVector3f& vec : x420_calculatedVerts) { x130_buildBounds.accumulateBounds(vec); + } line.x28_aabb = x130_buildBounds; } } @@ -376,7 +419,7 @@ void CParticleElectric::CreateNewParticles(int count) { for (int k = 0; k < x154_SCNT; ++k) { CElementGen& gen = *x400_gpsmGenerators[k]; if (!gen.GetParticleEmission()) { - zeus::CTransform scale = + const zeus::CTransform scale = zeus::CTransform::Scale(xe0_globalScale) * zeus::CTransform::Scale(xec_localScale); gen.SetTranslation(scale * x420_calculatedVerts.front()); gen.SetParticleEmission(true); @@ -390,7 +433,7 @@ void CParticleElectric::CreateNewParticles(int count) { for (int k = 0; k < x154_SCNT; ++k) { CElementGen& gen = *x410_epsmGenerators[k]; if (!gen.GetParticleEmission()) { - zeus::CTransform scale = + const zeus::CTransform scale = zeus::CTransform::Scale(xe0_globalScale) * zeus::CTransform::Scale(xec_localScale); gen.SetTranslation(scale * x420_calculatedVerts.back()); gen.SetParticleEmission(true); @@ -411,8 +454,7 @@ void CParticleElectric::AddElectricalEffects() { if (CRealElement* grat = x1c_elecDesc->x8_GRAT.get()) { if (grat->GetValue(x28_currentFrame, genRate)) { x3e8_electricManagers.clear(); - for (int i = 0; i < x1bc_allocated.size(); ++i) - x1bc_allocated[i] = false; + std::fill(x1bc_allocated.begin(), x1bc_allocated.end(), false); return; } else { genRate = std::max(0.f, genRate); @@ -420,7 +462,7 @@ void CParticleElectric::AddElectricalEffects() { } x15c_genRem += genRate; - int partCount = std::floor(x15c_genRem); + const int partCount = std::floor(x15c_genRem); x15c_genRem -= partCount; CreateNewParticles(partCount); } @@ -434,14 +476,15 @@ void CParticleElectric::BuildBounds() { x160_systemBounds = zeus::CAABox(); if (x450_27_haveSSWH) { - for (CParticleElectricManager& elec : x3e8_electricManagers) { - CParticleSwoosh& swoosh = *x1e0_swooshGenerators[elec.x0_idx]; - if (auto bounds = swoosh.GetBounds()) + for (const CParticleElectricManager& elec : x3e8_electricManagers) { + const CParticleSwoosh& swoosh = *x1e0_swooshGenerators[elec.x0_idx]; + if (const auto bounds = swoosh.GetBounds()) { x160_systemBounds.accumulateBounds(*bounds); + } } } else if (x450_28_haveLWD) { zeus::CAABox tmp = zeus::CAABox(); - for (CParticleElectricManager& elec : x3e8_electricManagers) { + for (const CParticleElectricManager& elec : x3e8_electricManagers) { CLineManager& line = *x2e4_lineManagers[elec.x0_idx]; tmp.accumulateBounds(line.x28_aabb); } @@ -453,15 +496,19 @@ void CParticleElectric::BuildBounds() { } if (x450_25_haveGPSM) { - for (int i = 0; i < x154_SCNT; ++i) - if (auto bounds = x400_gpsmGenerators[i]->GetBounds()) + for (int i = 0; i < x154_SCNT; ++i) { + if (auto bounds = x400_gpsmGenerators[i]->GetBounds()) { x160_systemBounds.accumulateBounds(*bounds); + } + } } if (x450_26_haveEPSM) { - for (int i = 0; i < x154_SCNT; ++i) - if (auto bounds = x410_epsmGenerators[i]->GetBounds()) + for (int i = 0; i < x154_SCNT; ++i) { + if (auto bounds = x410_epsmGenerators[i]->GetBounds()) { x160_systemBounds.accumulateBounds(*bounds); + } + } } } @@ -470,27 +517,31 @@ bool CParticleElectric::Update(double dt) { bool ret = false; if (x450_25_haveGPSM) { - for (int i = 0; i < x154_SCNT; ++i) - if (!x400_gpsmGenerators[i]->IsSystemDeletable()) + for (int i = 0; i < x154_SCNT; ++i) { + if (!x400_gpsmGenerators[i]->IsSystemDeletable()) { break; + } + } } if (x450_26_haveEPSM) { - for (int i = 0; i < x154_SCNT; ++i) - if (!x410_epsmGenerators[i]->IsSystemDeletable()) + for (int i = 0; i < x154_SCNT; ++i) { + if (!x410_epsmGenerators[i]->IsSystemDeletable()) { break; + } + } } - bool emitting = x450_24_emitting && x28_currentFrame < x2c_LIFE; + const bool emitting = x450_24_emitting && x28_currentFrame < x2c_LIFE; double evalTime = x28_currentFrame / 60.0; x30_curTime += dt; if (x450_29_transformDirty) { UpdateCachedTransform(); - zeus::CTransform globalOrient = xf8_cachedXf.getRotation(); + const zeus::CTransform globalOrient = xf8_cachedXf.getRotation(); if (x450_27_haveSSWH) { - for (CParticleElectricManager& elec : x3e8_electricManagers) { + for (const CParticleElectricManager& elec : x3e8_electricManagers) { CParticleSwoosh& swoosh = *x1e0_swooshGenerators[elec.x0_idx]; swoosh.SetGlobalTranslation(xf8_cachedXf.origin); swoosh.SetGlobalOrientation(globalOrient); @@ -500,7 +551,7 @@ bool CParticleElectric::Update(double dt) { } if (x450_25_haveGPSM) { - for (CParticleElectricManager& elec : x3e8_electricManagers) { + for (const CParticleElectricManager& elec : x3e8_electricManagers) { CElementGen& gen = *x400_gpsmGenerators[elec.x0_idx]; gen.SetGlobalTranslation(xf8_cachedXf.origin); gen.SetGlobalOrientation(globalOrient); @@ -510,7 +561,7 @@ bool CParticleElectric::Update(double dt) { } if (x450_26_haveEPSM) { - for (CParticleElectricManager& elec : x3e8_electricManagers) { + for (const CParticleElectricManager& elec : x3e8_electricManagers) { CElementGen& gen = *x410_epsmGenerators[elec.x0_idx]; gen.SetGlobalTranslation(xf8_cachedXf.origin); gen.SetGlobalOrientation(globalOrient); @@ -529,19 +580,25 @@ bool CParticleElectric::Update(double dt) { AddElectricalEffects(); if (x450_25_haveGPSM) { - if (x28_currentFrame >= x2c_LIFE) - for (int i = 0; i < x154_SCNT; ++i) + if (x28_currentFrame >= x2c_LIFE) { + for (int i = 0; i < x154_SCNT; ++i) { x400_gpsmGenerators[i]->EndLifetime(); - for (int i = 0; i < x154_SCNT; ++i) + } + } + for (int i = 0; i < x154_SCNT; ++i) { x400_gpsmGenerators[i]->Update(1.0 / 60.0); + } } if (x450_26_haveEPSM) { - if (x28_currentFrame >= x2c_LIFE) - for (int i = 0; i < x154_SCNT; ++i) + if (x28_currentFrame >= x2c_LIFE) { + for (int i = 0; i < x154_SCNT; ++i) { x410_epsmGenerators[i]->EndLifetime(); - for (int i = 0; i < x154_SCNT; ++i) + } + } + for (int i = 0; i < x154_SCNT; ++i) { x410_epsmGenerators[i]->Update(1.0 / 60.0); + } } ret = true; @@ -549,8 +606,9 @@ bool CParticleElectric::Update(double dt) { x28_currentFrame += 1; } - if (ret) + if (ret) { BuildBounds(); + } return ret; } @@ -560,22 +618,27 @@ void CParticleElectric::Render(const CActorLights* lights) { *x1c_elecDesc.GetObjectTag()).c_str(), zeus::skYellow); if (x3e8_electricManagers.size()) { - if (x450_29_transformDirty) + if (x450_29_transformDirty) { UpdateCachedTransform(); - if (x450_27_haveSSWH) + } + if (x450_27_haveSSWH) { RenderSwooshes(); - if (x450_28_haveLWD) + } + if (x450_28_haveLWD) { RenderLines(); + } } if (x450_25_haveGPSM) { - for (int i = 0; i < x154_SCNT; ++i) + for (int i = 0; i < x154_SCNT; ++i) { x400_gpsmGenerators[i]->Render(lights); + } } if (x450_26_haveEPSM) { - for (int i = 0; i < x154_SCNT; ++i) + for (int i = 0; i < x154_SCNT; ++i) { x410_epsmGenerators[i]->Render(lights); + } } } @@ -595,20 +658,22 @@ void CParticleElectric::SetGlobalOrientation(const zeus::CTransform& orientation x450_29_transformDirty = true; if (x450_27_haveSSWH) { - for (CParticleElectricManager& elec : x3e8_electricManagers) { + for (const CParticleElectricManager& elec : x3e8_electricManagers) { CParticleSwoosh& swoosh = *x1e0_swooshGenerators[elec.x0_idx]; swoosh.SetGlobalOrientation(xb0_globalOrientation); } } if (x450_25_haveGPSM) { - for (int i = 0; i < x154_SCNT; ++i) + for (int i = 0; i < x154_SCNT; ++i) { x400_gpsmGenerators[i]->SetGlobalOrientation(xb0_globalOrientation); + } } if (x450_26_haveEPSM) { - for (int i = 0; i < x154_SCNT; ++i) + for (int i = 0; i < x154_SCNT; ++i) { x410_epsmGenerators[i]->SetGlobalOrientation(xb0_globalOrientation); + } } } @@ -617,20 +682,22 @@ void CParticleElectric::SetGlobalTranslation(const zeus::CVector3f& translation) x450_29_transformDirty = true; if (x450_27_haveSSWH) { - for (CParticleElectricManager& elec : x3e8_electricManagers) { + for (const CParticleElectricManager& elec : x3e8_electricManagers) { CParticleSwoosh& swoosh = *x1e0_swooshGenerators[elec.x0_idx]; swoosh.SetGlobalTranslation(xa4_globalTranslation); } } if (x450_25_haveGPSM) { - for (int i = 0; i < x154_SCNT; ++i) + for (int i = 0; i < x154_SCNT; ++i) { x400_gpsmGenerators[i]->SetGlobalTranslation(xa4_globalTranslation); + } } if (x450_26_haveEPSM) { - for (int i = 0; i < x154_SCNT; ++i) + for (int i = 0; i < x154_SCNT; ++i) { x410_epsmGenerators[i]->SetGlobalTranslation(xa4_globalTranslation); + } } } @@ -644,20 +711,22 @@ void CParticleElectric::SetLocalScale(const zeus::CVector3f& scale) { x450_29_transformDirty = true; if (x450_27_haveSSWH) { - for (CParticleElectricManager& elec : x3e8_electricManagers) { + for (const CParticleElectricManager& elec : x3e8_electricManagers) { CParticleSwoosh& swoosh = *x1e0_swooshGenerators[elec.x0_idx]; swoosh.SetLocalScale(xec_localScale); } } if (x450_25_haveGPSM) { - for (int i = 0; i < x154_SCNT; ++i) + for (int i = 0; i < x154_SCNT; ++i) { x400_gpsmGenerators[i]->SetLocalScale(xec_localScale); + } } if (x450_26_haveEPSM) { - for (int i = 0; i < x154_SCNT; ++i) + for (int i = 0; i < x154_SCNT; ++i) { x410_epsmGenerators[i]->SetLocalScale(xec_localScale); + } } } @@ -678,22 +747,28 @@ const zeus::CVector3f& CParticleElectric::GetGlobalScale() const { return xe0_gl const zeus::CColor& CParticleElectric::GetModulationColor() const { return x1b8_moduColor; } bool CParticleElectric::IsSystemDeletable() const { - if (x450_24_emitting && x28_currentFrame < x2c_LIFE) + if (x450_24_emitting && x28_currentFrame < x2c_LIFE) { return false; + } - if (x3e8_electricManagers.size()) + if (x3e8_electricManagers.size()) { return false; + } if (x450_25_haveGPSM) { - for (int i = 0; i < x154_SCNT; ++i) - if (!x400_gpsmGenerators[i]->IsSystemDeletable()) + for (int i = 0; i < x154_SCNT; ++i) { + if (!x400_gpsmGenerators[i]->IsSystemDeletable()) { return false; + } + } } if (x450_26_haveEPSM) { - for (int i = 0; i < x154_SCNT; ++i) - if (!x410_epsmGenerators[i]->IsSystemDeletable()) + for (int i = 0; i < x154_SCNT; ++i) { + if (!x410_epsmGenerators[i]->IsSystemDeletable()) { return false; + } + } } return true; @@ -711,38 +786,46 @@ u32 CParticleElectric::GetParticleCount() const { u32 ret = 0; for (const CParticleElectricManager& elec : x3e8_electricManagers) { - if (x450_27_haveSSWH) + if (x450_27_haveSSWH) { ret += x1e0_swooshGenerators[elec.x0_idx]->GetParticleCount(); - if (x450_28_haveLWD) + } + if (x450_28_haveLWD) { ret += x150_SSEG; + } } if (x450_25_haveGPSM) { - for (int i = 0; i < x154_SCNT; ++i) + for (int i = 0; i < x154_SCNT; ++i) { ret += x400_gpsmGenerators[i]->GetParticleCount(); + } } if (x450_26_haveEPSM) { - for (int i = 0; i < x154_SCNT; ++i) + for (int i = 0; i < x154_SCNT; ++i) { ret += x410_epsmGenerators[i]->GetParticleCount(); + } } return ret; } bool CParticleElectric::SystemHasLight() const { - if (x450_25_haveGPSM) + if (x450_25_haveGPSM) { return x400_gpsmGenerators.front()->SystemHasLight(); - else if (x450_26_haveEPSM) + } + if (x450_26_haveEPSM) { return x410_epsmGenerators.front()->SystemHasLight(); + } return false; } CLight CParticleElectric::GetLight() const { - if (x450_25_haveGPSM) + if (x450_25_haveGPSM) { return x400_gpsmGenerators.front()->GetLight(); - else if (x450_26_haveEPSM) + } + if (x450_26_haveEPSM) { return x410_epsmGenerators.front()->GetLight(); + } return CLight::BuildLocalAmbient(GetGlobalTranslation(), zeus::skOrange); } From 4cbf8ef513f2cc7d99127955e6702df300c5a946 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Tue, 14 Apr 2020 12:16:22 -0400 Subject: [PATCH 165/224] CParticleElectric: Mark CGlobalRandom instance as maybe unused This has a stateful destructor, so we mark it as unused to silence unused variable warnings. --- Runtime/Particle/CParticleElectric.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Particle/CParticleElectric.cpp b/Runtime/Particle/CParticleElectric.cpp index f2b9ef28b..9c4e4c491 100644 --- a/Runtime/Particle/CParticleElectric.cpp +++ b/Runtime/Particle/CParticleElectric.cpp @@ -513,7 +513,7 @@ void CParticleElectric::BuildBounds() { } bool CParticleElectric::Update(double dt) { - CGlobalRandom gr(x14c_randState); + [[maybe_unused]] CGlobalRandom gr(x14c_randState); bool ret = false; if (x450_25_haveGPSM) { From 5381c011a024208ab64747b07806a3b4ef9bbbb2 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Tue, 14 Apr 2020 12:30:34 -0400 Subject: [PATCH 166/224] CParticleElectric: Eliminate several sign conversion instances Makes sign conversion cases explicit and eliminates them entirely in other cases. --- Runtime/Particle/CParticleElectric.cpp | 26 +++++++++++++------------- Runtime/Particle/CParticleElectric.hpp | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Runtime/Particle/CParticleElectric.cpp b/Runtime/Particle/CParticleElectric.cpp index 9c4e4c491..b7584b936 100644 --- a/Runtime/Particle/CParticleElectric.cpp +++ b/Runtime/Particle/CParticleElectric.cpp @@ -152,7 +152,7 @@ void CParticleElectric::UpdateCachedTransform() { x450_29_transformDirty = false; } -void CParticleElectric::UpdateLine(int idx, int frame) { +void CParticleElectric::UpdateLine(size_t idx, int frame) { CLineManager& line = *x2e4_lineManagers[idx]; if (CColorElement* lcl1 = x1c_elecDesc->x34_LCL1.get()) { @@ -191,8 +191,8 @@ void CParticleElectric::UpdateElectricalEffects() { continue; } - CParticleGlobals::instance()->SetParticleLifetime(elec.xc_endFrame - elec.x8_startFrame); - const int frame = x28_currentFrame - elec.x8_startFrame; + CParticleGlobals::instance()->SetParticleLifetime(int(elec.xc_endFrame - elec.x8_startFrame)); + const int frame = x28_currentFrame - int(elec.x8_startFrame); CParticleGlobals::instance()->UpdateParticleLifetimeTweenValues(frame); if (x450_27_haveSSWH) { @@ -218,7 +218,7 @@ void CParticleElectric::CalculateFractal(int start, int end, float ampl, float a const int storeIdx = (start + end) / 2; x430_fractalMags[storeIdx] = (x430_fractalMags[start] + x430_fractalMags[end]) * 0.5f + tmp * x14c_randState.Float() - tmp * 0.5f + ampd * x14c_randState.Float() - ampd * 0.5f; - if ((start + end) & 1) { + if (((start + end) & 1) != 0) { x430_fractalMags[end - 1] = x430_fractalMags[end]; } @@ -362,14 +362,14 @@ void CParticleElectric::CalculatePoints() { } void CParticleElectric::CreateNewParticles(int count) { - int allocIdx = 0; + size_t allocIdx = 0; for (int i = 0; i < count; ++i) { - if (x3e8_electricManagers.size() < x154_SCNT) { + if (x3e8_electricManagers.size() < size_t(x154_SCNT)) { const zeus::CTransform cachedRot = xf8_cachedXf.getRotation(); - const int toAdd = x1bc_allocated.size() - allocIdx; - for (int j = 0; j < toAdd; ++j, ++allocIdx) { + const size_t toAdd = x1bc_allocated.size() - allocIdx; + for (size_t j = 0; j < toAdd; ++j, ++allocIdx) { if (x1bc_allocated[allocIdx]) { continue; } @@ -383,7 +383,7 @@ void CParticleElectric::CreateNewParticles(int count) { x3e8_electricManagers.emplace_back(allocIdx, lifetime, x28_currentFrame); CParticleElectricManager& elec = x3e8_electricManagers.back(); CParticleGlobals::instance()->SetParticleLifetime(elec.xc_endFrame - elec.x8_startFrame); - const int frame = x28_currentFrame - elec.x8_startFrame; + const int frame = x28_currentFrame - int(elec.x8_startFrame); CParticleGlobals::instance()->UpdateParticleLifetimeTweenValues(frame); CalculatePoints(); @@ -462,9 +462,9 @@ void CParticleElectric::AddElectricalEffects() { } x15c_genRem += genRate; - const int partCount = std::floor(x15c_genRem); + const float partCount = std::floor(x15c_genRem); x15c_genRem -= partCount; - CreateNewParticles(partCount); + CreateNewParticles(int(partCount)); } void CParticleElectric::BuildBounds() { @@ -617,7 +617,7 @@ void CParticleElectric::Render(const CActorLights* lights) { SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CParticleElectric::Render {}"), *x1c_elecDesc.GetObjectTag()).c_str(), zeus::skYellow); - if (x3e8_electricManagers.size()) { + if (!x3e8_electricManagers.empty()) { if (x450_29_transformDirty) { UpdateCachedTransform(); } @@ -751,7 +751,7 @@ bool CParticleElectric::IsSystemDeletable() const { return false; } - if (x3e8_electricManagers.size()) { + if (!x3e8_electricManagers.empty()) { return false; } diff --git a/Runtime/Particle/CParticleElectric.hpp b/Runtime/Particle/CParticleElectric.hpp index d69e66f86..7a77b089e 100644 --- a/Runtime/Particle/CParticleElectric.hpp +++ b/Runtime/Particle/CParticleElectric.hpp @@ -100,7 +100,7 @@ private: void RenderLines(); void RenderSwooshes(); void UpdateCachedTransform(); - void UpdateLine(int idx, int frame); + void UpdateLine(size_t idx, int frame); void UpdateElectricalEffects(); void CalculateFractal(int start, int end, float ampl, float ampd); void CalculatePoints(); From 3c8ce3dc99bf2b14dc33f01bf4c17a2893913ecf Mon Sep 17 00:00:00 2001 From: Lioncash Date: Tue, 14 Apr 2020 13:34:47 -0400 Subject: [PATCH 167/224] CGuiTextSupport: Amend typo in debug group label This is within the Render() function, so we can rename the group name. --- Runtime/GuiSys/CGuiTextSupport.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/GuiSys/CGuiTextSupport.cpp b/Runtime/GuiSys/CGuiTextSupport.cpp index e190df769..de1cc1da2 100644 --- a/Runtime/GuiSys/CGuiTextSupport.cpp +++ b/Runtime/GuiSys/CGuiTextSupport.cpp @@ -219,7 +219,7 @@ void CGuiTextSupport::AutoSetExtent() { void CGuiTextSupport::Render() { CheckAndRebuildRenderBuffer(); if (CTextRenderBuffer* buf = GetCurrentPageRenderBuffer()) { - SCOPED_GRAPHICS_DEBUG_GROUP("CGuiTextSupport::Draw", zeus::skBlue); + SCOPED_GRAPHICS_DEBUG_GROUP("CGuiTextSupport::Render", zeus::skBlue); zeus::CTransform oldModel = CGraphics::g_GXModelMatrix; CGraphics::SetModelMatrix(oldModel * zeus::CTransform::Scale(1.f, 1.f, -1.f)); buf->Render(x2c_geometryColor, x10_curTimeMod900); From 94be460a1bf447e68c62e1b32a83fe06652a76a6 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Tue, 14 Apr 2020 14:40:49 -0400 Subject: [PATCH 168/224] MP1: Convert MP1_VARIABLE_DELTA_TIME to cvar --- Runtime/MP1/MP1.cpp | 19 ++++++++++--------- Runtime/MP1/MP1.hpp | 5 ----- hecl | 2 +- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/Runtime/MP1/MP1.cpp b/Runtime/MP1/MP1.cpp index ac4a6bf10..c1d16f202 100644 --- a/Runtime/MP1/MP1.cpp +++ b/Runtime/MP1/MP1.cpp @@ -74,6 +74,7 @@ namespace hecl { extern CVar* com_enableCheats; extern CVar* com_developer; extern CVar* com_cubemaps; +extern CVar* com_variableDt; }; // namespace hecl namespace urde::MP1 { @@ -838,16 +839,16 @@ bool CMain::Proc() { } float dt = 1 / 60.f; -#if MP1_VARIABLE_DELTA_TIME - auto now = delta_clock::now(); - if (m_firstFrame) { - m_firstFrame = false; - } else { - using delta_duration = std::chrono::duration>; - dt = std::min(std::chrono::duration_cast(now - m_prevFrameTime).count(), 1 / 30.f); + if (hecl::com_variableDt->toBoolean()) { + auto now = delta_clock::now(); + if (m_firstFrame) { + m_firstFrame = false; + } else { + using delta_duration = std::chrono::duration>; + dt = std::min(std::chrono::duration_cast(now - m_prevFrameTime).count(), 1 / 30.f); + } + m_prevFrameTime = now; } - m_prevFrameTime = now; -#endif m_console->proc(); if (!m_console->isOpen()) { diff --git a/Runtime/MP1/MP1.hpp b/Runtime/MP1/MP1.hpp index 62eb6d958..915c28523 100644 --- a/Runtime/MP1/MP1.hpp +++ b/Runtime/MP1/MP1.hpp @@ -3,9 +3,6 @@ #ifndef MP1_USE_BOO #define MP1_USE_BOO 0 #endif -#ifndef MP1_VARIABLE_DELTA_TIME -#define MP1_VARIABLE_DELTA_TIME 0 -#endif #include "IMain.hpp" #include "CTweaks.hpp" @@ -250,11 +247,9 @@ private: bool m_loadedPersistentResources = false; bool m_doQuit = false; -#if MP1_VARIABLE_DELTA_TIME bool m_firstFrame = true; using delta_clock = std::chrono::high_resolution_clock; std::chrono::time_point m_prevFrameTime; -#endif void InitializeSubsystems(); static void InitializeDiscord(); diff --git a/hecl b/hecl index f64ed44fe..90366475c 160000 --- a/hecl +++ b/hecl @@ -1 +1 @@ -Subproject commit f64ed44fe8164b06ed5bef6344d9f743e2c5d638 +Subproject commit 90366475c1d45b53f080f57dd7e5626145fdd649 From 9cf95b5c10128cca18bcb4f477ed5adff991fd5f Mon Sep 17 00:00:00 2001 From: Luke Street Date: Tue, 14 Apr 2020 15:20:51 -0400 Subject: [PATCH 169/224] Editor: Move cvars to CVarCommons --- Editor/ViewManager.cpp | 20 +++++++------------- Editor/ViewManager.hpp | 5 ++++- Editor/main.cpp | 22 ---------------------- Runtime/MP1/MP1.cpp | 4 ++-- Runtime/MP1/MP1.hpp | 2 ++ hecl | 2 +- 6 files changed, 16 insertions(+), 39 deletions(-) diff --git a/Editor/ViewManager.cpp b/Editor/ViewManager.cpp index 99438caab..5252498ee 100644 --- a/Editor/ViewManager.cpp +++ b/Editor/ViewManager.cpp @@ -29,7 +29,7 @@ void ViewManager::InitMP1(MP1::CMain& main) { if (!m_noShaderWarmup) main.WarmupShaders(); - m_testGameView.reset(new TestGameView(*this, m_viewResources, *m_rootView)); + m_testGameView.reset(new TestGameView(*this, m_viewResources, *m_rootView, m_cvarManager)); m_rootView->accessContentViews().clear(); m_rootView->accessContentViews().push_back(m_testGameView.get()); @@ -62,17 +62,11 @@ void ViewManager::TestGameView::think() { if (m_debugText) { std::string overlayText; - const hecl::CVar* showFrameIdx = hecl::CVarManager::instance()->findCVar("debugOverlay.showFrameCounter"); - const hecl::CVar* playerInfo = hecl::CVarManager::instance()->findCVar("debugOverlay.playerInfo"); - const hecl::CVar* worldInfo = hecl::CVarManager::instance()->findCVar("debugOverlay.worldInfo"); - const hecl::CVar* areaInfo = hecl::CVarManager::instance()->findCVar("debugOverlay.areaInfo"); - const hecl::CVar* showInGameTime = hecl::CVarManager::instance()->findCVar("debugOverlay.showInGameTime"); - const hecl::CVar* showResourceStats = hecl::CVarManager::instance()->findCVar("debugOverlay.showResourceStats"); if (g_StateManager) { - if (showFrameIdx && showFrameIdx->toBoolean()) + if (m_cvarCommons.m_debugOverlayShowFrameCounter->toBoolean()) overlayText += fmt::format(FMT_STRING("Frame: {}\n"), g_StateManager->GetUpdateFrameIndex()); - if (showInGameTime && showInGameTime->toBoolean()) { + if (m_cvarCommons.m_debugOverlayShowInGameTime->toBoolean()) { double igt = g_GameState->GetTotalPlayTime(); u32 ms = u64(igt * 1000) % 1000; auto pt = std::div(igt, 3600); @@ -80,7 +74,7 @@ void ViewManager::TestGameView::think() { fmt::format(FMT_STRING("PlayTime: {:02d}:{:02d}:{:02d}.{:03d}\n"), pt.quot, pt.rem / 60, pt.rem % 60, ms); } - if (g_StateManager->Player() && playerInfo && playerInfo->toBoolean()) { + if (g_StateManager->Player() && m_cvarCommons.m_debugOverlayPlayerInfo->toBoolean()) { const CPlayer& pl = g_StateManager->GetPlayer(); const zeus::CQuaternion plQ = zeus::CQuaternion(pl.GetTransform().getRotation().buildMatrix3f()); const zeus::CTransform camXf = g_StateManager->GetCameraManager()->GetCurrentCameraTransform(*g_StateManager); @@ -98,7 +92,7 @@ void ViewManager::TestGameView::think() { camXf.origin.y(), camXf.origin.z(), zeus::radToDeg(camQ.roll()), zeus::radToDeg(camQ.pitch()), zeus::radToDeg(camQ.yaw())); } - if (worldInfo && worldInfo->toBoolean()) { + if (m_cvarCommons.m_debugOverlayWorldInfo->toBoolean()) { TLockedToken tbl = g_SimplePool->GetObj({FOURCC('STRG'), g_StateManager->GetWorld()->IGetStringTableAssetId()}); const urde::TAreaId aId = g_GameState->CurrentWorldState().GetCurrentAreaId(); @@ -107,7 +101,7 @@ void ViewManager::TestGameView::think() { } const urde::TAreaId aId = g_GameState->CurrentWorldState().GetCurrentAreaId(); - if (areaInfo && areaInfo->toBoolean() && g_StateManager->GetWorld() && + if (m_cvarCommons.m_debugOverlayAreaInfo->toBoolean() && g_StateManager->GetWorld() && g_StateManager->GetWorld()->DoesAreaExist(aId)) { const auto& layerStates = g_GameState->CurrentWorldState().GetLayerState(); std::string layerBits; @@ -126,7 +120,7 @@ void ViewManager::TestGameView::think() { } } - if (showResourceStats && showResourceStats->toBoolean()) + if (m_cvarCommons.m_debugOverlayShowResourceStats->toBoolean()) overlayText += fmt::format(FMT_STRING("Resource Objects: {}\n"), g_SimplePool->GetLiveObjects()); if (!overlayText.empty()) diff --git a/Editor/ViewManager.hpp b/Editor/ViewManager.hpp index 3ca27a896..d37a4213c 100644 --- a/Editor/ViewManager.hpp +++ b/Editor/ViewManager.hpp @@ -1,6 +1,7 @@ #pragma once #include "hecl/CVarManager.hpp" +#include "hecl/CVarCommons.hpp" #include "boo/audiodev/IAudioVoiceEngine.hpp" #include "amuse/BooBackend.hpp" #include "ProjectManager.hpp" @@ -57,9 +58,11 @@ class ViewManager final : public specter::IViewManager { class TestGameView : public specter::View { ViewManager& m_vm; std::unique_ptr m_debugText; + hecl::CVarCommons m_cvarCommons; public: - TestGameView(ViewManager& vm, specter::ViewResources& res, specter::View& parent) : View(res, parent), m_vm(vm) {} + TestGameView(ViewManager& vm, specter::ViewResources& res, specter::View& parent, hecl::CVarManager& cvarMgr) + : View(res, parent), m_vm(vm), m_cvarCommons(cvarMgr) {} void resized(const boo::SWindowRect& root, const boo::SWindowRect& sub) override; void draw(boo::IGraphicsCommandQueue* gfxQ) override; void think() override; diff --git a/Editor/main.cpp b/Editor/main.cpp index db97f7188..01c40d59f 100644 --- a/Editor/main.cpp +++ b/Editor/main.cpp @@ -89,7 +89,6 @@ struct Application : boo::IApplicationCallback { void initialize(boo::IApplication* app) { zeus::detectCPU(); - createGlobalCVars(); for (const boo::SystemString& arg : app->getArgs()) { if (arg.find(_SYS_STR("--verbosity=")) == 0 || arg.find(_SYS_STR("-v=")) == 0) { hecl::SystemUTF8Conv utf8Arg(arg.substr(arg.find_last_of('=') + 1)); @@ -113,27 +112,6 @@ struct Application : boo::IApplicationCallback { uint32_t getAnisotropy() const { return m_cvarCommons.getAnisotropy(); } bool getDeepColor() const { return m_cvarCommons.getDeepColor(); } - - void createGlobalCVars() { - m_cvarManager.findOrMakeCVar("debugOverlay.playerInfo"sv, - "Displays information about the player, such as location and orientation"sv, false, - hecl::CVar::EFlags::Game | hecl::CVar::EFlags::Archive | hecl::CVar::EFlags::ReadOnly); - m_cvarManager.findOrMakeCVar("debugOverlay.worldInfo"sv, - "Displays information about the current world, such as world asset ID, and areaId"sv, - false, - hecl::CVar::EFlags::Game | hecl::CVar::EFlags::Archive | hecl::CVar::EFlags::ReadOnly); - m_cvarManager.findOrMakeCVar( - "debugOverlay.areaInfo"sv, - "Displays information about the current area, such as asset ID, object/layer counts, and active layer bits"sv, - false, hecl::CVar::EFlags::Game | hecl::CVar::EFlags::Archive | hecl::CVar::EFlags::ReadOnly); - m_cvarManager.findOrMakeCVar("debugOverlay.showFrameCounter"sv, "Displays the current frame index"sv, false, - hecl::CVar::EFlags::Game | hecl::CVar::EFlags::Archive | hecl::CVar::EFlags::ReadOnly); - m_cvarManager.findOrMakeCVar("debugOverlay.showInGameTime"sv, "Displays the current in game time"sv, false, - hecl::CVar::EFlags::Game | hecl::CVar::EFlags::Archive | hecl::CVar::EFlags::ReadOnly); - m_cvarManager.findOrMakeCVar("debugOverlay.showResourceStats"sv, - "Displays the current live resource object and token counts"sv, false, - hecl::CVar::EFlags::Game | hecl::CVar::EFlags::Archive | hecl::CVar::EFlags::ReadOnly); - } }; } // namespace urde diff --git a/Runtime/MP1/MP1.cpp b/Runtime/MP1/MP1.cpp index c1d16f202..0166aec70 100644 --- a/Runtime/MP1/MP1.cpp +++ b/Runtime/MP1/MP1.cpp @@ -74,7 +74,6 @@ namespace hecl { extern CVar* com_enableCheats; extern CVar* com_developer; extern CVar* com_cubemaps; -extern CVar* com_variableDt; }; // namespace hecl namespace urde::MP1 { @@ -706,6 +705,7 @@ void CMain::Init(const hecl::Runtime::FileStoreManager& storeMgr, hecl::CVarMana InitializeDiscord(); m_mainWindow = window; m_cvarMgr = cvarMgr; + m_cvarCommons = std::make_unique(*m_cvarMgr); m_console = std::make_unique(m_cvarMgr); m_console->init(window); m_console->registerCommand( @@ -839,7 +839,7 @@ bool CMain::Proc() { } float dt = 1 / 60.f; - if (hecl::com_variableDt->toBoolean()) { + if (m_cvarCommons->m_variableDt->toBoolean()) { auto now = delta_clock::now(); if (m_firstFrame) { m_firstFrame = false; diff --git a/Runtime/MP1/MP1.hpp b/Runtime/MP1/MP1.hpp index 915c28523..b8b643cd2 100644 --- a/Runtime/MP1/MP1.hpp +++ b/Runtime/MP1/MP1.hpp @@ -39,6 +39,7 @@ #include "DataSpec/DNAMP1/Tweaks/CTweakGame.hpp" #include "World/CScriptMazeNode.hpp" #include "hecl/Console.hpp" +#include "hecl/CVarCommons.hpp" struct DiscordUser; @@ -239,6 +240,7 @@ private: boo::IWindow* m_mainWindow = nullptr; hecl::CVarManager* m_cvarMgr = nullptr; + std::unique_ptr m_cvarCommons; std::unique_ptr m_console; // Warmup state std::vector m_warmupTags; diff --git a/hecl b/hecl index 90366475c..bbb78dcb6 160000 --- a/hecl +++ b/hecl @@ -1 +1 @@ -Subproject commit 90366475c1d45b53f080f57dd7e5626145fdd649 +Subproject commit bbb78dcb687a148ca301f0722d4cf13b57cee8d1 From c14721611beb669bf5c6bce08979258b06bcb48a Mon Sep 17 00:00:00 2001 From: Lioncash Date: Tue, 14 Apr 2020 15:46:08 -0400 Subject: [PATCH 170/224] CEnergyProjectile: Make use of const where applicable While we're at it, make use of consistent bracing, given some conditionals traveled over one line. --- Runtime/Weapon/CEnergyProjectile.cpp | 190 ++++++++++++++++----------- 1 file changed, 112 insertions(+), 78 deletions(-) diff --git a/Runtime/Weapon/CEnergyProjectile.cpp b/Runtime/Weapon/CEnergyProjectile.cpp index e829d3c13..23b6e2cee 100644 --- a/Runtime/Weapon/CEnergyProjectile.cpp +++ b/Runtime/Weapon/CEnergyProjectile.cpp @@ -35,60 +35,74 @@ CEnergyProjectile::CEnergyProjectile(bool active, const TToken= 0) { - CAudioSys::C3DEmitterParmData parmData = {}; - parmData.x18_maxDist = x170_projectile.GetAudibleRange(); - parmData.x1c_distComp = x170_projectile.GetAudibleFallOff(); - parmData.x20_flags = 0x1; // Continuous parameter update - parmData.x24_sfxId = CSfxManager::TranslateSFXID(u16(sfxId)); - parmData.x26_maxVol = 1.f; - parmData.x27_minVol = 0.16f; - parmData.x29_prio = 0x7f; - CSfxHandle hnd = CSfxManager::AddEmitter(parmData, true, 0x7f, false, kInvalidAreaId); - if (x2e4_26_waterUpdate) - CSfxManager::PitchBend(hnd, -1.f); + const s32 sfxId = x170_projectile.GetSoundIdForCollision(type); + if (sfxId < 0) { + return; } + + CAudioSys::C3DEmitterParmData parmData = {}; + parmData.x18_maxDist = x170_projectile.GetAudibleRange(); + parmData.x1c_distComp = x170_projectile.GetAudibleFallOff(); + parmData.x20_flags = 0x1; // Continuous parameter update + parmData.x24_sfxId = CSfxManager::TranslateSFXID(u16(sfxId)); + parmData.x26_maxVol = 1.f; + parmData.x27_minVol = 0.16f; + parmData.x29_prio = 0x7f; + + const CSfxHandle hnd = CSfxManager::AddEmitter(parmData, true, 0x7f, false, kInvalidAreaId); + if (!x2e4_26_waterUpdate) { + return; + } + + CSfxManager::PitchBend(hnd, -1.f); } void CEnergyProjectile::ChangeProjectileOwner(TUniqueId owner, CStateManager& mgr) { - if (TCastToConstPtr act = mgr.GetObjectById(owner)) { - float rDam = g_tweakPlayerGun->GetRichochetDamage(u32(x110_origDamageInfo.GetWeaponMode().GetType())); - x110_origDamageInfo.MultiplyDamageAndRadius(rDam); - mgr.RemoveWeaponId(xec_ownerId, xf0_weaponType); - xec_ownerId = owner; - mgr.AddWeaponId(xec_ownerId, xf0_weaponType); - - /* Can now damage Player */ - xf8_filter.ExcludeList().Add(EMaterialTypes::Character); - xf8_filter.ExcludeList().Remove(EMaterialTypes::Player); - xf8_filter = CMaterialFilter::MakeIncludeExclude(xf8_filter.GetIncludeList(), xf8_filter.GetExcludeList()); + const TCastToConstPtr act = mgr.GetObjectById(owner); + if (!act) { + return; } + + const float rDam = g_tweakPlayerGun->GetRichochetDamage(u32(x110_origDamageInfo.GetWeaponMode().GetType())); + x110_origDamageInfo.MultiplyDamageAndRadius(rDam); + mgr.RemoveWeaponId(xec_ownerId, xf0_weaponType); + xec_ownerId = owner; + mgr.AddWeaponId(xec_ownerId, xf0_weaponType); + + /* Can now damage Player */ + xf8_filter.ExcludeList().Add(EMaterialTypes::Character); + xf8_filter.ExcludeList().Remove(EMaterialTypes::Player); + xf8_filter = CMaterialFilter::MakeIncludeExclude(xf8_filter.GetIncludeList(), xf8_filter.GetExcludeList()); } void CEnergyProjectile::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CStateManager& mgr) { switch (msg) { case EScriptObjectMessage::Deleted: - if (x2e4_24_active) + if (x2e4_24_active) { mgr.RemoveWeaponId(xec_ownerId, xf0_weaponType); + } if (x2e8_sfx) { CSfxManager::RemoveEmitter(x2e8_sfx); x2e8_sfx.reset(); } break; case EScriptObjectMessage::Registered: { - if (CElementGen* ps1 = x170_projectile.GetAttachedPS1()) - if (ps1->SystemHasLight()) + if (CElementGen* ps1 = x170_projectile.GetAttachedPS1()) { + if (ps1->SystemHasLight()) { CreateProjectileLight("ProjectileLight_GameProjectile", ps1->GetLight(), mgr); - TLockedToken desc = x170_projectile.GetWeaponDescription(); - s32 sfx = desc->xa8_PJFX; + } + } + const TLockedToken desc = x170_projectile.GetWeaponDescription(); + const s32 sfx = desc->xa8_PJFX; if (sfx != -1) { float range = 50.f; float falloff = 0.2f; - if (CRealElement* rnge = desc->xac_RNGE.get()) + if (CRealElement* rnge = desc->xac_RNGE.get()) { rnge->GetValue(0, range); - if (CRealElement* foff = desc->xb0_FOFF.get()) + } + if (CRealElement* foff = desc->xb0_FOFF.get()) { foff->GetValue(0, falloff); + } CAudioSys::C3DEmitterParmData parmData = {}; parmData.x0_pos = x170_projectile.GetTranslation(); @@ -117,22 +131,27 @@ void CEnergyProjectile::Accept(IVisitor& visitor) { visitor.Visit(this); } static constexpr u64 kCheckMaterial = 0xE3FFFE; void CEnergyProjectile::ResolveCollisionWithWorld(const CRayCastResult& res, CStateManager& mgr) { - EWeaponCollisionResponseTypes crType = CCollisionResponseData::GetWorldCollisionResponseType( + const auto crType = CCollisionResponseData::GetWorldCollisionResponseType( CMaterialList::BitPosition((res.GetMaterial().GetValue() & 0xffffffff) & kCheckMaterial)); - if ((xe8_projectileAttribs & (EProjectileAttrib::Wave | EProjectileAttrib::ComboShot)) != + + if ((xe8_projectileAttribs & (EProjectileAttrib::Wave | EProjectileAttrib::ComboShot)) == (EProjectileAttrib::Wave | EProjectileAttrib::ComboShot)) { - /* Not wavebuster */ - if (Explode(res.GetPoint(), res.GetPlane().normal(), crType, mgr, CDamageVulnerability::NormalVulnerabilty(), - kInvalidUniqueId)) - mgr.ApplyDamageToWorld(xec_ownerId, *this, res.GetPoint(), x12c_curDamageInfo, xf8_filter); - x2c2_lastResolvedObj = kInvalidUniqueId; + return; } + + // Not wavebuster + if (Explode(res.GetPoint(), res.GetPlane().normal(), crType, mgr, CDamageVulnerability::NormalVulnerabilty(), + kInvalidUniqueId)) { + mgr.ApplyDamageToWorld(xec_ownerId, *this, res.GetPoint(), x12c_curDamageInfo, xf8_filter); + } + + x2c2_lastResolvedObj = kInvalidUniqueId; } void CEnergyProjectile::ResolveCollisionWithActor(const CRayCastResult& res, CActor& act, CStateManager& mgr) { x2c2_lastResolvedObj = act.GetUniqueId(); - EWeaponCollisionResponseTypes crType = act.GetCollisionResponseType( - res.GetPoint(), x34_transform.basis[1].normalized(), x12c_curDamageInfo.GetWeaponMode(), xe8_projectileAttribs); + const auto crType = act.GetCollisionResponseType(res.GetPoint(), x34_transform.basis[1].normalized(), + x12c_curDamageInfo.GetWeaponMode(), xe8_projectileAttribs); act.Touch(*this, mgr); const CDamageVulnerability* dVuln = act.GetDamageVulnerability(); if (!Explode(res.GetPoint(), res.GetPlane().normal(), crType, mgr, *dVuln, act.GetUniqueId())) { @@ -142,7 +161,7 @@ void CEnergyProjectile::ResolveCollisionWithActor(const CRayCastResult& res, CAc CGameProjectile::ResolveCollisionWithActor(res, act, mgr); ApplyDamageToActors(mgr, x12c_curDamageInfo); } - if (TCastToPtr proj = act) { + if (const TCastToPtr proj = act) { proj->Explode(GetTranslation(), x34_transform.basis[1], EWeaponCollisionResponseTypes::OtherProjectile, mgr, *GetDamageVulnerability(), GetUniqueId()); } @@ -151,31 +170,36 @@ void CEnergyProjectile::ResolveCollisionWithActor(const CRayCastResult& res, CAc void CEnergyProjectile::Think(float dt, CStateManager& mgr) { CWeapon::Think(dt, mgr); if (mgr.GetWorld()->GetCurrentAreaId() != GetAreaIdAlways() && - (xe8_projectileAttribs & EProjectileAttrib::ArmCannon) == EProjectileAttrib::ArmCannon) + (xe8_projectileAttribs & EProjectileAttrib::ArmCannon) == EProjectileAttrib::ArmCannon) { mgr.SetActorAreaId(*this, mgr.GetWorld()->GetCurrentAreaId()); + } UpdateProjectileMovement(dt, mgr); TUniqueId id = kInvalidUniqueId; - CRayCastResult res = DoCollisionCheck(id, mgr); + const CRayCastResult res = DoCollisionCheck(id, mgr); if (res.IsValid()) { - if (TCastToPtr act = mgr.ObjectById(id)) + if (const TCastToPtr act = mgr.ObjectById(id)) { ResolveCollisionWithActor(res, *act, mgr); - else + } else { ResolveCollisionWithWorld(res, mgr); + } } x170_projectile.UpdateParticleFX(); - if (x2e4_24_active && x3d0_26_) + if (x2e4_24_active && x3d0_26_) { Explode(GetTranslation(), zeus::skUp, EWeaponCollisionResponseTypes::Default, mgr, CDamageVulnerability::NormalVulnerabilty(), kInvalidUniqueId); + } if (x2c8_projectileLight != kInvalidUniqueId) { - if (TCastToPtr light = mgr.ObjectById(x2c8_projectileLight)) { + if (const TCastToPtr light = mgr.ObjectById(x2c8_projectileLight)) { light->SetTransform(GetTransform()); light->SetTranslation(GetTranslation()); - if (CElementGen* ps1 = x170_projectile.GetAttachedPS1()) - if (ps1->SystemHasLight()) + if (CElementGen* ps1 = x170_projectile.GetAttachedPS1()) { + if (ps1->SystemHasLight()) { light->SetLight(ps1->GetLight()); + } + } } } @@ -185,20 +209,22 @@ void CEnergyProjectile::Think(float dt, CStateManager& mgr) { } x3d4_curTime += dt; - if (x3d4_curTime > 45.f || x170_projectile.IsSystemDeletable() || x3d0_24_dead) + if (x3d4_curTime > 45.f || x170_projectile.IsSystemDeletable() || x3d0_24_dead) { mgr.FreeScriptObject(GetUniqueId()); + } } void CEnergyProjectile::Render(CStateManager& mgr) { SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CEnergyProjectile::Render WPSC_{}"), x2cc_wpscId).c_str(), zeus::skOrange); - CPlayerState::EPlayerVisor visor = mgr.GetPlayerState()->GetActiveVisor(mgr); + const auto visor = mgr.GetPlayerState()->GetActiveVisor(mgr); if (visor == CPlayerState::EPlayerVisor::Combat) { if ((xe8_projectileAttribs & EProjectileAttrib::Charged) == EProjectileAttrib::Charged || (xe8_projectileAttribs & EProjectileAttrib::ComboShot) == EProjectileAttrib::ComboShot) { - float warpTime = 1.f - float(x170_projectile.GameTime()); - if (warpTime > 0.f) + const float warpTime = 1.f - float(x170_projectile.GameTime()); + if (warpTime > 0.f) { mgr.DrawSpaceWarp(GetTranslation(), warpTime * 0.75f); + } } } @@ -222,11 +248,12 @@ void CEnergyProjectile::Render(CStateManager& mgr) { } void CEnergyProjectile::AddToRenderer(const zeus::CFrustum& frustum, CStateManager& mgr) { - auto bounds = x170_projectile.GetBounds(); - if (bounds && !frustum.aabbFrustumTest(*bounds)) + const auto bounds = x170_projectile.GetBounds(); + if (bounds && !frustum.aabbFrustumTest(*bounds)) { return; + } - CPlayerState::EPlayerVisor visor = mgr.GetPlayerState()->GetActiveVisor(mgr); + const auto visor = mgr.GetPlayerState()->GetActiveVisor(mgr); if (visor != CPlayerState::EPlayerVisor::XRay && ((xe8_projectileAttribs & EProjectileAttrib::Ice) != EProjectileAttrib::Ice || mgr.GetThermalDrawFlag() != EThermalDrawFlag::Hot)) { @@ -247,7 +274,8 @@ bool CEnergyProjectile::Explode(const zeus::CVector3f& pos, const zeus::CVector3 bool retargetPlayer = false; bool deflect = false; zeus::CVector3f targetPos; - EVulnerability vulnType = dVuln.GetVulnerability(x12c_curDamageInfo.GetWeaponMode(), false); + const EVulnerability vulnType = dVuln.GetVulnerability(x12c_curDamageInfo.GetWeaponMode(), false); + if (vulnType == EVulnerability::Deflect) { deflect = true; EDeflectType deflectType = dVuln.GetDeflectionType(x12c_curDamageInfo.GetWeaponMode()); @@ -259,17 +287,19 @@ bool CEnergyProjectile::Explode(const zeus::CVector3f& pos, const zeus::CVector3 case EDeflectType::Three: if (deflectType != EDeflectType::Two || (xf0_weaponType != EWeaponType::Missile && - (xe8_projectileAttribs & EProjectileAttrib::ComboShot) != EProjectileAttrib::ComboShot)) - if (xf8_filter.GetExcludeList().HasMaterial(EMaterialTypes::Player)) + (xe8_projectileAttribs & EProjectileAttrib::ComboShot) != EProjectileAttrib::ComboShot)) { + if (xf8_filter.GetExcludeList().HasMaterial(EMaterialTypes::Player)) { retargetPlayer = true; + } + } break; default: break; } if (retargetPlayer) { - float ang = mgr.GetActiveRandom()->Range(0.f, 2.f * M_PIF); - float y = std::sin(ang); - float x = std::cos(ang); + const float ang = mgr.GetActiveRandom()->Range(0.f, 2.f * M_PIF); + const float y = std::sin(ang); + const float x = std::cos(ang); targetPos = mgr.GetPlayer().GetAimPosition(mgr, 0.f) + zeus::CVector3f(x, 0.f, y); ChangeProjectileOwner(hitActor, mgr); } @@ -278,7 +308,8 @@ bool CEnergyProjectile::Explode(const zeus::CVector3f& pos, const zeus::CVector3 if (vulnType != EVulnerability::Immune && !deflect) { deflect = (type == EWeaponCollisionResponseTypes::Unknown15 || type == EWeaponCollisionResponseTypes::EnemyShielded || - (type >= EWeaponCollisionResponseTypes::Unknown69 && type <= EWeaponCollisionResponseTypes::AtomicAlphaReflect)); + (type >= EWeaponCollisionResponseTypes::Unknown69 && + type <= EWeaponCollisionResponseTypes::AtomicAlphaReflect)); } SetTranslation(offsetPos); @@ -309,29 +340,30 @@ bool CEnergyProjectile::Explode(const zeus::CVector3f& pos, const zeus::CVector3 zeus::CVector3f scale = zeus::skOne3f; bool camClose = false; if (mgr.GetPlayer().GetCameraState() == CPlayer::EPlayerCameraState::FirstPerson) { - float mag = (offsetPos - mgr.GetCameraManager()->GetCurrentCamera(mgr)->GetTranslation()).magnitude(); + const float mag = (offsetPos - mgr.GetCameraManager()->GetCurrentCamera(mgr)->GetTranslation()).magnitude(); if (mag < 4.f) { scale = zeus::CVector3f(0.75f * (mag * 0.25f) + 0.25f); camClose = true; } } u32 explodeFlags = 0x8; - if ((xe8_projectileAttribs & EProjectileAttrib::Ice) == EProjectileAttrib::Ice) + if ((xe8_projectileAttribs & EProjectileAttrib::Ice) == EProjectileAttrib::Ice) { explodeFlags |= 0x4; - if (camClose) + } + if (camClose) { explodeFlags |= 0x2; - CEntityInfo explosionInfo(GetAreaIdAlways(), CEntity::NullConnectionList); - CExplosion* explosion = - new CExplosion(*particle, mgr.AllocateUniqueId(), true, explosionInfo, "Projectile collision response", - particleXf, explodeFlags, scale, zeus::skWhite); + } + const CEntityInfo explosionInfo(GetAreaIdAlways(), CEntity::NullConnectionList); + auto* explosion = new CExplosion(*particle, mgr.AllocateUniqueId(), true, explosionInfo, + "Projectile collision response", particleXf, explodeFlags, scale, zeus::skWhite); mgr.AddObject(explosion); - if (TCastToPtr hActor = mgr.ObjectById(hitActor)) { + if (const TCastToPtr hActor = mgr.ObjectById(hitActor)) { bool validPlat = false; CScriptPlatform* plat = TCastToPtr(hActor.GetPtr()).GetPtr(); validPlat = plat != nullptr; if (!validPlat && hActor->GetMaterialList().HasMaterial(EMaterialTypes::Bomb)) { for (CEntity* ent : mgr.GetPlatformAndDoorObjectList()) { - if (TCastToPtr otherPlat = ent) { + if (const TCastToPtr otherPlat = ent) { if (otherPlat->IsSlave(hitActor)) { plat = otherPlat.GetPtr(); validPlat = true; @@ -340,8 +372,9 @@ bool CEnergyProjectile::Explode(const zeus::CVector3f& pos, const zeus::CVector3 } } } - if (validPlat) + if (validPlat) { plat->AddSlave(explosion->GetUniqueId(), mgr); + } } } else { x3d0_24_dead = true; @@ -349,13 +382,14 @@ bool CEnergyProjectile::Explode(const zeus::CVector3f& pos, const zeus::CVector3 if ((xe8_projectileAttribs & (EProjectileAttrib::ComboShot | EProjectileAttrib::Ice)) == (EProjectileAttrib::ComboShot | EProjectileAttrib::Ice)) { - /* Ice Spreader */ - TLockedToken iceSpreadParticle = g_SimplePool->GetObj("IceSpread1"); + // Ice Spreader + const TLockedToken iceSpreadParticle = g_SimplePool->GetObj("IceSpread1"); + u32 flags = (xe6_27_thermalVisorFlags & 0x2) == 0 ? 1 : 0; flags |= 0x2; - CIceImpact* iceImpact = - new CIceImpact(iceSpreadParticle, mgr.AllocateUniqueId(), GetAreaIdAlways(), true, "Ice spread explosion", - particleXf, flags, zeus::skOne3f, zeus::skWhite); + + auto* iceImpact = new CIceImpact(iceSpreadParticle, mgr.AllocateUniqueId(), GetAreaIdAlways(), true, + "Ice spread explosion", particleXf, flags, zeus::skOne3f, zeus::skWhite); mgr.AddObject(iceImpact); } } From 384efebf553f590b5e82525e0a75620373ba8a49 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Tue, 14 Apr 2020 16:08:17 -0400 Subject: [PATCH 171/224] CElementGen: Collapse loop into a ranged-for loop Same behavior, nicer syntax. --- Runtime/Particle/CElementGen.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Runtime/Particle/CElementGen.cpp b/Runtime/Particle/CElementGen.cpp index 8aece4666..88a3b754c 100644 --- a/Runtime/Particle/CElementGen.cpp +++ b/Runtime/Particle/CElementGen.cpp @@ -1136,8 +1136,7 @@ void CElementGen::RenderLines() { m_lineRenderer->Reset(); - for (size_t i = 0; i < x30_particles.size(); ++i) { - CParticle& particle = x30_particles[i]; + for (auto& particle : x30_particles) { g_currentParticle = &particle; int partFrame = x74_curFrame - particle.x28_startFrame; From 8e89ac234f3be1873ab5d7dcd7447919c589cb52 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Tue, 14 Apr 2020 16:11:30 -0400 Subject: [PATCH 172/224] CElementGen: Initialize x80_timeDeltaScale on construction Provides deterministic state upon construction, which is nicer for debugging. --- Runtime/Particle/CElementGen.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Particle/CElementGen.hpp b/Runtime/Particle/CElementGen.hpp index 6e585539a..4441e45db 100644 --- a/Runtime/Particle/CElementGen.hpp +++ b/Runtime/Particle/CElementGen.hpp @@ -60,7 +60,7 @@ private: int x70_internalStartFrame = 0; int x74_curFrame = 0; double x78_curSeconds = 0.f; - float x80_timeDeltaScale; + float x80_timeDeltaScale = 0.f; int x84_prevFrame = -1; bool x88_particleEmission = true; float x8c_generatorRemainder = 0.f; From c7771be75104ee4f69064aeef44f3bf80f161933 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Tue, 14 Apr 2020 16:14:02 -0400 Subject: [PATCH 173/224] Add screenshot to README.md --- README.md | 2 ++ assets/urde-screen1.png | Bin 0 -> 2051204 bytes 2 files changed, 2 insertions(+) create mode 100644 assets/urde-screen1.png diff --git a/README.md b/README.md index c6fba0d55..62b6934ab 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ **Official Discord Channel:** https://discord.gg/AMBVFuf +![URDE screenshot](assets/urde-screen1.png) + ### Download Precompiled builds of the command-line extraction utility (`hecl`) with embedded dataspec libraries are available at https://releases.axiodl.com. This will give you intermediate dumps of original formats as *blender* and *yaml* representations. diff --git a/assets/urde-screen1.png b/assets/urde-screen1.png new file mode 100644 index 0000000000000000000000000000000000000000..92de9dcea4835c99695fbb3c9c8ac1180c17c9b2 GIT binary patch literal 2051204 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

00396Tm}*0 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 yB6pQgl_EAQPVgw3Z2e3ryJb&^GU00#) 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%0A+xp_X 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гtf=!Jb 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 D`z$r*8k-zh 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�hDx0QYTo#cv#x0+J;It*I>; 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�nSKK6p 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 )6Mv$r>jBf>d5h)B2o)maJW&(;s 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%0D&3k}q@uEBM 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%0As{B*`I{0 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
q=c87T|233u^9>7g!01;-BU_WqGh+I+E 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 (KrG)u$2ks_VZkuvf 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
DI^5aD~mv%?dZ=L4m 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 literal 0 HcmV?d00001 From 655805ffcbd0d0bfeea178c64984e75204a77e30 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Tue, 14 Apr 2020 16:16:57 -0400 Subject: [PATCH 174/224] CWorld: Add missing override specifier --- Runtime/World/CWorld.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/World/CWorld.hpp b/Runtime/World/CWorld.hpp index 87c6f31b8..57edfb455 100644 --- a/Runtime/World/CWorld.hpp +++ b/Runtime/World/CWorld.hpp @@ -171,7 +171,7 @@ public: void CycleLoadPauseState(); CWorld(IObjectStore& objStore, IFactory& resFactory, CAssetId mlvlId); - ~CWorld(); + ~CWorld() override; bool DoesAreaExist(TAreaId area) const; const std::vector>& GetGameAreas() const { return x18_areas; } From 86b94ad9159d0f4f0b2fe2ce8f643752024ecfaf Mon Sep 17 00:00:00 2001 From: Lioncash Date: Tue, 14 Apr 2020 16:31:14 -0400 Subject: [PATCH 175/224] CWorld: Make use of std::find_if in IGetAreaId Removes explicit mutable state. This can be further simplified in the future with ranges. --- Runtime/World/CWorld.cpp | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/Runtime/World/CWorld.cpp b/Runtime/World/CWorld.cpp index 7d38acbf7..03ca4b8ef 100644 --- a/Runtime/World/CWorld.cpp +++ b/Runtime/World/CWorld.cpp @@ -1,5 +1,8 @@ #include "Runtime/World/CWorld.hpp" +#include +#include + #include "Runtime/CGameState.hpp" #include "Runtime/CInGameTweakManagerBase.hpp" #include "Runtime/CSimplePool.hpp" @@ -44,15 +47,17 @@ const IGameArea* CDummyWorld::IGetAreaAlways(TAreaId id) const { return &x18_are TAreaId CDummyWorld::IGetCurrentAreaId() const { return x3c_curAreaId; } TAreaId CDummyWorld::IGetAreaId(CAssetId id) const { - int ret = 0; - if (!id.IsValid()) + if (!id.IsValid()) { return kInvalidAreaId; - for (const CDummyGameArea& area : x18_areas) { - if (area.xc_mrea == id) - return ret; - ++ret; } - return kInvalidAreaId; + + const auto iter = + std::find_if(x18_areas.cbegin(), x18_areas.cend(), [id](const auto& area) { return area->xc_mrea == id; }); + if (iter == x18_areas.cend()) { + return kInvalidAreaId; + } + + return TAreaId(std::distance(x18_areas.cbegin(), iter)); } CWorld::CRelay::CRelay(CInputStream& in) { @@ -226,15 +231,17 @@ const IGameArea* CWorld::IGetAreaAlways(TAreaId id) const { return GetAreaAlways TAreaId CWorld::IGetCurrentAreaId() const { return x68_curAreaId; } TAreaId CWorld::IGetAreaId(CAssetId id) const { - int ret = 0; - if (!id.IsValid()) + if (!id.IsValid()) { return kInvalidAreaId; - for (const std::unique_ptr& area : x18_areas) { - if (area->x84_mrea == id) - return ret; - ++ret; } - return kInvalidAreaId; + + const auto iter = + std::find_if(x18_areas.cbegin(), x18_areas.cend(), [id](const auto& area) { return area->x84_mrea == id; }); + if (iter == x18_areas.cend()) { + return kInvalidAreaId; + } + + return TAreaId(std::distance(x18_areas.cbegin(), iter)); } void CWorld::MoveToChain(CGameArea* area, EChain chain) { From 6436184a3f47af7c674b53f6d9990c2ef3236230 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Tue, 14 Apr 2020 16:40:11 -0400 Subject: [PATCH 176/224] CWorld: Make use of find_if in GetAreaIdForSaveId() Same behavior minus any explicit mutable state. --- Runtime/World/CWorld.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/Runtime/World/CWorld.cpp b/Runtime/World/CWorld.cpp index 03ca4b8ef..79a6bb5b2 100644 --- a/Runtime/World/CWorld.cpp +++ b/Runtime/World/CWorld.cpp @@ -712,19 +712,20 @@ bool CWorld::AreSkyNeedsMet() const { } TAreaId CWorld::GetAreaIdForSaveId(s32 saveId) const { - if (saveId == -1) + if (saveId == -1) { return kInvalidAreaId; - - if (x18_areas.size() <= 0) - return kInvalidAreaId; - - TAreaId cur = 0; - for (const auto& area : x18_areas) { - if (area->x88_areaId == saveId) - return cur; - ++cur; } - return kInvalidAreaId; + if (x18_areas.empty()) { + return kInvalidAreaId; + } + + const auto iter = std::find_if(x18_areas.cbegin(), x18_areas.cend(), + [saveId](const auto& area) { return area->x88_areaId == saveId; }); + if (iter == x18_areas.cend()) { + return kInvalidAreaId; + } + + return TAreaId(std::distance(x18_areas.cbegin(), iter)); } } // namespace urde From f4ab5e45a147419b3771369da382f7c23ec93829 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Tue, 14 Apr 2020 21:00:04 -0400 Subject: [PATCH 177/224] Update hecl/extern/athena --- hecl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hecl b/hecl index bbb78dcb6..9191b2046 160000 --- a/hecl +++ b/hecl @@ -1 +1 @@ -Subproject commit bbb78dcb687a148ca301f0722d4cf13b57cee8d1 +Subproject commit 9191b20466acc74a64b5acbb35f71078b593823d From eb89a178173d9337fb7e849c29fc645ae419bcc5 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Tue, 14 Apr 2020 21:15:38 -0400 Subject: [PATCH 178/224] CDummyWorld: Fix IGetAreaId --- Runtime/World/CWorld.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/World/CWorld.cpp b/Runtime/World/CWorld.cpp index 79a6bb5b2..5527c7fdb 100644 --- a/Runtime/World/CWorld.cpp +++ b/Runtime/World/CWorld.cpp @@ -52,7 +52,7 @@ TAreaId CDummyWorld::IGetAreaId(CAssetId id) const { } const auto iter = - std::find_if(x18_areas.cbegin(), x18_areas.cend(), [id](const auto& area) { return area->xc_mrea == id; }); + std::find_if(x18_areas.cbegin(), x18_areas.cend(), [id](const auto& area) { return area.xc_mrea == id; }); if (iter == x18_areas.cend()) { return kInvalidAreaId; } From b020904e845022984d9f0c226949e16da96b0ded Mon Sep 17 00:00:00 2001 From: Luke Street Date: Tue, 14 Apr 2020 22:14:15 -0400 Subject: [PATCH 179/224] Comment out printfs entirely --- Runtime/World/CStateMachine.cpp | 8 ++++---- Runtime/World/CVisorFlare.cpp | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Runtime/World/CStateMachine.cpp b/Runtime/World/CStateMachine.cpp index a0274536d..16b0d5652 100644 --- a/Runtime/World/CStateMachine.cpp +++ b/Runtime/World/CStateMachine.cpp @@ -78,10 +78,10 @@ void CStateMachineState::Update(CStateManager& mgr, CAi& ai, float delta) { if (andPassed && state) { x4_state->CallFunc(mgr, ai, EStateMsg::Deactivate, 0.f); x4_state = state; -#ifndef NDEBUG - fmt::print(FMT_STRING("{} {} {} - {} {}\n"), ai.GetUniqueId(), ai.GetEditorId(), ai.GetName(), - state->xc_name, int(state - x0_machine->GetStateVector().data())); -#endif +//#ifndef NDEBUG +// fmt::print(FMT_STRING("{} {} {} - {} {}\n"), ai.GetUniqueId(), ai.GetEditorId(), ai.GetName(), +// state->xc_name, int(state - x0_machine->GetStateVector().data())); +//#endif x8_time = 0.f; x18_24_codeTrigger = false; xc_random = mgr.GetActiveRandom()->Float(); diff --git a/Runtime/World/CVisorFlare.cpp b/Runtime/World/CVisorFlare.cpp index 6e1bfbf85..0e46e3e8f 100644 --- a/Runtime/World/CVisorFlare.cpp +++ b/Runtime/World/CVisorFlare.cpp @@ -69,9 +69,9 @@ void CVisorFlare::Update(float dt, const zeus::CVector3f& pos, const CActor* act mgr.SetThermalColdScale2(mgr.GetThermalColdScale2() + x24_); } -#ifndef NDEBUG - printf("%08X %f %f\n", act->GetEditorId().id, x24_, x28_); -#endif +//#ifndef NDEBUG +// printf("%08X %f %f\n", act->GetEditorId().id, x24_, x28_); +//#endif } } From 790b155b7f1b0bd24330df5f49544daeca079b0f Mon Sep 17 00:00:00 2001 From: Luke Street Date: Tue, 14 Apr 2020 22:14:24 -0400 Subject: [PATCH 180/224] Update hecl --- hecl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hecl b/hecl index 9191b2046..d208592b2 160000 --- a/hecl +++ b/hecl @@ -1 +1 @@ -Subproject commit 9191b20466acc74a64b5acbb35f71078b593823d +Subproject commit d208592b2825188940064e462038e2ce90164101 From 1eade15395b2dec49d0f83f53dd5ba34c06a3bfe Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Wed, 15 Apr 2020 00:56:59 -0700 Subject: [PATCH 181/224] Add version info to extracted data, clean up MP1.* --- DataSpec/SpecBase.cpp | 23 +++++++++++--- DataSpec/SpecBase.hpp | 10 ++++++ DataSpec/SpecMP1.cpp | 26 +++++++++++----- DataSpec/SpecMP2.cpp | 12 ++++++-- DataSpec/SpecMP3.cpp | 22 ++++++++----- Runtime/MP1/MP1.cpp | 9 ++++++ Runtime/MP1/MP1.hpp | 72 +++++++++++++++++++------------------------ 7 files changed, 112 insertions(+), 62 deletions(-) diff --git a/DataSpec/SpecBase.cpp b/DataSpec/SpecBase.cpp index 6d6f5ecaa..846c29e5a 100644 --- a/DataSpec/SpecBase.cpp +++ b/DataSpec/SpecBase.cpp @@ -75,18 +75,20 @@ bool SpecBase::canExtract(const ExtractPassInfo& info, std::vectorgetHeader().m_gameID[3]; + m_region = ERegion(m_disc->getHeader().m_gameID[3]); const hecl::SystemString* regstr = ®NONE; - switch (region) { - case 'E': + switch (m_region) { + case ERegion::NTSC_U: regstr = ®E; break; - case 'J': + case ERegion::PAL: regstr = ®J; break; - case 'P': + case ERegion::NTSC_J: regstr = ®P; break; + default: + break; } if (m_standalone) @@ -1206,4 +1208,15 @@ void SpecBase::waitForIndexComplete() const { } } +void SpecBase::WriteVersionInfo(hecl::Database::Project &project, const hecl::ProjectPath &pakPath) { + hecl::ProjectPath versionPath(pakPath, _SYS_STR("version.yaml")); + versionPath.makeDirChain(false); + + athena::io::YAMLDocWriter yamlW("URDEVersionData"); + yamlW.writeString("version", m_version); + yamlW.writeByte("region", atUint8(m_region)); + yamlW.writeBool("is_trilogy", !m_standalone); + athena::io::FileWriter fileW(versionPath.getAbsolutePath()); + yamlW.finish(&fileW); +} } // namespace DataSpec diff --git a/DataSpec/SpecBase.hpp b/DataSpec/SpecBase.hpp index 211c5702d..2bab11ee5 100644 --- a/DataSpec/SpecBase.hpp +++ b/DataSpec/SpecBase.hpp @@ -23,6 +23,12 @@ class YAMLDocWriter; } // namespace athena::io namespace DataSpec { +enum class ERegion { + Invalid = 0, + NTSC_U = 'E', + PAL = 'P', + NTSC_J = 'J' +}; struct SpecBase : hecl::Database::IDataSpec { /* HECL Adaptors */ @@ -199,6 +205,10 @@ protected: std::unique_ptr m_disc; bool m_isWii; bool m_standalone; + ERegion m_region = ERegion::Invalid; + std::string m_version; + + void WriteVersionInfo(hecl::Database::Project& project, const hecl::ProjectPath& pakPath); }; bool IsPathAudioGroup(const hecl::ProjectPath& path); diff --git a/DataSpec/SpecMP1.cpp b/DataSpec/SpecMP1.cpp index 02ad59323..0ea5cc7ff 100644 --- a/DataSpec/SpecMP1.cpp +++ b/DataSpec/SpecMP1.cpp @@ -63,7 +63,8 @@ extern hecl::Database::DataSpecEntry SpecEntMP1PC; extern hecl::Database::DataSpecEntry SpecEntMP1ORIG; struct TextureCache { - static void Generate(PAKRouter& pakRouter, hecl::Database::Project& project, const hecl::ProjectPath& pakPath) { + static void Generate(PAKRouter& pakRouter, hecl::Database::Project& project, + const hecl::ProjectPath& pakPath) { hecl::ProjectPath texturePath(pakPath, _SYS_STR("texture_cache.yaml")); hecl::ProjectPath catalogPath(pakPath, _SYS_STR("!catalog.yaml")); texturePath.makeDirChain(false); @@ -112,9 +113,8 @@ struct TextureCache { metaPairs.emplace_back(projectPath.parsedHash32(), meta); } - std::sort(metaPairs.begin(), metaPairs.end(), [](const auto& a, const auto& b) -> bool { - return a.first < b.first; - }); + std::sort(metaPairs.begin(), metaPairs.end(), + [](const auto& a, const auto& b) -> bool { return a.first < b.first; }); athena::io::FileWriter w(outPath.getAbsolutePath()); w.writeUint32Big(metaPairs.size()); @@ -223,13 +223,13 @@ struct SpecMP1 : SpecBase { if (!buildInfo) return false; + m_version = std::string(buildInfo); /* Root Report */ ExtractReport& rep = reps.emplace_back(); rep.name = _SYS_STR("MP1"); rep.desc = _SYS_STR("Metroid Prime ") + regstr; if (buildInfo) { - std::string buildStr(buildInfo); - hecl::SystemStringConv buildView(buildStr); + hecl::SystemStringConv buildView(m_version); rep.desc += _SYS_STR(" (") + buildView + _SYS_STR(")"); } @@ -378,6 +378,14 @@ struct SpecMP1 : SpecBase { /* Generate Texture Cache containing meta data for every texture file */ TextureCache::Generate(m_pakRouter, m_project, noAramPath); + /* Write version data */ + hecl::ProjectPath versionPath; + if (m_standalone) { + versionPath = hecl::ProjectPath(m_project.getProjectWorkingPath(), _SYS_STR("out/files")); + } else { + versionPath = hecl::ProjectPath(m_project.getProjectWorkingPath(), _SYS_STR("out/files/MP1")); + } + WriteVersionInfo(m_project, versionPath); return true; } @@ -740,7 +748,8 @@ struct SpecMP1 : SpecBase { } if (!colMesh) - Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("unable to find mesh named 'CMESH' in {}")), in.getAbsolutePath()); + Log.report(logvisor::Fatal, FMT_STRING(_SYS_STR("unable to find mesh named 'CMESH' in {}")), + in.getAbsolutePath()); std::vector lights = ds.compileLights(); @@ -1131,7 +1140,8 @@ struct SpecMP1 : SpecBase { } void buildPakList(hecl::blender::Token& btok, athena::io::FileWriter& w, const std::vector& list, - const std::vector>& nameList, atUint64& resTableOffset) override { + const std::vector>& nameList, + atUint64& resTableOffset) override { w.writeUint32Big(m_pc ? 0x80030005 : 0x00030005); w.writeUint32Big(0); diff --git a/DataSpec/SpecMP2.cpp b/DataSpec/SpecMP2.cpp index b7789685c..b896ce7c5 100644 --- a/DataSpec/SpecMP2.cpp +++ b/DataSpec/SpecMP2.cpp @@ -187,12 +187,12 @@ struct SpecMP2 : SpecBase { if (!buildInfo) return false; + m_version = std::string(buildInfo); /* Root Report */ ExtractReport& rep = reps.emplace_back(); rep.name = _SYS_STR("MP2"); rep.desc = _SYS_STR("Metroid Prime 2 ") + regstr; - std::string buildStr(buildInfo); - hecl::SystemStringConv buildView(buildStr); + hecl::SystemStringConv buildView(m_version); rep.desc += _SYS_STR(" (") + buildView + _SYS_STR(")"); /* Iterate PAKs and build level options */ @@ -317,6 +317,14 @@ struct SpecMP2 : SpecBase { hecl::ProjectPath noAramPath(m_project.getProjectWorkingPath(), _SYS_STR("MP2/URDE")); TextureCache::Generate(m_pakRouter, m_project, noAramPath); + /* Write version data */ + hecl::ProjectPath versionPath; + if (m_standalone) { + versionPath = hecl::ProjectPath(m_project.getProjectWorkingPath(), _SYS_STR("out/files")); + } else { + versionPath = hecl::ProjectPath(m_project.getProjectWorkingPath(), _SYS_STR("out/files/MP2")); + } + WriteVersionInfo(m_project, versionPath); return true; } diff --git a/DataSpec/SpecMP3.cpp b/DataSpec/SpecMP3.cpp index c378bb8c0..4d5c87edf 100644 --- a/DataSpec/SpecMP3.cpp +++ b/DataSpec/SpecMP3.cpp @@ -231,12 +231,12 @@ struct SpecMP3 : SpecBase { if (!strcmp(buildInfo, "Build v3.068 3/2/2006 14:55:13")) return false; + m_version = std::string(buildInfo); /* Root Report */ ExtractReport& rep = reps.emplace_back(); rep.name = _SYS_STR("MP3"); rep.desc = _SYS_STR("Metroid Prime 3 ") + regstr; - std::string buildStr(buildInfo); - hecl::SystemStringConv buildView(buildStr); + hecl::SystemStringConv buildView(m_version); rep.desc += _SYS_STR(" (") + buildView + _SYS_STR(")"); /* Iterate PAKs and build level options */ @@ -473,12 +473,20 @@ struct SpecMP3 : SpecBase { } process.waitUntilComplete(); - - /* Extract part of .dol for RandomStatic entropy */ - hecl::ProjectPath noAramPath(m_project.getProjectWorkingPath(), _SYS_STR("MP3/URDE")); - /* Generate Texture Cache containing meta data for every texture file */ - TextureCache::Generate(m_pakRouter, m_project, noAramPath); } + + /* Extract part of .dol for RandomStatic entropy */ + hecl::ProjectPath noAramPath(m_project.getProjectWorkingPath(), _SYS_STR("MP3/URDE")); + /* Generate Texture Cache containing meta data for every texture file */ + TextureCache::Generate(m_pakRouter, m_project, noAramPath); + /* Write version data */ + hecl::ProjectPath versionPath; + if (m_standalone) { + versionPath = hecl::ProjectPath(m_project.getProjectWorkingPath(), _SYS_STR("out/files")); + } else { + versionPath = hecl::ProjectPath(m_project.getProjectWorkingPath(), _SYS_STR("out/files/MP3")); + } + WriteVersionInfo(m_project, versionPath); return true; } diff --git a/Runtime/MP1/MP1.cpp b/Runtime/MP1/MP1.cpp index ee5eb0094..7377dc3c7 100644 --- a/Runtime/MP1/MP1.cpp +++ b/Runtime/MP1/MP1.cpp @@ -61,6 +61,7 @@ #include "Runtime/Particle/CWeaponDescription.hpp" #include "Runtime/World/CPlayer.hpp" #include "Runtime/World/CStateMachine.hpp" +#include "Runtime/World/CScriptMazeNode.hpp" #include #include @@ -343,6 +344,14 @@ CGameGlobalObjects::~CGameGlobalObjects() { g_GameState = nullptr; g_TweakManager = nullptr; } +void CGameGlobalObjects::PostInitialize() { + AddPaksAndFactories(); + LoadTextureCache(); + LoadStringTable(); + m_renderer.reset(AllocateRenderer(*xcc_simplePool, *x4_resFactory)); + CEnvFxManager::Initialize(); + CScriptMazeNode::LoadMazeSeeds(); +} void CMain::AddWorldPaks() { CResLoader* loader = g_ResFactory->GetResLoader(); diff --git a/Runtime/MP1/MP1.hpp b/Runtime/MP1/MP1.hpp index eea752799..1fc05f3a8 100644 --- a/Runtime/MP1/MP1.hpp +++ b/Runtime/MP1/MP1.hpp @@ -7,40 +7,39 @@ #define MP1_VARIABLE_DELTA_TIME 1 #endif -#include "IMain.hpp" -#include "CTweaks.hpp" -#include "CPlayMovie.hpp" -#include "IOStreams.hpp" -#include "CBasics.hpp" -#include "CMemoryCardSys.hpp" -#include "CResFactory.hpp" -#include "CSimplePool.hpp" -#include "Character/CAssetFactory.hpp" -#include "World/CAi.hpp" -#include "CGameState.hpp" -#include "CInGameTweakManager.hpp" -#include "Particle/CElementGen.hpp" -#include "Character/CAnimData.hpp" -#include "Particle/CDecalManager.hpp" -#include "Particle/CGenDescription.hpp" -#include "Graphics/CBooRenderer.hpp" -#include "Audio/CAudioSys.hpp" -#include "Input/CInputGenerator.hpp" -#include "GuiSys/CGuiSys.hpp" -#include "CIOWinManager.hpp" -#include "GuiSys/CSplashScreen.hpp" -#include "CMainFlow.hpp" -#include "GuiSys/CConsoleOutputWindow.hpp" -#include "GuiSys/CErrorOutputWindow.hpp" -#include "GuiSys/CTextParser.hpp" -#include "CAudioStateWin.hpp" -#include "GameGlobalObjects.hpp" -#include "CArchitectureQueue.hpp" -#include "CTimeProvider.hpp" -#include "GuiSys/CTextExecuteBuffer.hpp" +#include "Runtime/IMain.hpp" +#include "Runtime/MP1/CTweaks.hpp" +#include "Runtime/MP1/CPlayMovie.hpp" +#include "Runtime/IOStreams.hpp" +#include "Runtime/CBasics.hpp" +#include "Runtime/CMemoryCardSys.hpp" +#include "Runtime/CResFactory.hpp" +#include "Runtime/CSimplePool.hpp" +#include "Runtime/Character/CAssetFactory.hpp" +#include "Runtime/World/CAi.hpp" +#include "Runtime/CGameState.hpp" +#include "Runtime/MP1/CInGameTweakManager.hpp" +#include "Runtime/Particle/CElementGen.hpp" +#include "Runtime/Character/CAnimData.hpp" +#include "Runtime/Particle/CDecalManager.hpp" +#include "Runtime/Particle/CGenDescription.hpp" +#include "Runtime/Graphics/CBooRenderer.hpp" +#include "Runtime/Audio/CAudioSys.hpp" +#include "Runtime/Input/CInputGenerator.hpp" +#include "Runtime/GuiSys/CGuiSys.hpp" +#include "Runtime/CIOWinManager.hpp" +#include "Runtime/GuiSys/CSplashScreen.hpp" +#include "Runtime/MP1/CMainFlow.hpp" +#include "Runtime/GuiSys/CConsoleOutputWindow.hpp" +#include "Runtime/GuiSys/CErrorOutputWindow.hpp" +#include "Runtime/GuiSys/CTextParser.hpp" +#include "Runtime/MP1/CAudioStateWin.hpp" +#include "Runtime/GameGlobalObjects.hpp" +#include "Runtime/CArchitectureQueue.hpp" +#include "Runtime/CTimeProvider.hpp" +#include "Runtime/GuiSys/CTextExecuteBuffer.hpp" #include "DataSpec/DNAMP1/Tweaks/CTweakPlayer.hpp" #include "DataSpec/DNAMP1/Tweaks/CTweakGame.hpp" -#include "World/CScriptMazeNode.hpp" #include "hecl/Console.hpp" struct DiscordUser; @@ -104,14 +103,7 @@ public: ~CGameGlobalObjects(); - void PostInitialize() { - AddPaksAndFactories(); - LoadTextureCache(); - LoadStringTable(); - m_renderer.reset(AllocateRenderer(*xcc_simplePool, *x4_resFactory)); - CEnvFxManager::Initialize(); - CScriptMazeNode::LoadMazeSeeds(); - } + void PostInitialize(); void ResetGameState() { x134_gameState = std::make_unique(); From e553a9022fa32b4defec27b3b13f852f2e15478b Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Wed, 15 Apr 2020 04:27:06 -0700 Subject: [PATCH 182/224] Fix CMemoryCardSys --- DataSpec/SpecBase.cpp | 4 +- Runtime/CMemoryCardSys.cpp | 5 +- Runtime/MP1/MP1.cpp | 141 ++++++++++++++++++++++--------------- Runtime/MP1/MP1.hpp | 2 +- Runtime/World/CEntity.cpp | 6 +- kabufuda | 2 +- 6 files changed, 96 insertions(+), 64 deletions(-) diff --git a/DataSpec/SpecBase.cpp b/DataSpec/SpecBase.cpp index 846c29e5a..bf9ad7dc4 100644 --- a/DataSpec/SpecBase.cpp +++ b/DataSpec/SpecBase.cpp @@ -81,10 +81,10 @@ bool SpecBase::canExtract(const ExtractPassInfo& info, std::vector -namespace hecl { -extern CVar* com_enableCheats; -extern CVar* com_developer; -extern CVar* com_cubemaps; -}; // namespace hecl - namespace urde::MP1 { namespace { struct AudioGroupInfo { @@ -99,7 +93,7 @@ CGameArchitectureSupport::CGameArchitectureSupport(CMain& parent, boo::IAudioVoi , x0_audioSys(voiceEngine, backend, 0, 0, 0, 0, 0) , x30_inputGenerator(g_tweakPlayer->GetLeftLogicalThreshold(), g_tweakPlayer->GetRightLogicalThreshold()) , x44_guiSys(*g_ResFactory, *g_SimplePool, CGuiSys::EUsageMode::Zero) { - CMain* m = static_cast(g_Main); + auto* m = static_cast(g_Main); x30_inputGenerator.startScanning(); g_InputGenerator = &x30_inputGenerator; @@ -145,8 +139,9 @@ void CGameArchitectureSupport::Update(float dt) { } bool CGameArchitectureSupport::LoadAudio() { - if (x88_audioLoadStatus == EAudioLoadStatus::Loaded) + if (x88_audioLoadStatus == EAudioLoadStatus::Loaded) { return true; + } for (int i = 0; i < 5; ++i) { TToken& tok = x8c_pendingAudioGroups[i]; @@ -345,24 +340,27 @@ CGameGlobalObjects::~CGameGlobalObjects() { g_TweakManager = nullptr; } void CGameGlobalObjects::PostInitialize() { - AddPaksAndFactories(); - LoadTextureCache(); - LoadStringTable(); - m_renderer.reset(AllocateRenderer(*xcc_simplePool, *x4_resFactory)); - CEnvFxManager::Initialize(); - CScriptMazeNode::LoadMazeSeeds(); + AddPaksAndFactories(); + LoadTextureCache(); + LoadStringTable(); + m_renderer.reset(AllocateRenderer(*xcc_simplePool, *x4_resFactory)); + CEnvFxManager::Initialize(); + CScriptMazeNode::LoadMazeSeeds(); } void CMain::AddWorldPaks() { CResLoader* loader = g_ResFactory->GetResLoader(); - if (!loader) + if (loader == nullptr) { return; + } + auto pakPrefix = g_tweakGame->GetWorldPrefix(); for (int i = 0; i < 9; ++i) { std::string path(pakPrefix); - if (i != 0) - path += '0' + i; + if (i != 0) { + path += '0' + char(i); + } if (CDvdFile::FileExists(path + ".upak")) { loader->AddPakFileAsync(path, false, true); @@ -373,8 +371,9 @@ void CMain::AddWorldPaks() { void CMain::AddOverridePaks() { CResLoader* loader = g_ResFactory->GetResLoader(); - if (!loader) + if (loader == nullptr) { return; + } /* Inversely load each pak starting at 999, to ensure proper priority order * the higher the number the higer the priority, e.g: Override0 has less priority than Override1 etc. @@ -391,8 +390,9 @@ void CMain::AddOverridePaks() { /* Attempt to load URDE.upak * NOTE(phil): Should we fatal here if it's not found? */ - if (CDvdFile::FileExists("URDE.upak")) + if (CDvdFile::FileExists("URDE.upak")) { loader->AddPakFile("URDE", false, false, true); + } } void CMain::ResetGameState() { @@ -417,7 +417,7 @@ void CMain::InitializeSubsystems() { } void CMain::MemoryCardInitializePump() { - if (g_MemoryCardSys) { + if (g_MemoryCardSys != nullptr) { return; } @@ -438,8 +438,9 @@ void CMain::FillInAssetIDs() { } bool CMain::LoadAudio() { - if (x164_archSupport) + if (x164_archSupport) { return x164_archSupport->LoadAudio(); + } return true; } @@ -449,8 +450,9 @@ void CMain::EnsureWorldPakReady(CAssetId mlvl) { /* TODO: Schedule resource list } void CMain::Give(hecl::Console* console, const std::vector& args) { - if (args.size() < 1 || (!g_GameState || !g_GameState->GetPlayerState())) + if (args.empty() || (g_GameState == nullptr || !g_GameState->GetPlayerState())) { return; + } std::string type = args[0]; athena::utility::tolower(type); @@ -475,8 +477,9 @@ void CMain::Give(hecl::Console* console, const std::vector& args) { pState->IncrPickup(eType, 9999); console->report(hecl::Console::Level::Info, FMT_STRING("Cheater....., Greatly increasing Metroid encounters, have fun!")); - if (g_StateManager) + if (g_StateManager != nullptr) { g_StateManager->Player()->AsyncLoadSuit(*g_StateManager); + } return; } @@ -493,23 +496,28 @@ void CMain::Give(hecl::Console* console, const std::vector& args) { if (eType == CPlayerState::EItemType::Missiles) { u32 tmp = ((u32(itemAmt) / 5) + (itemAmt % 5)) * 5; pState->ReInitalizePowerUp(eType, tmp); - } else + } else { pState->ReInitalizePowerUp(eType, itemAmt); + } } - if (itemAmt > 0) + if (itemAmt > 0) { pState->IncrPickup(eType, u32(itemAmt)); - else + } else { pState->DecrPickup(eType, zeus::clamp(0u, u32(abs(itemAmt)), pState->GetItemAmount(eType))); + } } - if (g_StateManager) + if (g_StateManager != nullptr) { g_StateManager->Player()->AsyncLoadSuit(*g_StateManager); - console->report(hecl::Console::Level::Info, FMT_STRING("Cheater....., Greatly increasing Metroid encounters, have fun!")); + } + console->report(hecl::Console::Level::Info, + FMT_STRING("Cheater....., Greatly increasing Metroid encounters, have fun!")); } // namespace MP1 void CMain::Remove(hecl::Console*, const std::vector& args) { - if (args.size() < 1 || (!g_GameState || !g_GameState->GetPlayerState())) + if (args.empty() || (g_GameState == nullptr || !g_GameState->GetPlayerState())) { return; + } std::string type = args[0]; athena::utility::tolower(type); @@ -522,37 +530,42 @@ void CMain::Remove(hecl::Console*, const std::vector& args) { CPlayerState::EItemType eType = CPlayerState::ItemNameToType(type); if (eType != CPlayerState::EItemType::Invalid) { pState->ReInitalizePowerUp(eType, 0); - if (g_StateManager) + if (g_StateManager != nullptr) { g_StateManager->Player()->AsyncLoadSuit(*g_StateManager); + } } } } void CMain::God(hecl::Console* con, const std::vector&) { - if (g_GameState && g_GameState->GetPlayerState()) { + if (g_GameState != nullptr && g_GameState->GetPlayerState()) { g_GameState->GetPlayerState()->SetCanTakeDamage(!g_GameState->GetPlayerState()->CanTakeDamage()); - if (!g_GameState->GetPlayerState()->CanTakeDamage()) + if (!g_GameState->GetPlayerState()->CanTakeDamage()) { con->report(hecl::Console::Level::Info, FMT_STRING("God Mode Enabled")); - else + } else { con->report(hecl::Console::Level::Info, FMT_STRING("God Mode Disabled")); + } } } void CMain::Teleport(hecl::Console*, const std::vector& args) { - if (!g_StateManager || args.size() < 3) + if (g_StateManager == nullptr || args.size() < 3) { return; + } zeus::CVector3f loc; - for (u32 i = 0; i < 3; ++i) + for (u32 i = 0; i < 3; ++i) { loc[i] = strtof(args[i].c_str(), nullptr); + } zeus::CTransform xf = g_StateManager->Player()->GetTransform(); xf.origin = loc; if (args.size() >= 6) { zeus::CVector3f angle; - for (u32 i = 0; i < 3; ++i) + for (u32 i = 0; i < 3; ++i) { angle[i] = zeus::degToRad(strtof(args[i + 3].c_str(), nullptr)); + } xf.setRotation(zeus::CMatrix3f(zeus::CQuaternion(angle))); } g_StateManager->Player()->Teleport(xf, *g_StateManager, false); @@ -560,41 +573,47 @@ void CMain::Teleport(hecl::Console*, const std::vector& args) { void CMain::ListWorlds(hecl::Console* con, const std::vector&) { - if (g_ResFactory && g_ResFactory->GetResLoader()) { - for (const auto& pak : g_ResFactory->GetResLoader()->GetPaks()) + if (g_ResFactory != nullptr && g_ResFactory->GetResLoader() != nullptr) { + for (const auto& pak : g_ResFactory->GetResLoader()->GetPaks()) { if (pak->IsWorldPak()) { - for (const auto& named : pak->GetNameList()) + for (const auto& named : pak->GetNameList()) { if (named.second.type == SBIG('MLVL')) { con->report(hecl::Console::Level::Info, FMT_STRING("{} '{}'"), named.first, named.second.id); } + } } + } } } void CMain::Warp(hecl::Console* con, const std::vector& args) { - if (!g_StateManager) + if (g_StateManager == nullptr) { return; + } - if (args.size() < 1) + if (args.empty()) { return; + } - TAreaId aId; + TAreaId aId = 0; std::string worldName; if (args.size() == 2) { worldName = args[0]; athena::utility::tolower(worldName); aId = strtol(args[1].c_str(), nullptr, 10); - } else + } else { aId = strtol(args[0].c_str(), nullptr, 10); + } - if (!worldName.empty() && g_ResFactory && g_ResFactory->GetResLoader()) { + if (!worldName.empty() && g_ResFactory != nullptr && g_ResFactory->GetResLoader() != nullptr) { bool found = false; for (const auto& pak : g_ResFactory->GetResLoader()->GetPaks()) { - if (found) + if (found) { break; + } if (pak->IsWorldPak()) { - for (const auto& named : pak->GetNameList()) + for (const auto& named : pak->GetNameList()) { if (named.second.type == SBIG('MLVL')) { std::string name = named.first; athena::utility::tolower(name); @@ -604,14 +623,16 @@ void CMain::Warp(hecl::Console* con, const std::vector& args) { break; } } + } } } } g_GameState->GetWorldTransitionManager()->DisableTransition(); - if (aId >= g_GameState->CurrentWorldState().GetLayerState()->GetAreaCount()) + if (aId >= g_GameState->CurrentWorldState().GetLayerState()->GetAreaCount()) { aId = 0; + } g_GameState->CurrentWorldState().SetAreaId(aId); g_Main->SetFlowState(EFlowState::None); @@ -678,7 +699,7 @@ void CMain::UpdateDiscordPresence(CAssetId worldSTRG) { updated = true; } - if (g_GameState) { + if (g_GameState != nullptr) { if (CPlayerState* pState = g_GameState->GetPlayerState().get()) { u32 itemPercent = pState->CalculateItemCollectionRate() * 100 / pState->GetPickupTotal(); if (DiscordItemPercent != itemPercent) { @@ -699,7 +720,9 @@ void CMain::UpdateDiscordPresence(CAssetId worldSTRG) { } } -void CMain::HandleDiscordReady(const DiscordUser* request) { DiscordLog.report(logvisor::Info, FMT_STRING("Discord Ready")); } +void CMain::HandleDiscordReady(const DiscordUser* request) { + DiscordLog.report(logvisor::Info, FMT_STRING("Discord Ready")); +} void CMain::HandleDiscordDisconnected(int errorCode, const char* message) { DiscordLog.report(logvisor::Warning, FMT_STRING("Discord Disconnected: {}"), message); @@ -758,13 +781,15 @@ void CMain::Init(const hecl::Runtime::FileStoreManager& storeMgr, hecl::CVarMana const hecl::SystemChar* worldIdxStr = (*(it + 1)).c_str(); const hecl::SystemChar* areaIdxStr = (*(it + 2)).c_str(); - hecl::SystemChar* endptr; + hecl::SystemChar* endptr = nullptr; m_warpWorldIdx = TAreaId(hecl::StrToUl(worldIdxStr, &endptr, 0)); - if (endptr == worldIdxStr) + if (endptr == worldIdxStr) { m_warpWorldIdx = 0; + } m_warpAreaId = TAreaId(hecl::StrToUl(areaIdxStr, &endptr, 0)); - if (endptr == areaIdxStr) + if (endptr == areaIdxStr) { m_warpAreaId = 0; + } bool found = false; for (const auto& pak : g_ResFactory->GetResLoader()->GetPaks()) { @@ -787,7 +812,7 @@ void CMain::Init(const hecl::Runtime::FileStoreManager& storeMgr, hecl::CVarMana if (*cur == _SYS_STR('1')) m_warpLayerBits |= u64(1) << (cur - layerStr); } else if (layerStr[0] == _SYS_STR('0') && layerStr[1] == _SYS_STR('x')) { - m_warpMemoryRelays.push_back(TAreaId(hecl::StrToUl(layerStr + 2, nullptr, 16))); + m_warpMemoryRelays.emplace_back(TAreaId(hecl::StrToUl(layerStr + 2, nullptr, 16))); } ++it; } @@ -801,21 +826,22 @@ void CMain::Init(const hecl::Runtime::FileStoreManager& storeMgr, hecl::CVarMana x164_archSupport = std::make_unique(*this, voiceEngine, backend); g_archSupport = x164_archSupport.get(); x164_archSupport->PreloadAudio(); - std::srand(static_cast(std::time(nullptr))); + std::srand(static_cast(std::time(nullptr))); // g_TweakManager->ReadFromMemoryCard("AudioTweaks"); } static logvisor::Module WarmupLog("ShaderWarmup"); void CMain::WarmupShaders() { - if (m_warmupTags.size()) + if (!m_warmupTags.empty()) return; m_needsWarmupClear = true; size_t modelCount = 0; g_ResFactory->EnumerateResources([&](const SObjectTag& tag) { - if (tag.type == FOURCC('CMDL') || tag.type == FOURCC('MREA')) + if (tag.type == FOURCC('CMDL') || tag.type == FOURCC('MREA')) { ++modelCount; + } return true; }); m_warmupTags.reserve(modelCount); @@ -825,8 +851,9 @@ void CMain::WarmupShaders() { g_ResFactory->EnumerateResources([&](const SObjectTag& tag) { if (tag.type == FOURCC('CMDL') || tag.type == FOURCC('MREA')) { - if (addedTags.find(tag) != addedTags.end()) + if (addedTags.find(tag) != addedTags.end()) { return true; + } addedTags.insert(tag); m_warmupTags.push_back(tag); } diff --git a/Runtime/MP1/MP1.hpp b/Runtime/MP1/MP1.hpp index e71af345d..c17b83b56 100644 --- a/Runtime/MP1/MP1.hpp +++ b/Runtime/MP1/MP1.hpp @@ -134,7 +134,7 @@ class CGameArchitectureSupport std::vector> x8c_pendingAudioGroups; boo::SWindowRect m_windowRect; - bool m_rectIsDirty; + bool m_rectIsDirty = false; void destroyed() { x4_archQueue.Push(MakeMsg::CreateRemoveAllIOWins(EArchMsgTarget::IOWinManager)); } diff --git a/Runtime/World/CEntity.cpp b/Runtime/World/CEntity.cpp index 0194ca907..432dcc19c 100644 --- a/Runtime/World/CEntity.cpp +++ b/Runtime/World/CEntity.cpp @@ -45,8 +45,10 @@ void CEntity::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId objId, CStateM } void CEntity::SendScriptMsgs(EScriptObjectState state, CStateManager& stateMgr, EScriptObjectMessage skipMsg) { - for (const SConnection& conn : x20_conns) - if (conn.x0_state == state && conn.x4_msg != skipMsg) + for (const SConnection& conn : x20_conns) { + if (conn.x0_state == state && conn.x4_msg != skipMsg) { stateMgr.SendScriptMsg(x8_uid, conn.x8_objId, conn.x4_msg, state); + } + } } } // namespace urde diff --git a/kabufuda b/kabufuda index 6d8d38945..4891a9568 160000 --- a/kabufuda +++ b/kabufuda @@ -1 +1 @@ -Subproject commit 6d8d389459243a38efc585dc03b877b4697cdcf2 +Subproject commit 4891a9568856bb775d0889b47c3808880803423b From 52b4db2f0072dd68774e4e08ee21e20cbb11e929 Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Wed, 15 Apr 2020 06:42:44 -0700 Subject: [PATCH 183/224] Integrate URDEVersionInfo --- .clang-format | 3 +- DataSpec/DNACommon/CMakeLists.txt | 2 + DataSpec/SpecBase.cpp | 72 ++++++++++++++++--------------- DataSpec/SpecBase.hpp | 17 +++----- DataSpec/SpecMP1.cpp | 21 +++++---- DataSpec/SpecMP2.cpp | 19 ++++---- DataSpec/SpecMP3.cpp | 22 +++++----- Runtime/CDvdFile.cpp | 35 +++++++++------ Runtime/MP1/MP1.cpp | 27 ++++++++++++ Runtime/MP1/MP1.hpp | 11 +++++ hecl | 2 +- 11 files changed, 144 insertions(+), 87 deletions(-) diff --git a/.clang-format b/.clang-format index 6ed326e11..60bd33c2a 100644 --- a/.clang-format +++ b/.clang-format @@ -2,6 +2,7 @@ BasedOnStyle: LLVM ColumnLimit: 120 UseTab: Never +TabWidth: 4 --- Language: Cpp DerivePointerAlignment: false @@ -25,4 +26,4 @@ BinPackParameters: true SortIncludes: false AccessModifierOffset: -2 ConstructorInitializerIndentWidth: 0 -ConstructorInitializerAllOnOneLineOrOnePerLine: true +ConstructorInitializerAllOnOneLineOrOnePerLine: true \ No newline at end of file diff --git a/DataSpec/DNACommon/CMakeLists.txt b/DataSpec/DNACommon/CMakeLists.txt index 4d77c84cf..b4387de34 100644 --- a/DataSpec/DNACommon/CMakeLists.txt +++ b/DataSpec/DNACommon/CMakeLists.txt @@ -9,6 +9,7 @@ make_dnalist(CMDL EGMC SAVWCommon ParticleCommon + URDEVersionInfo Tweaks/ITweakPlayerGun) set(DNACOMMON_SOURCES @@ -40,6 +41,7 @@ set(DNACOMMON_SOURCES RigInverter.hpp RigInverter.cpp AROTBuilder.hpp AROTBuilder.cpp OBBTreeBuilder.hpp OBBTreeBuilder.cpp + URDEVersionInfo.hpp Tweaks/ITweak.hpp Tweaks/TweakWriter.hpp Tweaks/ITweakGame.hpp diff --git a/DataSpec/SpecBase.cpp b/DataSpec/SpecBase.cpp index bf9ad7dc4..732c92e7a 100644 --- a/DataSpec/SpecBase.cpp +++ b/DataSpec/SpecBase.cpp @@ -3,11 +3,12 @@ #include #endif -#include "SpecBase.hpp" -#include "Blender/BlenderSupport.hpp" -#include "DNACommon/DNACommon.hpp" -#include "DNACommon/TXTR.hpp" -#include "AssetNameMap.hpp" +#include "DataSpec/SpecBase.hpp" +#include "DataSpec/Blender/BlenderSupport.hpp" +#include "DataSpec/DNACommon/DNACommon.hpp" +#include "DataSpec/DNACommon/TXTR.hpp" +#include "DataSpec/AssetNameMap.hpp" +#include "DataSpec/DNACommon/URDEVersionInfo.hpp" #include "hecl/ClientProcess.hpp" #include "nod/DiscBase.hpp" #include "nod/nod.hpp" @@ -42,7 +43,9 @@ SpecBase::SpecBase(const hecl::Database::DataSpecEntry* specEntry, hecl::Databas : hecl::Database::IDataSpec(specEntry) , m_project(project) , m_pc(pc) -, m_masterShader(project.getProjectWorkingPath(), ".hecl/RetroMasterShader.blend") { +, m_masterShader(project.getProjectWorkingPath(), ".hecl/RetroMasterShader.blend") +, m_region(ERegion::Invalid) +, m_game(EGame::Invalid) { AssetNameMap::InitAssetNameMap(); SpecBase::setThreadProject(); } @@ -128,8 +131,7 @@ bool IsPathAudioGroup(const hecl::ProjectPath& path) { } static bool IsPathSong(const hecl::ProjectPath& path) { - if (path.getPathType() != hecl::ProjectPath::Type::Glob || - !path.getWithExtension(_SYS_STR(".mid"), true).isFile() || + if (path.getPathType() != hecl::ProjectPath::Type::Glob || !path.getWithExtension(_SYS_STR(".mid"), true).isFile() || !path.getWithExtension(_SYS_STR(".yaml"), true).isFile()) { return path.isFile() && path.getLastComponentExt() == _SYS_STR("mid") && path.getWithExtension(_SYS_STR(".yaml"), true).isFile(); @@ -311,7 +313,8 @@ void SpecBase::flattenDependenciesBlend(const hecl::ProjectPath& in, std::vector hecl::SystemStringConv chSysName(sub.name); if (!sub.cskrId.empty()) { hecl::SystemStringConv cskrSysName(sub.cskrId); - pathsOut.push_back(asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}_{}.CSKR")), chSysName, cskrSysName))); + pathsOut.push_back( + asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}_{}.CSKR")), chSysName, cskrSysName))); } else { pathsOut.push_back(asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}.CSKR")), chSysName))); } @@ -327,7 +330,8 @@ void SpecBase::flattenDependenciesBlend(const hecl::ProjectPath& in, std::vector flattenDependenciesBlend(overlay.mesh, pathsOut, btok); pathsOut.push_back(overlay.mesh); } - pathsOut.push_back(asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}.{}_{}.CSKR")), chSysName, overlaySys, overlayCskrId))); + pathsOut.push_back(asGlob.ensureAuxInfo( + fmt::format(FMT_STRING(_SYS_STR("{}.{}_{}.CSKR")), chSysName, overlaySys, overlayCskrId))); } } }; @@ -345,7 +349,8 @@ void SpecBase::flattenDependenciesBlend(const hecl::ProjectPath& in, std::vector hecl::SystemStringConv chSysName(att.name); hecl::SystemStringConv sysCskrId(att.cskrId); - pathsOut.push_back(asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("ATTACH.{}_{}.CSKR")), chSysName, sysCskrId))); + pathsOut.push_back( + asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("ATTACH.{}_{}.CSKR")), chSysName, sysCskrId))); if (att.armature >= 0) { const auto& arm = actor.armatures[att.armature]; @@ -358,8 +363,9 @@ void SpecBase::flattenDependenciesBlend(const hecl::ProjectPath& in, std::vector hecl::SystemStringConv actSysName(act.first); hecl::SystemStringConv actAnimId(act.second); pathsOut.push_back(asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}_{}.ANIM")), actSysName, actAnimId))); - hecl::SystemString searchPrefix(asGlob.getWithExtension( - fmt::format(FMT_STRING(_SYS_STR(".{}_")), actSysName).c_str(), true).getLastComponent()); + hecl::SystemString searchPrefix( + asGlob.getWithExtension(fmt::format(FMT_STRING(_SYS_STR(".{}_")), actSysName).c_str(), true) + .getLastComponent()); hecl::ProjectPath evntPath; for (const auto& ent : dEnum) { if (hecl::StringUtils::BeginsWith(ent.m_name, searchPrefix.c_str()) && @@ -628,8 +634,7 @@ void SpecBase::doPackage(const hecl::ProjectPath& path, const hecl::Database::Da std::unordered_set addedTags; addedTags.reserve(buildList.size()); for (auto& tag : buildList) { - if ((i == 0 && tag.type == FOURCC('CMDL')) || - (i == 1 && tag.type != FOURCC('CMDL'))) { + if ((i == 0 && tag.type == FOURCC('CMDL')) || (i == 1 && tag.type != FOURCC('CMDL'))) { if (addedTags.find(tag) != addedTags.end()) continue; addedTags.insert(tag); @@ -1010,11 +1015,10 @@ bool SpecBase::addFileToIndex(const hecl::ProjectPath& path, athena::io::YAMLDoc hecl::SystemStringConv overlaySys(overlay.first); hecl::SystemStringConv overlayCskrId(overlay.second); if (!overlay.second.empty()) { - subPath = - asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}.{}_{}.CSKR")), subName, overlaySys, overlayCskrId)); + subPath = asGlob.ensureAuxInfo( + fmt::format(FMT_STRING(_SYS_STR("{}.{}_{}.CSKR")), subName, overlaySys, overlayCskrId)); } else { - subPath = - asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}.{}.CSKR")), subName, overlaySys)); + subPath = asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("{}.{}.CSKR")), subName, overlaySys)); } insertPathTag(cacheWriter, buildTagFromPath(subPath), subPath); } @@ -1026,11 +1030,10 @@ bool SpecBase::addFileToIndex(const hecl::ProjectPath& path, athena::io::YAMLDoc hecl::SystemStringConv attachmentCskrId(attachment.second); hecl::ProjectPath subPath; if (!attachment.second.empty()) { - subPath = - asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("ATTACH.{}_{}.CSKR")), attachmentSys, attachmentCskrId)); + subPath = asGlob.ensureAuxInfo( + fmt::format(FMT_STRING(_SYS_STR("ATTACH.{}_{}.CSKR")), attachmentSys, attachmentCskrId)); } else { - subPath = - asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("ATTACH.{}.CSKR")), attachmentSys)); + subPath = asGlob.ensureAuxInfo(fmt::format(FMT_STRING(_SYS_STR("ATTACH.{}.CSKR")), attachmentSys)); } insertPathTag(cacheWriter, buildTagFromPath(subPath), subPath); } @@ -1164,8 +1167,8 @@ void SpecBase::backgroundIndexProc() { } } } - Log.report(logvisor::Info, FMT_STRING(_SYS_STR("Name index of '{}' loaded; {} names")), getOriginalSpec().m_name, - m_catalogNameToTag.size()); + Log.report(logvisor::Info, FMT_STRING(_SYS_STR("Name index of '{}' loaded; {} names")), + getOriginalSpec().m_name, m_catalogNameToTag.size()); } } } @@ -1208,15 +1211,16 @@ void SpecBase::waitForIndexComplete() const { } } -void SpecBase::WriteVersionInfo(hecl::Database::Project &project, const hecl::ProjectPath &pakPath) { - hecl::ProjectPath versionPath(pakPath, _SYS_STR("version.yaml")); - versionPath.makeDirChain(false); +void SpecBase::WriteVersionInfo(hecl::Database::Project& project, const hecl::ProjectPath& pakPath) { + hecl::ProjectPath versionPath(pakPath, _SYS_STR("version.yaml")); + versionPath.makeDirChain(false); - athena::io::YAMLDocWriter yamlW("URDEVersionData"); - yamlW.writeString("version", m_version); - yamlW.writeByte("region", atUint8(m_region)); - yamlW.writeBool("is_trilogy", !m_standalone); - athena::io::FileWriter fileW(versionPath.getAbsolutePath()); - yamlW.finish(&fileW); + URDEVersionInfo info; + info.version = m_version; + info.region = m_region; + info.game = m_game; + info.isTrilogy = !m_standalone; + athena::io::FileWriter writer(versionPath.getAbsolutePath()); + athena::io::ToYAMLStream(info, writer); } } // namespace DataSpec diff --git a/DataSpec/SpecBase.hpp b/DataSpec/SpecBase.hpp index 2bab11ee5..e98c57679 100644 --- a/DataSpec/SpecBase.hpp +++ b/DataSpec/SpecBase.hpp @@ -12,6 +12,7 @@ #include "hecl/Blender/Token.hpp" #include "Runtime/RetroTypes.hpp" + namespace nod { class DiscBase; class Node; @@ -23,13 +24,8 @@ class YAMLDocWriter; } // namespace athena::io namespace DataSpec { -enum class ERegion { - Invalid = 0, - NTSC_U = 'E', - PAL = 'P', - NTSC_J = 'J' -}; - +enum class ERegion; +enum class EGame; struct SpecBase : hecl::Database::IDataSpec { /* HECL Adaptors */ void setThreadProject() override; @@ -203,9 +199,10 @@ protected: const std::unordered_map>& mlvlData); std::unique_ptr m_disc; - bool m_isWii; - bool m_standalone; - ERegion m_region = ERegion::Invalid; + bool m_isWii{}; + bool m_standalone{}; + ERegion m_region; + EGame m_game; std::string m_version; void WriteVersionInfo(hecl::Database::Project& project, const hecl::ProjectPath& pakPath); diff --git a/DataSpec/SpecMP1.cpp b/DataSpec/SpecMP1.cpp index 0ea5cc7ff..5a957087d 100644 --- a/DataSpec/SpecMP1.cpp +++ b/DataSpec/SpecMP1.cpp @@ -29,6 +29,7 @@ #include "DNACommon/DPSC.hpp" #include "DNACommon/DGRP.hpp" #include "DNACommon/MAPU.hpp" +#include "DNACommon/URDEVersionInfo.hpp" #include "DNACommon/Tweaks/TweakWriter.hpp" #include "DNAMP1/Tweaks/CTweakPlayerRes.hpp" #include "DNAMP1/Tweaks/CTweakGunRes.hpp" @@ -46,7 +47,6 @@ #include "DNAMP1/Tweaks/CTweakPlayerGun.hpp" #include "DNAMP1/MazeSeeds.hpp" #include "DNAMP1/SnowForces.hpp" - #include "hecl/ClientProcess.hpp" #include "hecl/MultiProgressPrinter.hpp" #include "hecl/Blender/Connection.hpp" @@ -145,7 +145,8 @@ struct SpecMP1 : SpecBase { , m_workPath(project.getProjectWorkingPath(), _SYS_STR("MP1")) , m_cookPath(project.getProjectCookedPath(SpecEntMP1), _SYS_STR("MP1")) , m_pakRouter(*this, m_workPath, m_cookPath) { - setThreadProject(); + m_game = EGame::MetroidPrime1; + SpecBase::setThreadProject(); } void buildPaks(nod::Node& root, const std::vector& args, ExtractReport& rep) { @@ -197,8 +198,9 @@ struct SpecMP1 : SpecBase { /* Sort PAKs alphabetically */ m_orderedPaks.clear(); - for (DNAMP1::PAKBridge& dpak : m_paks) + for (DNAMP1::PAKBridge& dpak : m_paks) { m_orderedPaks[std::string(dpak.getName())] = &dpak; + } /* Assemble extract report */ rep.childOpts.reserve(m_orderedPaks.size()); @@ -218,9 +220,10 @@ struct SpecMP1 : SpecBase { const std::vector& args, std::vector& reps) override { nod::IPartition* partition = disc.getDataPartition(); m_dolBuf = partition->getDOLBuf(); - const char* buildInfo = (char*)memmem(m_dolBuf.get(), partition->getDOLSize(), "MetroidBuildInfo", 16) + 19; + const char* buildInfo = + static_cast(memmem(m_dolBuf.get(), partition->getDOLSize(), "MetroidBuildInfo", 16)) + 19; - if (!buildInfo) + if (buildInfo == nullptr) return false; m_version = std::string(buildInfo); @@ -275,15 +278,15 @@ struct SpecMP1 : SpecBase { } m_dolBuf = dolIt->getBuf(); - const char* buildInfo = (char*)memmem(m_dolBuf.get(), dolIt->size(), "MetroidBuildInfo", 16) + 19; + const char* buildInfo = static_cast(memmem(m_dolBuf.get(), dolIt->size(), "MetroidBuildInfo", 16)) + 19; /* Root Report */ ExtractReport& rep = reps.emplace_back(); rep.name = _SYS_STR("MP1"); rep.desc = _SYS_STR("Metroid Prime ") + regstr; - if (buildInfo) { - std::string buildStr(buildInfo); - hecl::SystemStringConv buildView(buildStr); + if (buildInfo != nullptr) { + m_version = std::string(buildInfo); + hecl::SystemStringConv buildView(m_version); rep.desc += _SYS_STR(" (") + buildView + _SYS_STR(")"); } diff --git a/DataSpec/SpecMP2.cpp b/DataSpec/SpecMP2.cpp index b896ce7c5..dad6eaa58 100644 --- a/DataSpec/SpecMP2.cpp +++ b/DataSpec/SpecMP2.cpp @@ -12,6 +12,7 @@ #include "DNACommon/MAPU.hpp" #include "DNACommon/PATH.hpp" #include "DNACommon/TXTR.hpp" +#include "DNACommon/URDEVersionInfo.hpp" #include "hecl/ClientProcess.hpp" #include "hecl/Blender/Connection.hpp" @@ -111,7 +112,8 @@ struct SpecMP2 : SpecBase { , m_workPath(project.getProjectWorkingPath(), _SYS_STR("MP2")) , m_cookPath(project.getProjectCookedPath(SpecEntMP2), _SYS_STR("MP2")) , m_pakRouter(*this, m_workPath, m_cookPath) { - setThreadProject(); + m_game = EGame::MetroidPrime2; + SpecBase::setThreadProject(); } void buildPaks(nod::Node& root, const std::vector& args, ExtractReport& rep) { @@ -183,9 +185,10 @@ struct SpecMP2 : SpecBase { const std::vector& args, std::vector& reps) override { nod::IPartition* partition = disc.getDataPartition(); std::unique_ptr dolBuf = partition->getDOLBuf(); - const char* buildInfo = (char*)memmem(dolBuf.get(), partition->getDOLSize(), "MetroidBuildInfo", 16) + 19; - if (!buildInfo) + const char* buildInfo = static_cast(memmem(dolBuf.get(), partition->getDOLSize(), "MetroidBuildInfo", 16)) + 19; + if (buildInfo == nullptr) { return false; + } m_version = std::string(buildInfo); /* Root Report */ @@ -206,7 +209,7 @@ struct SpecMP2 : SpecBase { const std::vector& args, std::vector& reps) override { std::vector mp2args; bool doExtract = false; - if (args.size()) { + if (!args.empty()) { /* Needs filter */ for (const hecl::SystemString& arg : args) { hecl::SystemString lowerArg = arg; @@ -237,15 +240,15 @@ struct SpecMP2 : SpecBase { } std::unique_ptr dolBuf = dolIt->getBuf(); - const char* buildInfo = (char*)memmem(dolBuf.get(), dolIt->size(), "MetroidBuildInfo", 16) + 19; + const char* buildInfo = static_cast(memmem(dolBuf.get(), dolIt->size(), "MetroidBuildInfo", 16)) + 19; /* Root Report */ ExtractReport& rep = reps.emplace_back(); rep.name = _SYS_STR("MP2"); rep.desc = _SYS_STR("Metroid Prime 2 ") + regstr; - if (buildInfo) { - std::string buildStr(buildInfo); - hecl::SystemStringConv buildView(buildStr); + if (buildInfo != nullptr) { + m_version = std::string(buildInfo); + hecl::SystemStringConv buildView(m_version); rep.desc += _SYS_STR(" (") + buildView + _SYS_STR(")"); } diff --git a/DataSpec/SpecMP3.cpp b/DataSpec/SpecMP3.cpp index 4d5c87edf..83bd3da8e 100644 --- a/DataSpec/SpecMP3.cpp +++ b/DataSpec/SpecMP3.cpp @@ -9,6 +9,7 @@ #include "DataSpec/DNAMP3/MAPA.hpp" #include "DataSpec/DNAMP2/STRG.hpp" #include "DataSpec/DNACommon/TXTR.hpp" +#include "DataSpec/DNACommon/URDEVersionInfo.hpp" #include "hecl/ClientProcess.hpp" #include "hecl/Blender/Connection.hpp" @@ -89,11 +90,7 @@ struct TextureCache { }; struct SpecMP3 : SpecBase { - bool checkStandaloneID(const char* id) const override { - if (!memcmp(id, "RM3", 3)) - return true; - return false; - } + bool checkStandaloneID(const char* id) const override { return memcmp(id, "RM3", 3) == 0; } bool doMP3 = false; std::vector m_nonPaks; @@ -122,7 +119,8 @@ struct SpecMP3 : SpecBase { , m_feWorkPath(project.getProjectWorkingPath(), _SYS_STR("fe")) , m_feCookPath(project.getProjectCookedPath(SpecEntMP3), _SYS_STR("fe")) , m_fePakRouter(*this, m_feWorkPath, m_feCookPath) { - setThreadProject(); + m_game = EGame::MetroidPrime3; + SpecBase::setThreadProject(); } void buildPaks(nod::Node& root, const std::vector& args, ExtractReport& rep, bool fe) { @@ -223,13 +221,15 @@ struct SpecMP3 : SpecBase { doMP3 = true; nod::IPartition* partition = disc.getDataPartition(); std::unique_ptr dolBuf = partition->getDOLBuf(); - const char* buildInfo = (char*)memmem(dolBuf.get(), partition->getDOLSize(), "MetroidBuildInfo", 16) + 19; - if (!buildInfo) + const char* buildInfo = static_cast(memmem(dolBuf.get(), partition->getDOLSize(), "MetroidBuildInfo", 16)) + 19; + if (buildInfo == nullptr) { return false; + } /* We don't want no stinking demo dammit */ - if (!strcmp(buildInfo, "Build v3.068 3/2/2006 14:55:13")) + if (strcmp(buildInfo, "Build v3.068 3/2/2006 14:55:13") == 0) { return false; + } m_version = std::string(buildInfo); /* Root Report */ @@ -317,8 +317,8 @@ struct SpecMP3 : SpecBase { rep.name = _SYS_STR("MP3"); rep.desc = _SYS_STR("Metroid Prime 3 ") + regstr; - std::string buildStr(buildInfo); - hecl::SystemStringConv buildView(buildStr); + m_version = std::string(buildInfo); + hecl::SystemStringConv buildView(m_version); rep.desc += _SYS_STR(" (") + buildView + _SYS_STR(")"); /* Iterate PAKs and build level options */ diff --git a/Runtime/CDvdFile.cpp b/Runtime/CDvdFile.cpp index 35bfbccee..4e62104e5 100644 --- a/Runtime/CDvdFile.cpp +++ b/Runtime/CDvdFile.cpp @@ -19,7 +19,7 @@ class CFileDvdRequest : public IDvdRequest { std::function m_callback; public: - ~CFileDvdRequest() override { PostCancelRequest(); } + ~CFileDvdRequest() override { CFileDvdRequest::PostCancelRequest(); } void WaitUntilComplete() override { while (!m_complete.load() && !m_cancel.load()) { @@ -32,14 +32,15 @@ public: m_cancel.store(true); } - EMediaType GetMediaType() const override { return EMediaType::File; } + [[nodiscard]] EMediaType GetMediaType() const override { return EMediaType::File; } CFileDvdRequest(CDvdFile& file, void* buf, u32 len, ESeekOrigin whence, int off, std::function&& cb) : m_reader(file.m_reader), m_buf(buf), m_len(len), m_whence(whence), m_offset(off), m_callback(std::move(cb)) {} void DoRequest() { - if (m_cancel.load()) + if (m_cancel.load()) { return; + } u32 readLen; if (m_whence == ESeekOrigin::Cur && m_offset == 0) { readLen = m_reader->readBytesToBuf(m_buf, m_len); @@ -47,8 +48,9 @@ public: m_reader->seek(m_offset, athena::SeekOrigin(m_whence)); readLen = m_reader->readBytesToBuf(m_buf, m_len); } - if (m_callback) + if (m_callback) { m_callback(readLen); + } m_complete.store(true); } }; @@ -63,21 +65,22 @@ void CDvdFile::WorkerProc() { logvisor::RegisterThreadName("CDvdFile"); while (m_WorkerRun.load()) { std::unique_lock lk(CDvdFile::m_WorkerMutex); - while (CDvdFile::m_RequestQueue.size()) { + while (!CDvdFile::m_RequestQueue.empty()) { std::vector> swapQueue; swapQueue.swap(CDvdFile::m_RequestQueue); lk.unlock(); std::unique_lock waitlk(CDvdFile::m_WaitMutex); for (std::shared_ptr& req : swapQueue) { - CFileDvdRequest& concreteReq = static_cast(*req); + auto& concreteReq = static_cast(*req); concreteReq.DoRequest(); } waitlk.unlock(); swapQueue.clear(); lk.lock(); } - if (!m_WorkerRun.load()) + if (!m_WorkerRun.load()) { break; + } m_WorkerCV.wait(lk); } } @@ -93,13 +96,16 @@ std::shared_ptr CDvdFile::AsyncSeekRead(void* buf, u32 len, ESeekOr } hecl::ProjectPath CDvdFile::ResolvePath(std::string_view path) { - auto start = path.begin(); - while (*start == '/') ++start; + const char* start = path.begin(); + while (*start == '/') { + ++start; + } std::string lowerChStr(start, path.end()); std::transform(lowerChStr.begin(), lowerChStr.end(), lowerChStr.begin(), ::tolower); auto search = m_caseInsensitiveMap.find(lowerChStr); - if (search == m_caseInsensitiveMap.end()) + if (search == m_caseInsensitiveMap.end()) { return {}; + } return hecl::ProjectPath(m_DvdRoot, search->second); } @@ -120,19 +126,22 @@ void CDvdFile::RecursiveBuildCaseInsensitiveMap(const hecl::ProjectPath& path, s void CDvdFile::Initialize(const hecl::ProjectPath& path) { m_DvdRoot = path; RecursiveBuildCaseInsensitiveMap(path, path.getAbsolutePathUTF8().length() + 1); - if (m_WorkerRun.load()) + if (m_WorkerRun.load()) { return; + } m_WorkerRun.store(true); m_WorkerThread = std::thread(WorkerProc); } void CDvdFile::Shutdown() { - if (!m_WorkerRun.load()) + if (!m_WorkerRun.load()) { return; + } m_WorkerRun.store(false); m_WorkerCV.notify_one(); - if (m_WorkerThread.joinable()) + if (m_WorkerThread.joinable()) { m_WorkerThread.join(); + } m_RequestQueue.clear(); } diff --git a/Runtime/MP1/MP1.cpp b/Runtime/MP1/MP1.cpp index 8696295ff..16f8d8f6a 100644 --- a/Runtime/MP1/MP1.cpp +++ b/Runtime/MP1/MP1.cpp @@ -664,6 +664,7 @@ void CMain::RefreshGameState() { } static logvisor::Module DiscordLog("Discord"); +static logvisor::Module MainLog("MP1::CMain"); static const char* DISCORD_APPLICATION_ID = "402571593815031819"; static int64_t DiscordStartTime; static CAssetId DiscordWorldSTRG; @@ -775,6 +776,32 @@ void CMain::Init(const hecl::Runtime::FileStoreManager& storeMgr, hecl::CVarMana x70_tweaks.RegisterResourceTweaks(m_cvarMgr); AddWorldPaks(); + bool loadedVersion = false; + if (CDvdFile::FileExists("version.yaml")) { + CDvdFile file("version.yaml"); + if (file) { + std::unique_ptr buf = std::make_unique(file.Length()); + u32 readLen = file.SyncRead(buf.get(), file.Length()); + if (readLen == file.Length()) { + CMemoryInStream memoryInStream(buf.get(), file.Length()); + athena::io::FromYAMLStream(m_version, memoryInStream); + loadedVersion = true; + MainLog.report(logvisor::Level::Info, FMT_STRING("Loaded version info")); + } + } + } + if (loadedVersion) { + if (GetGame() != EGame::MetroidPrime1) { + MainLog.report(logvisor::Level::Fatal, + FMT_STRING("Attempted to initialize URDE in MP1 mode with non-MP1 data!!!!")); + } + boo::SystemStringView versionView(GetVersionString()); + MainLog.report(logvisor::Level::Info, FMT_STRING("Loading data from Metroid Prime version {} from region {}{}"), + versionView, char(GetRegion()), IsTrilogy() ? _SYS_STR(" from trilogy") : _SYS_STR("")); + } else { + MainLog.report(logvisor::Level::Fatal, FMT_STRING("Unable to load version info")); + } + const auto& args = boo::APP->getArgs(); for (auto it = args.begin(); it != args.end(); ++it) { if (*it == _SYS_STR("--warp") && args.end() - it >= 3) { diff --git a/Runtime/MP1/MP1.hpp b/Runtime/MP1/MP1.hpp index c17b83b56..a420aca91 100644 --- a/Runtime/MP1/MP1.hpp +++ b/Runtime/MP1/MP1.hpp @@ -37,6 +37,7 @@ #include "Runtime/GuiSys/CTextExecuteBuffer.hpp" #include "DataSpec/DNAMP1/Tweaks/CTweakPlayer.hpp" #include "DataSpec/DNAMP1/Tweaks/CTweakGame.hpp" +#include "DataSpec/DNACommon/URDEVersionInfo.hpp" #include "hecl/Console.hpp" #include "hecl/CVarCommons.hpp" @@ -48,6 +49,8 @@ class IObjectStore; namespace MP1 { class CMain; +using ERegion = DataSpec::ERegion; +using EGame = DataSpec::EGame; class CGameGlobalObjects { friend class CMain; @@ -244,6 +247,7 @@ private: bool m_firstFrame = true; using delta_clock = std::chrono::high_resolution_clock; std::chrono::time_point m_prevFrameTime; + DataSpec::URDEVersionInfo m_version; void InitializeSubsystems(); static void InitializeDiscord(); @@ -311,6 +315,13 @@ public: void ListWorlds(hecl::Console*, const std::vector&); void Warp(hecl::Console*, const std::vector&); hecl::Console* Console() const override { return m_console.get(); } + bool IsPAL() const { return m_version.region == ERegion::PAL; } + bool IsJapanese() const { return m_version.region == ERegion::NTSC_J; } + bool IsUSA() const { return m_version.region == ERegion::NTSC_U; } + bool IsTrilogy() const { return m_version.isTrilogy; } + ERegion GetRegion() const { return m_version.region; } + EGame GetGame() const { return m_version.game; } + std::string_view GetVersionString() const { return m_version.version; } int m_warpWorldIdx = -1; TAreaId m_warpAreaId = 0; diff --git a/hecl b/hecl index d208592b2..a52732d1d 160000 --- a/hecl +++ b/hecl @@ -1 +1 @@ -Subproject commit d208592b2825188940064e462038e2ce90164101 +Subproject commit a52732d1dea9e8e61a35fc262d46bc0730026ce9 From 6d4ad6d95696054274764a566afc84e45e1474ca Mon Sep 17 00:00:00 2001 From: Luke Street Date: Wed, 15 Apr 2020 13:43:08 -0400 Subject: [PATCH 184/224] Add URDEVersionInfo.hpp --- DataSpec/DNACommon/URDEVersionInfo.hpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 DataSpec/DNACommon/URDEVersionInfo.hpp diff --git a/DataSpec/DNACommon/URDEVersionInfo.hpp b/DataSpec/DNACommon/URDEVersionInfo.hpp new file mode 100644 index 000000000..5f9fbac54 --- /dev/null +++ b/DataSpec/DNACommon/URDEVersionInfo.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include + +#include "DataSpec/DNACommon/DNACommon.hpp" + +namespace DataSpec { +enum class EGame { + Invalid = 0, + MetroidPrime1 = 1, + MetroidPrime2 = 2, + MetroidPrime3 = 3, +}; + +enum class ERegion { Invalid = 0, NTSC_U = 'E', PAL = 'P', NTSC_J = 'J' }; + +struct URDEVersionInfo : BigDNA { + AT_DECL_DNA_YAML + + String<-1> version; + Value region; + Value game; + Value isTrilogy; +}; +} // namespace DataSpec From 191d0f079db8497e3312b528b680df2f786ad2b3 Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Wed, 15 Apr 2020 11:54:17 -0700 Subject: [PATCH 185/224] Add real URDEVersionInfo.hpp --- DataSpec/DNACommon/URDEVersionInfo.hpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 DataSpec/DNACommon/URDEVersionInfo.hpp diff --git a/DataSpec/DNACommon/URDEVersionInfo.hpp b/DataSpec/DNACommon/URDEVersionInfo.hpp new file mode 100644 index 000000000..11f1e8c54 --- /dev/null +++ b/DataSpec/DNACommon/URDEVersionInfo.hpp @@ -0,0 +1,26 @@ +#pragma once + +#include "DataSpec/DNACommon/DNACommon.hpp" + +namespace DataSpec { +enum class ERegion { + Invalid = -1, + NTSC_U = 'E', + PAL = 'P', + NTSC_J = 'J' +}; +enum class EGame { + Invalid=0, + MetroidPrime1, + MetroidPrime2, + MetroidPrime3, +}; + +struct URDEVersionInfo : public BigDNA { + AT_DECL_DNA_YAML + String<-1> version; + Value region; + Value game; + Value isTrilogy; +}; +} \ No newline at end of file From 582d8a6999d248aeb598bb28b567b9ecdcd5a15d Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Wed, 15 Apr 2020 22:26:14 -0700 Subject: [PATCH 186/224] Initial PAL/JP/Trilogy imps, various cleanup --- DataSpec/DNACommon/Tweaks/ITweakPlayerRes.hpp | 3 + DataSpec/DNAMP1/DNAMP1.cpp | 33 +++++++--- DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp | 6 +- DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp | 66 ++++++++++++++++++- DataSpec/SpecBase.cpp | 16 +++++ DataSpec/SpecBase.hpp | 11 +++- DataSpec/SpecMP1.cpp | 30 ++++++--- Runtime/CStateManager.cpp | 63 +++++++++++------- Runtime/GameGlobalObjects.hpp | 6 +- Runtime/IMain.hpp | 11 ++++ Runtime/MP1/CTweaks.cpp | 16 ++++- Runtime/MP1/MP1.hpp | 17 ++--- .../Particle/CProjectileWeaponDataFactory.cpp | 9 +++ Runtime/Particle/CWeaponDescription.hpp | 4 ++ Runtime/World/CDamageInfo.cpp | 6 +- Runtime/World/CDamageVulnerability.cpp | 28 +++++--- Runtime/World/CKnockBackController.cpp | 27 +++++--- Runtime/World/CPatterned.cpp | 10 +-- Runtime/World/CWallCrawlerSwarm.cpp | 12 +++- Runtime/World/CWallCrawlerSwarm.hpp | 2 +- 20 files changed, 285 insertions(+), 91 deletions(-) diff --git a/DataSpec/DNACommon/Tweaks/ITweakPlayerRes.hpp b/DataSpec/DNACommon/Tweaks/ITweakPlayerRes.hpp index 85a9a8636..213528a23 100644 --- a/DataSpec/DNACommon/Tweaks/ITweakPlayerRes.hpp +++ b/DataSpec/DNACommon/Tweaks/ITweakPlayerRes.hpp @@ -21,6 +21,9 @@ struct ITweakPlayerRes : ITweak { ResId x18_minesBreakSecondTopIcon; ResId x1c_minesBreakSecondBottomIcon; + ResId rs5_mapArrowUp; + ResId rs5_mapArrowDown; + /* N, U, UL, L, DL, D, DR, R, UR */ std::array x24_lStick; std::array x4c_cStick; diff --git a/DataSpec/DNAMP1/DNAMP1.cpp b/DataSpec/DNAMP1/DNAMP1.cpp index 631040d25..30704552c 100644 --- a/DataSpec/DNAMP1/DNAMP1.cpp +++ b/DataSpec/DNAMP1/DNAMP1.cpp @@ -30,6 +30,7 @@ #include "PATH.hpp" #include "DataSpec/DNACommon/Tweaks/TweakWriter.hpp" +#include "DataSpec/DNACommon/URDEVersionInfo.hpp" #include "Tweaks/CTweakPlayerRes.hpp" #include "Tweaks/CTweakGunRes.hpp" #include "Tweaks/CTweakPlayer.hpp" @@ -237,8 +238,8 @@ void PAKBridge::addCMDLRigPairs(PAKRouter& pakRouter, CharacterAssoci if (animResInfo.evntId.isValid()) { PAK::Entry* evntEnt = (PAK::Entry*)m_pak.lookupEntry(animResInfo.evntId); evntEnt->name = fmt::format(FMT_STRING("ANCS_{}_{}_evnt"), id, animResInfo.name); - charAssoc.m_cskrToCharacter[animResInfo.evntId] = - std::make_pair(entry.id, fmt::format(FMT_STRING("{}_{}.evnt.yaml"), animResInfo.name, animResInfo.evntId)); + charAssoc.m_cskrToCharacter[animResInfo.evntId] = std::make_pair( + entry.id, fmt::format(FMT_STRING("{}_{}.evnt.yaml"), animResInfo.name, animResInfo.evntId)); } } } else if (entry.type == FOURCC('MREA')) { @@ -275,8 +276,8 @@ void PAKBridge::addMAPATransforms(PAKRouter& pakRouter, hecl::ProjectPath mlvlDirPath = pakRouter.getWorking(&entry).getParentPath(); if (mlvl.worldNameId.isValid()) - pathOverrides[mlvl.worldNameId] = hecl::ProjectPath(mlvlDirPath, - fmt::format(FMT_STRING(_SYS_STR("!name_{}.yaml")), mlvl.worldNameId)); + pathOverrides[mlvl.worldNameId] = + hecl::ProjectPath(mlvlDirPath, fmt::format(FMT_STRING(_SYS_STR("!name_{}.yaml")), mlvl.worldNameId)); for (const MLVL::Area& area : mlvl.areas) { { @@ -292,8 +293,8 @@ void PAKBridge::addMAPATransforms(PAKRouter& pakRouter, hecl::ProjectPath areaDirPath = pakRouter.getWorking(area.areaMREAId).getParentPath(); if (area.areaNameId.isValid()) - pathOverrides[area.areaNameId] = hecl::ProjectPath(areaDirPath, - fmt::format(FMT_STRING(_SYS_STR("!name_{}.yaml")), area.areaNameId)); + pathOverrides[area.areaNameId] = + hecl::ProjectPath(areaDirPath, fmt::format(FMT_STRING(_SYS_STR("!name_{}.yaml")), area.areaNameId)); } if (mlvl.worldMap.isValid()) { @@ -383,8 +384,14 @@ ResExtractor PAKBridge::LookupExtractor(const nod::Node& pakNode, con std::string catalogueName; std::string name = pak.bestEntryName(pakNode, entry, catalogueName); if (!catalogueName.empty()) { - if (catalogueName == "PlayerRes"sv) - return {ExtractTweak, {_SYS_STR(".yaml")}}; + if (catalogueName == "PlayerRes"sv) { + if (isCurrentSpecWii() || getCurrentRegion() == ERegion::PAL || getCurrentRegion() == ERegion::NTSC_J) { + /* We need to use the new rep for these tweaks */ + return {ExtractTweak>, {_SYS_STR(".yaml")}}; + } + /* We need to use the old rep for these tweaks */ + return {ExtractTweak>, {_SYS_STR(".yaml")}}; + } if (catalogueName == "GunRes"sv) return {ExtractTweak, {_SYS_STR(".yaml")}}; if (catalogueName == "Player"sv) @@ -395,8 +402,14 @@ ResExtractor PAKBridge::LookupExtractor(const nod::Node& pakNode, con return {ExtractTweak, {_SYS_STR(".yaml")}}; if (catalogueName == "Game"sv) return {ExtractTweak, {_SYS_STR(".yaml")}}; - if (catalogueName == "Targeting"sv) - return {ExtractTweak, {_SYS_STR(".yaml")}}; + if (catalogueName == "Targeting"sv) { + if (isCurrentSpecWii() || getCurrentRegion() == ERegion::PAL || getCurrentRegion() == ERegion::NTSC_J) { + /* We need to use the new rep for these tweaks */ + return {ExtractTweak>, {_SYS_STR(".yaml")}}; + } + /* We need to use the old rep for these tweaks */ + return {ExtractTweak>, {_SYS_STR(".yaml")}}; + } if (catalogueName == "Gui"sv) return {ExtractTweak, {_SYS_STR(".yaml")}}; if (catalogueName == "AutoMapper"sv) diff --git a/DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp b/DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp index bf0370606..77ceb8b22 100644 --- a/DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp +++ b/DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp @@ -4,7 +4,8 @@ namespace DataSpec::DNAMP1 { -struct CTweakPlayerRes final : ITweakPlayerRes { +template +struct AT_SPECIALIZE_PARMS(true, false) CTweakPlayerRes final : ITweakPlayerRes { AT_DECL_DNA_YAML String<-1> m_saveStationIcon; @@ -16,6 +17,9 @@ struct CTweakPlayerRes final : ITweakPlayerRes { String<-1> m_minesBreakSecondTopIcon; String<-1> m_minesBreakSecondBottomIcon; + String m_mapArrowDown; + String m_mapArrowUp; + String<-1> m_lStickN; String<-1> m_lStickU; String<-1> m_lStickUL; diff --git a/DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp b/DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp index 8c4c68db1..2b2f3754f 100644 --- a/DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp +++ b/DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp @@ -3,7 +3,8 @@ #include "../../DNACommon/Tweaks/ITweakTargeting.hpp" namespace DataSpec::DNAMP1 { -struct CTweakTargeting final : public ITweakTargeting { +template +struct AT_SPECIALIZE_PARMS(true, false) CTweakTargeting final : public ITweakTargeting { AT_DECL_DNA_YAML Value x4_targetRadiusMode; Value x8_currLockOnExitDuration; @@ -132,6 +133,69 @@ struct CTweakTargeting final : public ITweakTargeting { Value x220_scanTargetClampMax; Value x224_angularLagSpeed; + // RS5 + Vector x218_; + Vector x21c_; + bool x224_ = true; + bool x225_ = false; + bool x226_ = true; + bool x227_ = true; + bool x22c_ = true; + bool x22d_ = false; + bool x22e_ = true; + bool x22f_ = true; + bool x234_ = true; + bool x235_ = false; + bool x236_ = true; + bool x237_ = true; + zeus::CVector3f x23c_ = zeus::skZero3f; + + float x2c8_ = 0.25f; + float x2cc_ = 0.35f; + zeus::CColor x2d0_ = (zeus::Comp32)0xb6e6ffff; + float x2d4_ = 0.39215687f; + zeus::CColor x2d8_ = (zeus::Comp32)0xa82a00ff; + float x2dc_ = 0.78431374f; + zeus::CVector3f x2e0_ = zeus::CVector3f(0.f, 0.f, 0.46f); + float x2ec_ = 0.25f; + float x2f0_ = 0.25f; + float x2f4_ = 120.f; + float x2f8_ = 0.25f; + float x2fc_ = 3.5f; + float x300_ = 0.35f; + zeus::CColor x304_ = (zeus::Comp32)0xa82a00ff; + float x308_ = 0.78431374f; + zeus::CColor x30c_ = (zeus::Comp32)0x89d6ffff; + float x310_ = 0.5019608f; + float x314_ = 11.25f; + float x318_ = 0.25f; + float x31c_ = 0.125f; + zeus::CColor x320_ = (zeus::Comp32)0xffca28ff; + float x324_ = 0.78431374f; + zeus::CColor x328_ = (zeus::Comp32)0x89d6ffff; + float x32c_ = 0.19607843f; + float x330_ = 0.f; + float x334_ = 0.25f; + float x338_ = 3.f; + float x33c_ = 0.25f; + float x340_ = 0.25f; + float x344_ = 0.25f; + float x348_ = 0.25f; + float x34c_ = 45.f; + float x350_ = 0.5f; + float x354_ = 0.65f; + float x358_ = 1.5f; + float x35c_ = 0.18f; + float x360_ = 0.15f; + float x364_ = 0.25f; + zeus::CColor x368_ = (zeus::Comp32)0x56c1fb9f; + zeus::CColor x36c_ = (zeus::Comp32)0x49c3f6a0; + zeus::CColor x370_ = (zeus::Comp32)0x49c3f631; + zeus::CColor x374_ = (zeus::Comp32)0xff8930ff; + zeus::CColor x378_ = (zeus::Comp32)0xff2f28ff; + zeus::CColor x37c_ = (zeus::Comp32)0x93e9ffff; + zeus::CColor x380_ = (zeus::Comp32)0xff6b60ff; + CTweakTargeting() = default; CTweakTargeting(athena::io::IStreamReader& r) { this->read(r); diff --git a/DataSpec/SpecBase.cpp b/DataSpec/SpecBase.cpp index 732c92e7a..ed0074ae5 100644 --- a/DataSpec/SpecBase.cpp +++ b/DataSpec/SpecBase.cpp @@ -39,6 +39,12 @@ static const hecl::SystemChar* MomErr[] = {_SYS_STR("Your metroid is in another constexpr uint32_t MomErrCount = std::extent::value; +static ERegion g_CurRegion = ERegion::Invalid; +static bool g_CurSpecIsWii = false; + +ERegion getCurrentRegion() { return g_CurRegion; } +bool isCurrentSpecWii() { return g_CurSpecIsWii; } + SpecBase::SpecBase(const hecl::Database::DataSpecEntry* specEntry, hecl::Database::Project& project, bool pc) : hecl::Database::IDataSpec(specEntry) , m_project(project) @@ -94,6 +100,9 @@ bool SpecBase::canExtract(const ExtractPassInfo& info, std::vector::DNAType()) return true; - else if (classType == DNAMP1::CTweakPlayerRes::DNAType()) + else if (classType == DNAMP1::CTweakPlayerRes::DNAType()) + return true; + else if (classType == DNAMP1::CTweakPlayerRes::DNAType()) return true; else if (classType == DNAMP1::CTweakGunRes::DNAType()) return true; @@ -442,7 +444,9 @@ struct SpecMP1 : SpecBase { return true; else if (classType == DNAMP1::CTweakAutoMapper::DNAType()) return true; - else if (classType == DNAMP1::CTweakTargeting::DNAType()) + else if (classType == DNAMP1::CTweakTargeting::DNAType()) + return true; + else if (classType == DNAMP1::CTweakTargeting::DNAType()) return true; else if (classType == DNAMP1::CTweakGui::DNAType()) return true; @@ -583,13 +587,15 @@ struct SpecMP1 : SpecBase { } else if (className == DataSpec::DNAMP1::SCAN::DNAType()) { resTag.type = SBIG('SCAN'); return true; - } else if (className == DataSpec::DNAMP1::CTweakPlayerRes::DNAType() || + } else if (className == DataSpec::DNAMP1::CTweakPlayerRes::DNAType() || + className == DataSpec::DNAMP1::CTweakPlayerRes::DNAType() || className == DataSpec::DNAMP1::CTweakGunRes::DNAType() || className == DataSpec::DNAMP1::CTweakSlideShow::DNAType() || className == DataSpec::DNAMP1::CTweakPlayer::DNAType() || className == DataSpec::DNAMP1::CTweakCameraBob::DNAType() || className == DataSpec::DNAMP1::CTweakGame::DNAType() || - className == DataSpec::DNAMP1::CTweakTargeting::DNAType() || + className == DataSpec::DNAMP1::CTweakTargeting::DNAType() || + className == DataSpec::DNAMP1::CTweakTargeting::DNAType() || className == DataSpec::DNAMP1::CTweakAutoMapper::DNAType() || className == DataSpec::DNAMP1::CTweakGui::DNAType() || className == DataSpec::DNAMP1::CTweakPlayerControl::DNAType() || @@ -834,8 +840,12 @@ struct SpecMP1 : SpecBase { DNAFont::FONT font; font.read(reader); DNAFont::WriteFONT(font, out); - } else if (classStr == DNAMP1::CTweakPlayerRes::DNAType()) { - DNAMP1::CTweakPlayerRes playerRes; + } else if (classStr == DNAMP1::CTweakPlayerRes::DNAType()) { + DNAMP1::CTweakPlayerRes playerRes; + playerRes.read(reader); + WriteTweak(playerRes, out); + } else if (classStr == DNAMP1::CTweakPlayerRes::DNAType()) { + DNAMP1::CTweakPlayerRes playerRes; playerRes.read(reader); WriteTweak(playerRes, out); } else if (classStr == DNAMP1::CTweakGunRes::DNAType()) { @@ -862,8 +872,12 @@ struct SpecMP1 : SpecBase { DNAMP1::CTweakAutoMapper autoMapper; autoMapper.read(reader); WriteTweak(autoMapper, out); - } else if (classStr == DNAMP1::CTweakTargeting::DNAType()) { - DNAMP1::CTweakTargeting targeting; + } else if (classStr == DNAMP1::CTweakTargeting::DNAType()) { + DNAMP1::CTweakTargeting targeting; + targeting.read(reader); + WriteTweak(targeting, out); + } else if (classStr == DNAMP1::CTweakTargeting::DNAType()) { + DNAMP1::CTweakTargeting targeting; targeting.read(reader); WriteTweak(targeting, out); } else if (classStr == DNAMP1::CTweakGui::DNAType()) { diff --git a/Runtime/CStateManager.cpp b/Runtime/CStateManager.cpp index e9d9c8521..2b5ebc9ea 100644 --- a/Runtime/CStateManager.cpp +++ b/Runtime/CStateManager.cpp @@ -1428,11 +1428,14 @@ void CStateManager::InformListeners(const zeus::CVector3f& pos, EListenNoiseType void CStateManager::ApplyKnockBack(CActor& actor, const CDamageInfo& info, const CDamageVulnerability& vuln, const zeus::CVector3f& pos, float dampen) { - if (vuln.GetVulnerability(info.GetWeaponMode(), false) == EVulnerability::Deflect) + if (vuln.GetVulnerability(info.GetWeaponMode(), false) == EVulnerability::Deflect) { return; + } + CHealthInfo* hInfo = actor.HealthInfo(*this); - if (!hInfo) + if (hInfo == nullptr) { return; + } float dampedPower = (1.f - dampen) * info.GetKnockBackPower(); if (TCastToPtr player = actor) { @@ -1446,30 +1449,34 @@ void CStateManager::ApplyKnockBack(CActor& actor, const CDamageInfo& info, const if (TCastToPtr physActor = actor) { zeus::CVector3f kbVec = pos * (dampedPower - hInfo->GetKnockbackResistance()) * physActor->GetMass() * 1.5f; if (physActor->GetMaterialList().HasMaterial(EMaterialTypes::Immovable) || - !physActor->GetMaterialList().HasMaterial(EMaterialTypes::Grass)) + !physActor->GetMaterialList().HasMaterial(EMaterialTypes::Solid)) { return; + } physActor->ApplyImpulseWR(kbVec, zeus::CAxisAngle()); return; } } } - if (ai) + if (ai) { ai->KnockBack(pos, *this, info, dampen == 0.f ? EKnockBackType::Direct : EKnockBackType::Radius, false, dampedPower); + } } void CStateManager::KnockBackPlayer(CPlayer& player, const zeus::CVector3f& pos, float power, float resistance) { - if (player.GetMaterialList().HasMaterial(EMaterialTypes::Immovable)) + if (player.GetMaterialList().HasMaterial(EMaterialTypes::Immovable)) { return; + } float usePower; if (player.GetMorphballTransitionState() != CPlayer::EPlayerMorphBallState::Morphed) { usePower = power * 1000.f; CPlayer::ESurfaceRestraints surface = player.x2b0_outOfWaterTicks == 2 ? player.x2ac_surfaceRestraint : CPlayer::ESurfaceRestraints::Water; - if (surface != CPlayer::ESurfaceRestraints::Normal && player.GetOrbitState() == CPlayer::EPlayerOrbitState::NoOrbit) + if (surface != CPlayer::ESurfaceRestraints::Normal && player.GetOrbitState() == CPlayer::EPlayerOrbitState::NoOrbit) { usePower /= 7.f; + } } else { usePower = power * 500.f; } @@ -1496,15 +1503,17 @@ void CStateManager::ApplyDamageToWorld(TUniqueId damager, const CActor& actor, c bool bomb = false; TCastToConstPtr weapon = actor; - if (weapon) + if (weapon) { bomb = True(weapon->GetAttribField() & (EProjectileAttrib::Bombs | EProjectileAttrib::PowerBombs)); + } rstl::reserved_vector nearList; BuildNearList(nearList, aabb, filter, &actor); for (TUniqueId id : nearList) { CEntity* ent = ObjectById(id); - if (!ent) + if (ent == nullptr) { continue; + } TCastToPtr player = ent; if (bomb && player) { @@ -1513,20 +1522,24 @@ void CStateManager::ApplyDamageToWorld(TUniqueId damager, const CActor& actor, c MP1::CSamusHud::DisplayHudMemo(u"", CHUDMemoParms{0.f, true, true, true}); player->UnFreeze(*this); } else { - if ((weapon->GetAttribField() & EProjectileAttrib::Bombs) == EProjectileAttrib::Bombs) + if ((weapon->GetAttribField() & EProjectileAttrib::Bombs) == EProjectileAttrib::Bombs) { player->BombJump(pos, *this); + } } } else if (ent->GetUniqueId() != damager) { TestBombHittingWater(actor, pos, static_cast(*ent)); - if (TestRayDamage(pos, static_cast(*ent), nearList)) + if (TestRayDamage(pos, static_cast(*ent), nearList)) { ApplyRadiusDamage(actor, pos, static_cast(*ent), info); + } } - if (TCastToPtr swarm = ent) + if (TCastToPtr swarm = ent) { swarm->ApplyRadiusDamage(pos, info, *this); + } - if (TCastToPtr swarm = ent) + if (TCastToPtr swarm = ent) { swarm->ApplyRadiusDamage(pos, info, *this); + } } } @@ -1555,28 +1568,29 @@ void CStateManager::ApplyRadiusDamage(const CActor& a1, const zeus::CVector3f& p ((bounds = a2.GetTouchBounds()) && CCollidableSphere::Sphere_AABox_Bool(zeus::CSphere{pos, info.GetRadius()}, *bounds))) { float rad = info.GetRadius(); - if (rad > FLT_EPSILON) + if (rad > FLT_EPSILON) { rad = delta.magnitude() / rad; - else + } else { rad = 0.f; - if (rad > 0.f) + } + if (rad > 0.f) { delta.normalize(); + } bool alive = false; - if (CHealthInfo* hInfo = a2.HealthInfo(*this)) - if (hInfo->GetHP() > 0.f) + if (CHealthInfo* hInfo = a2.HealthInfo(*this)) { + if (hInfo->GetHP() > 0.f) { alive = true; + } + } - const CDamageVulnerability* vuln; - if (rad > 0.f) - vuln = a2.GetDamageVulnerability(pos, delta, info); - else - vuln = a2.GetDamageVulnerability(); + const CDamageVulnerability* vuln = rad > 0.f ? a2.GetDamageVulnerability(pos, delta, info) : a2.GetDamageVulnerability(); if (vuln->WeaponHurts(info.GetWeaponMode(), true)) { float dam = info.GetRadiusDamage(*vuln); - if (dam > 0.f) + if (dam > 0.f) { ApplyLocalDamage(pos, delta, a2, dam, info.GetWeaponMode()); + } a2.SendScriptMsgs(EScriptObjectState::Damage, *this, EScriptObjectMessage::None); SendScriptMsg(&a2, a1.GetUniqueId(), EScriptObjectMessage::Damage); } else { @@ -1584,8 +1598,9 @@ void CStateManager::ApplyRadiusDamage(const CActor& a1, const zeus::CVector3f& p SendScriptMsg(&a2, a1.GetUniqueId(), EScriptObjectMessage::InvulnDamage); } - if (alive && info.GetKnockBackPower() > 0.f) + if (alive && info.GetKnockBackPower() > 0.f) { ApplyKnockBack(a2, info, *vuln, (a2.GetTranslation() - a1.GetTranslation()).normalized(), rad); + } } } diff --git a/Runtime/GameGlobalObjects.hpp b/Runtime/GameGlobalObjects.hpp index 117796887..5ddcf4c4b 100644 --- a/Runtime/GameGlobalObjects.hpp +++ b/Runtime/GameGlobalObjects.hpp @@ -57,11 +57,9 @@ extern class CStateManager* g_StateManager; #if USE_DOWNCAST_TWEAKS using ITweakGame = DataSpec::DNAMP1::CTweakGame; using ITweakPlayer = DataSpec::DNAMP1::CTweakPlayer; -using ITweakPlayerRes = DataSpec::DNAMP1::CTweakPlayerRes; using ITweakPlayerControl = DataSpec::DNAMP1::CTweakPlayerControl; using ITweakPlayerGun = DataSpec::DNAMP1::CTweakPlayerGun; using ITweakGunRes = DataSpec::DNAMP1::CTweakGunRes; -using ITweakTargeting = DataSpec::DNAMP1::CTweakTargeting; using ITweakAutoMapper = DataSpec::DNAMP1::CTweakAutoMapper; using ITweakGui = DataSpec::DNAMP1::CTweakGui; using ITweakSlideShow = DataSpec::DNAMP1::CTweakSlideShow; @@ -71,11 +69,9 @@ using ITweakGuiColors = DataSpec::DNAMP1::CTweakGuiColors; #else using ITweakGame = DataSpec::ITweakGame; using ITweakPlayer = DataSpec::ITweakPlayer; -using ITweakPlayerRes = DataSpec::ITweakPlayerRes; using ITweakPlayerControl = DataSpec::ITweakPlayerControl; using ITweakPlayerGun = DataSpec::ITweakPlayerGun; using ITweakGunRes = DataSpec::ITweakGunRes; -using ITweakTargeting = DataSpec::ITweakTargeting; using ITweakAutoMapper = DataSpec::ITweakAutoMapper; using ITweakGui = DataSpec::ITweakGui; using ITweakSlideShow = DataSpec::ITweakSlideShow; @@ -83,6 +79,8 @@ using ITweakParticle = DataSpec::ITweakParticle; using ITweakBall = DataSpec::ITweakBall; using ITweakGuiColors = DataSpec::ITweakGuiColors; #endif +using ITweakPlayerRes = DataSpec::ITweakPlayerRes; +using ITweakTargeting = DataSpec::ITweakTargeting; extern ITweakGame* g_tweakGame; extern ITweakPlayer* g_tweakPlayer; diff --git a/Runtime/IMain.hpp b/Runtime/IMain.hpp index b84364c51..16772b39f 100644 --- a/Runtime/IMain.hpp +++ b/Runtime/IMain.hpp @@ -6,6 +6,7 @@ #include #include #include +#include "DataSpec/DNACommon/URDEVersionInfo.hpp" namespace hecl { class Console; @@ -13,6 +14,9 @@ class CVarManager; } // namespace hecl namespace urde { +using ERegion = DataSpec::ERegion; +using EGame = DataSpec::EGame; + class CStopwatch; enum class EGameplayResult { None, Win, Lose, Playing }; @@ -40,5 +44,12 @@ public: virtual size_t GetExpectedIdSize() const = 0; virtual void WarmupShaders() = 0; virtual hecl::Console* Console() const = 0; + virtual EGame GetGame() const =0; + virtual ERegion GetRegion() const =0; + virtual bool IsPAL() const = 0; + virtual bool IsJapanese() const = 0; + virtual bool IsUSA() const = 0; + virtual bool IsTrilogy() const = 0; + virtual std::string_view GetVersionString() const=0; }; } // namespace urde diff --git a/Runtime/MP1/CTweaks.cpp b/Runtime/MP1/CTweaks.cpp index 431ab3dfc..790b632c1 100644 --- a/Runtime/MP1/CTweaks.cpp +++ b/Runtime/MP1/CTweaks.cpp @@ -63,8 +63,13 @@ void CTweaks::RegisterTweaks(hecl::CVarManager* cvarMgr) { /* Targeting */ tag = g_ResFactory->GetResourceIdByName("Targeting"); strm.emplace(g_ResFactory->LoadResourceSync(*tag).release(), g_ResFactory->ResourceSize(*tag), true); - g_tweakTargeting = new DataSpec::DNAMP1::CTweakTargeting(*strm); - g_tweakTargeting->initCVars(cvarMgr); + if (g_Main->IsTrilogy() || g_Main->IsPAL() || g_Main->IsJapanese()) { + g_tweakTargeting = new DataSpec::DNAMP1::CTweakTargeting(*strm); + g_tweakTargeting->initCVars(cvarMgr); + } else { + g_tweakTargeting = new DataSpec::DNAMP1::CTweakTargeting(*strm); + g_tweakTargeting->initCVars(cvarMgr); + } /* Game */ tag = g_ResFactory->GetResourceIdByName("Game"); @@ -121,7 +126,12 @@ void CTweaks::RegisterResourceTweaks(hecl::CVarManager* cvarMgr) { tag = g_ResFactory->GetResourceIdByName("PlayerRes"); strm.emplace(g_ResFactory->LoadResourceSync(*tag).release(), g_ResFactory->ResourceSize(*tag), true); - g_tweakPlayerRes = new DataSpec::DNAMP1::CTweakPlayerRes(*strm); + if (g_Main->IsTrilogy() || g_Main->IsPAL() || g_Main->IsJapanese()) { + g_tweakPlayerRes = new DataSpec::DNAMP1::CTweakPlayerRes(*strm); + } else { + g_tweakPlayerRes = new DataSpec::DNAMP1::CTweakPlayerRes(*strm); + } + g_tweakPlayerRes->ResolveResources(*g_ResFactory); g_tweakPlayerRes->initCVars(cvarMgr); } diff --git a/Runtime/MP1/MP1.hpp b/Runtime/MP1/MP1.hpp index a420aca91..f2ca5a0ac 100644 --- a/Runtime/MP1/MP1.hpp +++ b/Runtime/MP1/MP1.hpp @@ -37,7 +37,6 @@ #include "Runtime/GuiSys/CTextExecuteBuffer.hpp" #include "DataSpec/DNAMP1/Tweaks/CTweakPlayer.hpp" #include "DataSpec/DNAMP1/Tweaks/CTweakGame.hpp" -#include "DataSpec/DNACommon/URDEVersionInfo.hpp" #include "hecl/Console.hpp" #include "hecl/CVarCommons.hpp" @@ -49,8 +48,6 @@ class IObjectStore; namespace MP1 { class CMain; -using ERegion = DataSpec::ERegion; -using EGame = DataSpec::EGame; class CGameGlobalObjects { friend class CMain; @@ -315,13 +312,13 @@ public: void ListWorlds(hecl::Console*, const std::vector&); void Warp(hecl::Console*, const std::vector&); hecl::Console* Console() const override { return m_console.get(); } - bool IsPAL() const { return m_version.region == ERegion::PAL; } - bool IsJapanese() const { return m_version.region == ERegion::NTSC_J; } - bool IsUSA() const { return m_version.region == ERegion::NTSC_U; } - bool IsTrilogy() const { return m_version.isTrilogy; } - ERegion GetRegion() const { return m_version.region; } - EGame GetGame() const { return m_version.game; } - std::string_view GetVersionString() const { return m_version.version; } + bool IsPAL() const override { return m_version.region == ERegion::PAL; } + bool IsJapanese() const override { return m_version.region == ERegion::NTSC_J; } + bool IsUSA() const override { return m_version.region == ERegion::NTSC_U; } + bool IsTrilogy() const override { return m_version.isTrilogy; } + ERegion GetRegion() const override { return m_version.region; } + EGame GetGame() const override { return m_version.game; } + std::string_view GetVersionString() const override{ return m_version.version; } int m_warpWorldIdx = -1; TAreaId m_warpAreaId = 0; diff --git a/Runtime/Particle/CProjectileWeaponDataFactory.cpp b/Runtime/Particle/CProjectileWeaponDataFactory.cpp index 3eae8c2e4..c234a8907 100644 --- a/Runtime/Particle/CProjectileWeaponDataFactory.cpp +++ b/Runtime/Particle/CProjectileWeaponDataFactory.cpp @@ -149,6 +149,15 @@ bool CProjectileWeaponDataFactory::CreateWPSM(CWeaponDescription* desc, CInputSt case SBIG('FOFF'): desc->xb0_FOFF = CPF::GetRealElement(in); break; + case SBIG('SPS1'): + desc->x28_SPS1 = CPF::GetBool(in); + break; + case SBIG('SPS2'): + desc->x29_SPS2 = CPF::GetBool(in); + break; + case SBIG('FC60'): + desc->x29_FC60 = CPF::GetBool(in); + break; default: { Log.report(logvisor::Fatal, FMT_STRING("Unknown WPSM class {} @{}"), clsId, in.position()); return false; diff --git a/Runtime/Particle/CWeaponDescription.hpp b/Runtime/Particle/CWeaponDescription.hpp index 29e5d1692..0144fe111 100644 --- a/Runtime/Particle/CWeaponDescription.hpp +++ b/Runtime/Particle/CWeaponDescription.hpp @@ -54,5 +54,9 @@ public: s32 xa8_PJFX = -1; std::unique_ptr xac_RNGE; std::unique_ptr xb0_FOFF; + // PAL/RS5 + bool x28_SPS1 = false; + bool x29_SPS2 = false; + bool x29_FC60 = false; }; } // namespace urde diff --git a/Runtime/World/CDamageInfo.cpp b/Runtime/World/CDamageInfo.cpp index 9911afbc4..c657afa67 100644 --- a/Runtime/World/CDamageInfo.cpp +++ b/Runtime/World/CDamageInfo.cpp @@ -36,10 +36,12 @@ float CDamageInfo::GetDamage(const CDamageVulnerability& dVuln) const { float CDamageInfo::GetRadiusDamage(const CDamageVulnerability& dVuln) const { EVulnerability vuln = dVuln.GetVulnerability(x0_weaponMode, false); - if (vuln == EVulnerability::Deflect) + if (vuln == EVulnerability::Deflect) { return 0.f; - else if (vuln == EVulnerability::Weak) + } + if (vuln == EVulnerability::Weak) { return 2.f * xc_radiusDamage; + } return xc_radiusDamage; } diff --git a/Runtime/World/CDamageVulnerability.cpp b/Runtime/World/CDamageVulnerability.cpp index cb48efc37..44bc12a25 100644 --- a/Runtime/World/CDamageVulnerability.cpp +++ b/Runtime/World/CDamageVulnerability.cpp @@ -240,36 +240,44 @@ bool CDamageVulnerability::WeaponHits(const CWeaponMode& mode, bool checkDirect) } EVulnerability CDamageVulnerability::GetVulnerability(const CWeaponMode& mode, bool ignoreDirect) const { - if (mode.GetType() == EWeaponType::None || mode.GetType() > EWeaponType::OrangePhazon) + if (mode.GetType() == EWeaponType::None || mode.GetType() > EWeaponType::OrangePhazon) { return EVulnerability::Deflect; + } - if (mode.IsInstantKill()) + if (mode.IsInstantKill()) { return EVulnerability::Normal; + } EVulnerability vuln = (&x0_power)[u32(mode.GetType())]; if (mode.IsCharged()) { - if (mode.GetType() < EWeaponType::Bomb) + if (mode.GetType() < EWeaponType::Bomb) { vuln = (&x3c_chargedPower)[u32(mode.GetType())]; - else + } else { vuln = EVulnerability::Normal; + } } if (mode.IsComboed()) { - if (mode.GetType() < EWeaponType::Bomb) + if (mode.GetType() < EWeaponType::Bomb) { vuln = (&x3c_chargedPower)[u32(mode.GetType())]; - else + } else { vuln = EVulnerability::Normal; + } } - if (ignoreDirect) + if (ignoreDirect) { return vuln; + } - if (vuln == EVulnerability::DirectWeak) + if (vuln == EVulnerability::DirectWeak) { return EVulnerability::Weak; - else if (vuln == EVulnerability::DirectNormal) + } + if (vuln == EVulnerability::DirectNormal) { return EVulnerability::Normal; - else if (vuln == EVulnerability::DirectImmune) + } + if (vuln == EVulnerability::DirectImmune) { return EVulnerability::Immune; + } return vuln; } diff --git a/Runtime/World/CKnockBackController.cpp b/Runtime/World/CKnockBackController.cpp index cd84dc277..61503a15b 100644 --- a/Runtime/World/CKnockBackController.cpp +++ b/Runtime/World/CKnockBackController.cpp @@ -483,8 +483,9 @@ void CKnockBackController::DoKnockBackAnimation(const zeus::CVector3f& backVec, switch (x4_activeParms.x0_animState) { case EKnockBackAnimationState::Hurled: { float hurlVel = 5.f; - if (CHealthInfo* hInfo = parent.HealthInfo(mgr)) + if (CHealthInfo* hInfo = parent.HealthInfo(mgr)) { hurlVel += CalculateExtraHurlVelocity(mgr, magnitude, hInfo->GetKnockbackResistance()); + } hurlVel = std::sqrt(parent.GetGravityConstant() * 0.5f * hurlVel); zeus::CVector3f backUpVec = backVec + backVec.magnitude() * zeus::skUp; if (backUpVec.canBeNormalized()) { @@ -520,10 +521,11 @@ void CKnockBackController::ResetKnockBackImpulse(CPatterned& parent, const zeus: if (x81_24_autoResetImpulse && x4_activeParms.x0_animState == EKnockBackAnimationState::KnockBack && x4_activeParms.x4_animFollowup != EKnockBackAnimationFollowUp::Freeze) { x50_impulseDir = backVec.canBeNormalized() ? backVec.normalized() : -parent.GetTransform().basis[1]; - if (x60_impulseRemTime <= 0.f) + if (x60_impulseRemTime <= 0.f) { x5c_impulseMag = magnitude; - else + } else { x5c_impulseMag += magnitude * (1.f - x60_impulseRemTime / ImpulseDurationTable[x20_impulseDurationIdx]); + } x60_impulseRemTime = ImpulseDurationTable[x20_impulseDurationIdx]; } } @@ -565,21 +567,25 @@ void CKnockBackController::SetAutoResetImpulse(bool b) { void CKnockBackController::Update(float dt, CStateManager& mgr, CPatterned& parent) { ApplyImpulse(dt, parent); x64_flinchRemTime -= dt; - if (TickDeferredTimer(dt)) + if (TickDeferredTimer(dt)) { DoDeferredKnockBack(mgr, parent); - if (x82_26_locomotionDuringElectrocution && parent.GetBodyController()->IsElectrocuting()) + } + if (x82_26_locomotionDuringElectrocution && parent.GetBodyController()->IsElectrocuting()) { parent.GetBodyController()->GetCommandMgr().DeliverCmd(CBodyStateCmd(EBodyStateCmd::Locomotion)); + } } EKnockBackWeaponType CKnockBackController::GetKnockBackWeaponType(const CDamageInfo& info, EWeaponType wType, EKnockBackType type) { int stacking = 0; - if (info.GetWeaponMode().IsCharged()) + if (info.GetWeaponMode().IsCharged()) { stacking = 1; - else if (info.GetWeaponMode().IsComboed()) + } else if (info.GetWeaponMode().IsComboed()) { stacking = 2; - if (wType > EWeaponType::Phazon) + } + if (wType > EWeaponType::Phazon) { return EKnockBackWeaponType::Invalid; + } switch (wType) { case EWeaponType::Power: return EKnockBackWeaponType(type != EKnockBackType::Direct ? stacking : stacking + 1); @@ -604,6 +610,8 @@ EKnockBackWeaponType CKnockBackController::GetKnockBackWeaponType(const CDamageI void CKnockBackController::SelectDamageState(CPatterned& parent, const CDamageInfo& info, EWeaponType wType, EKnockBackType type) { + + x4_activeParms = KnockBackParms(); EKnockBackWeaponType weaponType = GetKnockBackWeaponType(info, wType, type); if (weaponType != EKnockBackWeaponType::Invalid) { x4_activeParms = @@ -616,8 +624,9 @@ void CKnockBackController::KnockBack(const zeus::CVector3f& backVec, CStateManag const CDamageInfo& info, EKnockBackType type, float magnitude) { if (!x82_25_inDeferredKnockBack) { zeus::CVector3f vec(backVec.toVec2f()); - if (!vec.isMagnitudeSafe()) + if (!vec.isMagnitudeSafe()) { vec = -parent.GetTransform().basis[1]; + } SelectDamageState(parent, info, info.GetWeaponMode().GetType(), type); DoKnockBackAnimation(vec, mgr, parent, magnitude); ResetKnockBackImpulse(parent, vec, 2.f); diff --git a/Runtime/World/CPatterned.cpp b/Runtime/World/CPatterned.cpp index 85cf907ce..3d68c7058 100644 --- a/Runtime/World/CPatterned.cpp +++ b/Runtime/World/CPatterned.cpp @@ -497,10 +497,11 @@ void CPatterned::Death(CStateManager& mgr, const zeus::CVector3f& dir, EScriptOb void CPatterned::KnockBack(const zeus::CVector3f& backVec, CStateManager& mgr, const CDamageInfo& info, EKnockBackType type, bool inDeferred, float magnitude) { CHealthInfo* hInfo = HealthInfo(mgr); - if (!x401_27_phazingOut && !x401_28_burning && hInfo) { + if (!x401_27_phazingOut && !x401_28_burning && hInfo != nullptr) { x460_knockBackController.KnockBack(backVec, mgr, *this, info, type, magnitude); - if (x450_bodyController->IsFrozen() && x460_knockBackController.GetActiveParms().xc_intoFreezeDur >= 0.f) + if (x450_bodyController->IsFrozen() && x460_knockBackController.GetActiveParms().xc_intoFreezeDur >= 0.f) { x450_bodyController->FrozenBreakout(); + } switch (x460_knockBackController.GetActiveParms().x4_animFollowup) { case EKnockBackAnimationFollowUp::Freeze: Freeze(mgr, zeus::skZero3f, zeus::CUnitVector3f(x34_transform.transposeRotate(backVec)), @@ -545,10 +546,11 @@ void CPatterned::KnockBack(const zeus::CVector3f& backVec, CStateManager& mgr, c break; case EKnockBackAnimationFollowUp::IceDeath: Death(mgr, zeus::skZero3f, EScriptObjectState::DeathRattle); - if (x54c_iceDeathExplosionParticle) + if (x54c_iceDeathExplosionParticle) { MassiveFrozenDeath(mgr); - else if (x450_bodyController->IsFrozen()) + } else if (x450_bodyController->IsFrozen()) { x450_bodyController->FrozenBreakout(); + } break; default: break; diff --git a/Runtime/World/CWallCrawlerSwarm.cpp b/Runtime/World/CWallCrawlerSwarm.cpp index ef29f96e7..4bcecc687 100644 --- a/Runtime/World/CWallCrawlerSwarm.cpp +++ b/Runtime/World/CWallCrawlerSwarm.cpp @@ -835,7 +835,7 @@ void CWallCrawlerSwarm::Think(float dt, CStateManager& mgr) { const zeus::CAABox aabb = BoxForPosition(r26, r27, r20, x374_boidRadius + 0.5f); CAreaCollisionCache ccache(aabb); CGameCollision::BuildAreaCollisionCache(mgr, ccache); - while (boid) { + while (boid != nullptr) { r21 += 1; if (boid->GetActive()) { if (x558_flavor == EFlavor::Scarab) { @@ -1235,5 +1235,15 @@ zeus::CVector3f CWallCrawlerSwarm::GetAimPosition(const CStateManager&, float dt return x108_boids[x42c_lockOnIdx].x30_velocity * dt + x124_lastOrbitPosition; } +void CWallCrawlerSwarm::ApplyRadiusDamage(const zeus::CVector3f& pos, const CDamageInfo& info, CStateManager& stateMgr) { + for (CBoid& boid : x108_boids) { + if (boid.GetActive() && (boid.GetTranslation() - pos).magSquared() < info.GetRadius() * info.GetRadius()) { + boid.x78_health -= info.GetRadiusDamage(); + if (boid.x78_health <= 0.f) { + KillBoid(boid, stateMgr, 1.f, 0.1f); + } + } + } +} } // namespace urde diff --git a/Runtime/World/CWallCrawlerSwarm.hpp b/Runtime/World/CWallCrawlerSwarm.hpp index 88381b209..a990538c7 100644 --- a/Runtime/World/CWallCrawlerSwarm.hpp +++ b/Runtime/World/CWallCrawlerSwarm.hpp @@ -205,7 +205,7 @@ public: zeus::CVector3f GetOrbitPosition(const CStateManager&) const override; zeus::CVector3f GetAimPosition(const CStateManager&, float) const override; const zeus::CVector3f& GetLastKilledOffset() const { return x130_lastKilledOffset; } - void ApplyRadiusDamage(const zeus::CVector3f& pos, const CDamageInfo& info, CStateManager& stateMgr) {} + void ApplyRadiusDamage(const zeus::CVector3f& pos, const CDamageInfo& info, CStateManager& stateMgr); const std::vector& GetBoids() const { return x108_boids; } int GetCurrentLockOnId() const { return x42c_lockOnIdx; } bool GetLockOnLocationValid(int id) const { return id >= 0 && id < x108_boids.size() && x108_boids[id].GetActive(); } From c64e3d2ba79fec62a61815ae0332e2fba15e3e85 Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Wed, 15 Apr 2020 23:57:04 -0700 Subject: [PATCH 187/224] Initial string fixes --- Runtime/CGameOptions.cpp | 42 +++++++++++++++++++++++++++++++- Runtime/CGameOptions.hpp | 1 + Runtime/CPlayerState.cpp | 2 +- Runtime/MP1/CInventoryScreen.cpp | 32 ++++++++++++++++++------ Runtime/MP1/CLogBookScreen.cpp | 5 +++- Runtime/MP1/COptionsScreen.cpp | 36 +++++++++++++++++---------- Runtime/MP1/CPauseScreenBase.cpp | 3 ++- Runtime/MP1/MP1.cpp | 15 ++++++------ 8 files changed, 104 insertions(+), 32 deletions(-) diff --git a/Runtime/CGameOptions.cpp b/Runtime/CGameOptions.cpp index 42336b3a2..7ddddc858 100644 --- a/Runtime/CGameOptions.cpp +++ b/Runtime/CGameOptions.cpp @@ -49,6 +49,37 @@ constexpr std::array ControllerOpts{{ {EGameOption::RestoreDefaults, 35, 0.f, 1.f, 1.f, EOptionType::RestoreDefaults}, }}; +constexpr std::array VisorOptsNew{{ + {EGameOption::VisorOpacity, 23, 0.f, 255.f, 1.f, EOptionType::Float}, + {EGameOption::HelmetOpacity, 24, 0.f, 255.f, 1.f, EOptionType::Float}, + {EGameOption::HUDLag, 25, 0.f, 1.f, 1.f, EOptionType::DoubleEnum}, + {EGameOption::HintSystem, 26, 0.f, 1.f, 1.f, EOptionType::DoubleEnum}, + {EGameOption::RestoreDefaults, 38, 0.f, 1.f, 1.f, EOptionType::RestoreDefaults}, + }}; + +constexpr std::array DisplayOptsNew{{ + //{EGameOption::ScreenBrightness, 25, 0.f, 8.f, 1.f, EOptionType::Float}, + {EGameOption::ScreenBrightness, 28, -100.f, 100.f, 1.f, EOptionType::Float}, + {EGameOption::ScreenOffsetX, 29, -30.f, 30.f, 1.f, EOptionType::Float}, + {EGameOption::ScreenOffsetY, 30, -30.f, 30.f, 1.f, EOptionType::Float}, + {EGameOption::ScreenStretch, 31, -10.f, 10.f, 1.f, EOptionType::Float}, + {EGameOption::RestoreDefaults, 38, 0.f, 1.f, 1.f, EOptionType::RestoreDefaults}, +}}; + +constexpr std::array SoundOptsNew{{ + {EGameOption::SFXVolume, 32, 0.f, 127.f, 1.f, EOptionType::Float}, + {EGameOption::MusicVolume, 33, 0.f, 127.f, 1.f, EOptionType::Float}, + {EGameOption::SoundMode, 34, 0.f, 1.f, 1.f, EOptionType::TripleEnum}, + {EGameOption::RestoreDefaults, 38, 0.f, 1.f, 1.f, EOptionType::RestoreDefaults}, +}}; + +constexpr std::array ControllerOptsNew{{ + {EGameOption::ReverseYAxis, 35, 0.f, 1.f, 1.f, EOptionType::DoubleEnum}, + {EGameOption::Rumble, 37, 0.f, 1.f, 1.f, EOptionType::DoubleEnum}, + {EGameOption::SwapBeamControls, 37, 0.f, 1.f, 1.f, EOptionType::DoubleEnum}, + {EGameOption::RestoreDefaults, 38, 0.f, 1.f, 1.f, EOptionType::RestoreDefaults}, +}}; + constexpr std::array, 5> GameOptionsRegistry{{ {VisorOpts.size(), VisorOpts.data()}, {DisplayOpts.size(), DisplayOpts.data()}, @@ -57,6 +88,14 @@ constexpr std::array, 5> GameOptionsRegist {0, nullptr}, }}; +constexpr std::array, 5> GameOptionsRegistryNew{{ + {VisorOptsNew.size(), VisorOptsNew.data()}, + {DisplayOptsNew.size(), DisplayOptsNew.data()}, + {SoundOptsNew.size(), SoundOptsNew.data()}, + {ControllerOptsNew.size(), ControllerOptsNew.data()}, + {0, nullptr}, +}}; + CPersistentOptions::CPersistentOptions(CBitStreamReader& stream) { for (u8& entry : x0_nesState) { entry = stream.ReadEncoded(8); @@ -229,7 +268,8 @@ CGameOptions::CGameOptions() float CGameOptions::TuneScreenBrightness() { return (0.375f * 1.f) + (float(x48_screenBrightness) * 0.25f); } -void CGameOptions::InitSoundMode() { /* If system is mono, force x44 to mono, otherwise honor user preference */ } +void CGameOptions::InitSoundMode() { /* If system is mono, force x44 to mono, otherwise honor user preference */ +} static float BrightnessCopyFilter = 0.f; void CGameOptions::SetScreenBrightness(s32 val, bool apply) { x48_screenBrightness = zeus::clamp(0, val, 8); diff --git a/Runtime/CGameOptions.hpp b/Runtime/CGameOptions.hpp index 01513df55..fc4e7bdb5 100644 --- a/Runtime/CGameOptions.hpp +++ b/Runtime/CGameOptions.hpp @@ -44,6 +44,7 @@ struct SGameOption { /** Static registry of Option UI presentation information */ extern const std::array, 5> GameOptionsRegistry; +extern const std::array, 5> GameOptionsRegistryNew; /** Options tracked persistently between game sessions */ class CPersistentOptions { diff --git a/Runtime/CPlayerState.cpp b/Runtime/CPlayerState.cpp index 210a7f4e0..94c9ac314 100644 --- a/Runtime/CPlayerState.cpp +++ b/Runtime/CPlayerState.cpp @@ -104,7 +104,7 @@ CPlayerState::CPlayerState(CBitStreamReader& stream) const auto& scanStates = g_MemoryCardSys->GetScanStates(); x170_scanTimes.reserve(scanStates.size()); for (const auto& state : scanStates) { - float time = stream.ReadEncoded(1) ? 1.f : 0.f; + float time = stream.ReadEncoded(1) ? 1.f : 1.f; x170_scanTimes.emplace_back(state.first, time); } diff --git a/Runtime/MP1/CInventoryScreen.cpp b/Runtime/MP1/CInventoryScreen.cpp index cddddfa89..55bc9e012 100644 --- a/Runtime/MP1/CInventoryScreen.cpp +++ b/Runtime/MP1/CInventoryScreen.cpp @@ -7,6 +7,7 @@ #include "Runtime/GuiSys/CGuiTableGroup.hpp" #include "Runtime/GuiSys/CGuiTextPane.hpp" #include "Runtime/Input/ControlMapper.hpp" +#include "Runtime/IMain.hpp" namespace urde::MP1 { namespace { @@ -285,14 +286,22 @@ bool CInventoryScreen::HasLeftInventoryItem(int idx) const { void CInventoryScreen::VActivate() { for (int i = 0; i < 5; ++i) { if (HasLeftInventoryItem(i)) { - xa8_textpane_categories[i]->TextSupport().SetText(xc_pauseStrg.GetString(i + 10)); + if (g_Main->IsUSA()) { + xa8_textpane_categories[i]->TextSupport().SetText(xc_pauseStrg.GetString(i + 10)); + } else { + xa8_textpane_categories[i]->TextSupport().SetText(xc_pauseStrg.GetString(i + 12)); + } } else { xa8_textpane_categories[i]->TextSupport().SetText(u"??????"); x70_tablegroup_leftlog->GetWorkerWidget(i)->SetIsSelectable(false); } } - x178_textpane_title->TextSupport().SetText(xc_pauseStrg.GetString(9)); + if (g_Main->IsUSA()) { + x178_textpane_title->TextSupport().SetText(xc_pauseStrg.GetString(9)); + } else { + x178_textpane_title->TextSupport().SetText(xc_pauseStrg.GetString(11)); + } x180_basewidget_yicon->SetVisibility(true, ETraversalMode::Children); } @@ -302,15 +311,22 @@ void CInventoryScreen::UpdateTextBody() { x1ac_textLeaveRequested = false; const SInventoryItem& sel = InventoryRegistry[x70_tablegroup_leftlog->GetUserSelection()].second[x1c_rightSel]; - std::u16string entryText = xc_pauseStrg.GetString(sel.entryStrIdx); + std::u16string entryText = xc_pauseStrg.GetString(g_Main->IsUSA() ? sel.entryStrIdx : sel.entryStrIdx + 3); if (sel.idx == 23) // Beam combo { CPlayerState& playerState = *x4_mgr.GetPlayerState(); - entryText += xc_pauseStrg.GetString(playerState.HasPowerUp(CPlayerState::EItemType::SuperMissile) ? 71 : 65); - entryText += xc_pauseStrg.GetString(playerState.HasPowerUp(CPlayerState::EItemType::IceSpreader) ? 73 : 65); - entryText += xc_pauseStrg.GetString(playerState.HasPowerUp(CPlayerState::EItemType::Wavebuster) ? 75 : 65); - entryText += xc_pauseStrg.GetString(playerState.HasPowerUp(CPlayerState::EItemType::Flamethrower) ? 77 : 65); + if (g_Main->IsUSA()) { + entryText += xc_pauseStrg.GetString(playerState.HasPowerUp(CPlayerState::EItemType::SuperMissile) ? 71 : 65); + entryText += xc_pauseStrg.GetString(playerState.HasPowerUp(CPlayerState::EItemType::IceSpreader) ? 73 : 65); + entryText += xc_pauseStrg.GetString(playerState.HasPowerUp(CPlayerState::EItemType::Wavebuster) ? 75 : 65); + entryText += xc_pauseStrg.GetString(playerState.HasPowerUp(CPlayerState::EItemType::Flamethrower) ? 77 : 65); + } else { + entryText += xc_pauseStrg.GetString(playerState.HasPowerUp(CPlayerState::EItemType::SuperMissile) ? 73 : 68); + entryText += xc_pauseStrg.GetString(playerState.HasPowerUp(CPlayerState::EItemType::IceSpreader) ? 75 : 68); + entryText += xc_pauseStrg.GetString(playerState.HasPowerUp(CPlayerState::EItemType::Wavebuster) ? 78 : 68); + entryText += xc_pauseStrg.GetString(playerState.HasPowerUp(CPlayerState::EItemType::Flamethrower) ? 79 : 68); + } } x174_textpane_body->TextSupport().SetText(entryText, true); @@ -451,7 +467,7 @@ void CInventoryScreen::UpdateRightTable() { CGuiTextPane* title = xd8_textpane_titles[i]; if (i < int(size)) { if (HasRightInventoryItem(data[i].idx)) { - title->TextSupport().SetText(xc_pauseStrg.GetString(data[i].nameStrIdx)); + title->TextSupport().SetText(xc_pauseStrg.GetString(g_Main->IsUSA() ? data[i].nameStrIdx : data[i].nameStrIdx + 3)); x84_tablegroup_rightlog->GetWorkerWidget(i + 1)->SetIsSelectable(true); if (i < minSel) minSel = i; diff --git a/Runtime/MP1/CLogBookScreen.cpp b/Runtime/MP1/CLogBookScreen.cpp index 7439b7cf4..b4f0e5549 100644 --- a/Runtime/MP1/CLogBookScreen.cpp +++ b/Runtime/MP1/CLogBookScreen.cpp @@ -200,7 +200,10 @@ void CLogBookScreen::UpdateBodyText() { if (IsArtifactCategorySelected()) { const int headIdx = GetSelectedArtifactHeadScanIndex(); if (headIdx >= 0 && g_GameState->GetPlayerState()->HasPowerUp(CPlayerState::EItemType(headIdx + 29))) { - accumStr = std::u16string(u"\n\n\n\n\n\n").append(g_MainStringTable->GetString(105)); + if (g_Main->IsUSA()) + accumStr = std::u16string(u"\n\n\n\n\n\n").append(g_MainStringTable->GetString(105)); + else + accumStr = std::u16string(u"\n\n\n\n\n\n").append(g_MainStringTable->GetString(107)); } } diff --git a/Runtime/MP1/COptionsScreen.cpp b/Runtime/MP1/COptionsScreen.cpp index 0bb91fe3f..442204ebf 100644 --- a/Runtime/MP1/COptionsScreen.cpp +++ b/Runtime/MP1/COptionsScreen.cpp @@ -1,5 +1,6 @@ #include "Runtime/MP1/COptionsScreen.hpp" +#include "Runtime/IMain.hpp" #include "Runtime/CArchitectureQueue.hpp" #include "Runtime/GuiSys/CGuiSliderGroup.hpp" #include "Runtime/GuiSys/CGuiTableGroup.hpp" @@ -154,8 +155,8 @@ void COptionsScreen::ProcessControllerInput(const CFinalInput& input) { CPauseScreenBase::ProcessControllerInput(input); CGameOptions::TryRestoreDefaults(input, x70_tablegroup_leftlog->GetUserSelection(), x1c_rightSel, false, rightClicked); - if (x70_tablegroup_leftlog->GetUserSelection() == 4 && (input.PA() || leftClicked || - input.PSpecialKey(boo::ESpecialKey::Enter))) + if (x70_tablegroup_leftlog->GetUserSelection() == 4 && + (input.PA() || leftClicked || input.PSpecialKey(boo::ESpecialKey::Enter))) x19c_quitGame = std::make_unique(EQuitType::QuitGame); } else { CPauseScreenBase::ResetMouseState(); @@ -177,10 +178,15 @@ void COptionsScreen::Draw(float transInterp, float totalAlpha, float yOff) { bool COptionsScreen::VReady() const { return true; } void COptionsScreen::VActivate() { - for (int i = 0; i < 5; ++i) - xa8_textpane_categories[i]->TextSupport().SetText(xc_pauseStrg.GetString(i + 16)); + for (int i = 0; i < 5; ++i) { + if (g_Main->IsUSA()) { + xa8_textpane_categories[i]->TextSupport().SetText(xc_pauseStrg.GetString(i + 16)); + } else { + xa8_textpane_categories[i]->TextSupport().SetText(xc_pauseStrg.GetString(i + 18)); + } + } - x178_textpane_title->TextSupport().SetText(xc_pauseStrg.GetString(15)); + x178_textpane_title->TextSupport().SetText(xc_pauseStrg.GetString(g_Main->IsUSA() ? 15 : 17)); #if 0 for (int i=5 ; i<5 ; ++i) @@ -190,22 +196,23 @@ void COptionsScreen::VActivate() { x174_textpane_body->TextSupport().SetJustification(EJustification::Center); x174_textpane_body->TextSupport().SetVerticalJustification(EVerticalJustification::Bottom); + int stringOffset = g_Main->IsUSA() ? 0 : 3; static_cast(x190_tablegroup_double->GetWorkerWidget(0)) ->TextSupport() - .SetText(xc_pauseStrg.GetString(95)); + .SetText(xc_pauseStrg.GetString(95 + stringOffset)); static_cast(x190_tablegroup_double->GetWorkerWidget(1)) ->TextSupport() - .SetText(xc_pauseStrg.GetString(94)); + .SetText(xc_pauseStrg.GetString(94 + stringOffset)); static_cast(x194_tablegroup_triple->GetWorkerWidget(0)) ->TextSupport() - .SetText(xc_pauseStrg.GetString(96)); + .SetText(xc_pauseStrg.GetString(96 + stringOffset)); static_cast(x194_tablegroup_triple->GetWorkerWidget(1)) ->TextSupport() - .SetText(xc_pauseStrg.GetString(97)); + .SetText(xc_pauseStrg.GetString(97 + stringOffset)); static_cast(x194_tablegroup_triple->GetWorkerWidget(2)) ->TextSupport() - .SetText(xc_pauseStrg.GetString(98)); + .SetText(xc_pauseStrg.GetString(98 + stringOffset)); x18c_slidergroup_slider->SetSelectionChangedCallback( [this](CGuiSliderGroup* caller, float value) { OnSliderChanged(caller, value); }); @@ -229,12 +236,15 @@ void COptionsScreen::ChangedMode(EMode oldMode) { void COptionsScreen::UpdateRightTable() { CPauseScreenBase::UpdateRightTable(); - const std::pair& category = GameOptionsRegistry[x70_tablegroup_leftlog->GetUserSelection()]; + const std::pair& category = + g_Main->IsUSA() ? GameOptionsRegistry[x70_tablegroup_leftlog->GetUserSelection()] + : GameOptionsRegistryNew[x70_tablegroup_leftlog->GetUserSelection()]; for (int i = 0; i < 5; ++i) { - if (i < category.first) + if (i < category.first) { xd8_textpane_titles[i]->TextSupport().SetText(xc_pauseStrg.GetString(category.second[i].stringId)); - else + } else { xd8_textpane_titles[i]->TextSupport().SetText(u""); + } } } diff --git a/Runtime/MP1/CPauseScreenBase.cpp b/Runtime/MP1/CPauseScreenBase.cpp index d4b4d3b00..07712a349 100644 --- a/Runtime/MP1/CPauseScreenBase.cpp +++ b/Runtime/MP1/CPauseScreenBase.cpp @@ -13,6 +13,7 @@ #include "Runtime/GuiSys/CGuiTextPane.hpp" #include "Runtime/GuiSys/CGuiWidgetDrawParms.hpp" #include "Runtime/GuiSys/CStringTable.hpp" +#include "Runtime/IMain.hpp" namespace urde::MP1 { @@ -80,7 +81,7 @@ void CPauseScreenBase::InitializeFrameGlue() { x184_textpane_yicon = static_cast(x8_frame.FindWidget("textpane_yicon")); x188_textpane_ytext = static_cast(x8_frame.FindWidget("textpane_ytext")); x184_textpane_yicon->TextSupport().SetText(fmt::format(FMT_STRING(u"&image={};"), g_tweakPlayerRes->xbc_yButton[0])); - x188_textpane_ytext->TextSupport().SetText(xc_pauseStrg.GetString(99)); + x188_textpane_ytext->TextSupport().SetText(xc_pauseStrg.GetString(g_Main->IsUSA() ? 99 : 102)); x188_textpane_ytext->SetColor(g_tweakGuiColors->GetPauseItemAmberColor()); x18c_slidergroup_slider = static_cast(x8_frame.FindWidget("slidergroup_slider")); x18c_slidergroup_slider->SetMouseActive(true); diff --git a/Runtime/MP1/MP1.cpp b/Runtime/MP1/MP1.cpp index 16f8d8f6a..665e0a099 100644 --- a/Runtime/MP1/MP1.cpp +++ b/Runtime/MP1/MP1.cpp @@ -769,13 +769,6 @@ void CMain::Init(const hecl::Runtime::FileStoreManager& storeMgr, hecl::CVarMana [this](hecl::Console* console, const std::vector& args) { Warp(console, args); }, hecl::SConsoleCommand::ECommandFlags::Normal); - InitializeSubsystems(); - AddOverridePaks(); - x128_globalObjects.PostInitialize(); - x70_tweaks.RegisterTweaks(m_cvarMgr); - x70_tweaks.RegisterResourceTweaks(m_cvarMgr); - AddWorldPaks(); - bool loadedVersion = false; if (CDvdFile::FileExists("version.yaml")) { CDvdFile file("version.yaml"); @@ -790,6 +783,14 @@ void CMain::Init(const hecl::Runtime::FileStoreManager& storeMgr, hecl::CVarMana } } } + + InitializeSubsystems(); + AddOverridePaks(); + x128_globalObjects.PostInitialize(); + x70_tweaks.RegisterTweaks(m_cvarMgr); + x70_tweaks.RegisterResourceTweaks(m_cvarMgr); + AddWorldPaks(); + if (loadedVersion) { if (GetGame() != EGame::MetroidPrime1) { MainLog.report(logvisor::Level::Fatal, From 8e2636c14cea2f1661ca9fcfa52a86b2ddcf451c Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Wed, 15 Apr 2020 23:58:00 -0700 Subject: [PATCH 188/224] Undo debug code --- Runtime/CPlayerState.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/CPlayerState.cpp b/Runtime/CPlayerState.cpp index 94c9ac314..210a7f4e0 100644 --- a/Runtime/CPlayerState.cpp +++ b/Runtime/CPlayerState.cpp @@ -104,7 +104,7 @@ CPlayerState::CPlayerState(CBitStreamReader& stream) const auto& scanStates = g_MemoryCardSys->GetScanStates(); x170_scanTimes.reserve(scanStates.size()); for (const auto& state : scanStates) { - float time = stream.ReadEncoded(1) ? 1.f : 1.f; + float time = stream.ReadEncoded(1) ? 1.f : 0.f; x170_scanTimes.emplace_back(state.first, time); } From 9365c350005339de0be46cd8beabf5a2eedc7418 Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Thu, 16 Apr 2020 03:25:59 -0700 Subject: [PATCH 189/224] Finish fixing STRG indices --- Runtime/MP1/CFrontEndUI.cpp | 294 ++++++++++++++++++------------- Runtime/MP1/CInventoryScreen.cpp | 10 +- Runtime/MP1/CLogBookScreen.cpp | 5 +- Runtime/MP1/COptionsScreen.cpp | 11 +- Runtime/MP1/CPauseScreenBase.cpp | 2 +- 5 files changed, 191 insertions(+), 131 deletions(-) diff --git a/Runtime/MP1/CFrontEndUI.cpp b/Runtime/MP1/CFrontEndUI.cpp index ae29e8072..c929bc757 100644 --- a/Runtime/MP1/CFrontEndUI.cpp +++ b/Runtime/MP1/CFrontEndUI.cpp @@ -134,10 +134,11 @@ void CFrontEndUI::SNewFileSelectFrame::FinishedLoading() { x40_tablegroup_popup = static_cast(x1c_loadedFrame->FindWidget("tablegroup_popup")); x44_model_dash7 = static_cast(x1c_loadedFrame->FindWidget("model_dash7")); x60_textpane_cancel = static_cast(x1c_loadedFrame->FindWidget("textpane_cancel")); - FindAndSetPairText(x1c_loadedFrame, "textpane_title", g_MainStringTable->GetString(97)); + FindAndSetPairText(x1c_loadedFrame, "textpane_title", + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 97 : 92)); CGuiTextPane* proceed = static_cast(x1c_loadedFrame->FindWidget("textpane_proceed")); if (proceed) - proceed->TextSupport().SetText(g_MainStringTable->GetString(85)); + proceed->TextSupport().SetText(g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 85 : 79)); x40_tablegroup_popup->SetIsVisible(false); x40_tablegroup_popup->SetIsActive(false); x40_tablegroup_popup->SetVertical(false); @@ -307,7 +308,8 @@ void CFrontEndUI::SNewFileSelectFrame::HandleActiveChange(CGuiTableGroup* active tbDetails[i].percent = data->x18_itemPercent; } } - m_touchBar.SetFileSelectPhase(tbDetails.data(), x8_subMenu == ESubMenu::EraseGame, CSlideShow::SlideShowGalleryFlags()); + m_touchBar.SetFileSelectPhase(tbDetails.data(), x8_subMenu == ESubMenu::EraseGame, + CSlideShow::SlideShowGalleryFlags()); } else if (active == x40_tablegroup_popup) { if (x8_subMenu == ESubMenu::EraseGamePopup) m_touchBar.SetPhase(CFrontEndUITouchBar::EPhase::EraseBack); @@ -344,8 +346,10 @@ void CFrontEndUI::SNewFileSelectFrame::ActivateEraseGamePopup() { x8_subMenu = ESubMenu::EraseGamePopup; HandleActiveChange(x40_tablegroup_popup); - x48_textpane_popupadvance.SetPairText(g_MainStringTable->GetString(95)); - x50_textpane_popupcancel.SetPairText(g_MainStringTable->GetString(38)); + x48_textpane_popupadvance.SetPairText( + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 95 : 89)); + x50_textpane_popupcancel.SetPairText( + g_MainStringTable->GetString(38)); // This string is unmodified in PAL/NTSCJ/Trilogy x64_fileSelections[x20_tablegroup_fileselect->GetUserSelection()].x0_base->SetColor(zeus::CColor{1.f, 1.f, 1.f, 0.f}); x44_model_dash7->SetVisibility(false, ETraversalMode::Children); @@ -384,19 +388,25 @@ void CFrontEndUI::SNewFileSelectFrame::ActivateNewGamePopup() { PlayAdvanceSfx(); if (g_GameState->SystemOptions().GetPlayerBeatNormalMode()) { - x48_textpane_popupadvance.SetPairText(g_MainStringTable->GetString(102)); - x50_textpane_popupcancel.SetPairText(g_MainStringTable->GetString(94)); - x58_textpane_popupextra.SetPairText(g_MainStringTable->GetString(101)); + x48_textpane_popupadvance.SetPairText( + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 102 : 96)); + x50_textpane_popupcancel.SetPairText( + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 94 : 88)); + x58_textpane_popupextra.SetPairText( + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 101 : 95)); CGuiWidget* worker = x40_tablegroup_popup->GetWorkerWidget(2); worker->SetIsSelectable(true); worker->SetVisibility(true, ETraversalMode::Children); x44_model_dash7->SetVisibility(true, ETraversalMode::Children); } else { - x48_textpane_popupadvance.SetPairText(g_MainStringTable->GetString(67)); - x50_textpane_popupcancel.SetPairText(g_MainStringTable->GetString(94)); + x48_textpane_popupadvance.SetPairText( + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 67 : 61)); + x50_textpane_popupcancel.SetPairText( + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 94 : 88)); x44_model_dash7->SetVisibility(false, ETraversalMode::Children); } - x60_textpane_cancel->TextSupport().SetText(g_MainStringTable->GetString(82)); + x60_textpane_cancel->TextSupport().SetText( + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 82 : 76)); } void CFrontEndUI::SNewFileSelectFrame::ResetFrame() { @@ -436,7 +446,8 @@ void CFrontEndUI::SNewFileSelectFrame::ActivateErase() { } } - x60_textpane_cancel->TextSupport().SetText(g_MainStringTable->GetString(82)); + x60_textpane_cancel->TextSupport().SetText( + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 82 : 76)); HandleActiveChange(x20_tablegroup_fileselect); } @@ -456,13 +467,19 @@ void CFrontEndUI::SNewFileSelectFrame::ClearFrameContents() { } } - StartTextAnimating(x28_textpane_erase.x0_panes[0], g_MainStringTable->GetString(38), 60.f); - StartTextAnimating(x38_textpane_gba.x0_panes[0], g_MainStringTable->GetString(37), 60.f); - StartTextAnimating(x30_textpane_cheats.x0_panes[0], g_MainStringTable->GetString(96), 60.f); + StartTextAnimating(x28_textpane_erase.x0_panes[0], g_MainStringTable->GetString(38), + 60.f); // This string is unmodified in PAL/NTSCJ/Trilogy + StartTextAnimating(x38_textpane_gba.x0_panes[0], g_MainStringTable->GetString(37), + 60.f); // This string is unmodified in PAL/NTSCJ/Trilogy + StartTextAnimating(x30_textpane_cheats.x0_panes[0], + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 96 : 90), 60.f); - StartTextAnimating(x28_textpane_erase.x0_panes[1], g_MainStringTable->GetString(38), 60.f); - StartTextAnimating(x38_textpane_gba.x0_panes[1], g_MainStringTable->GetString(37), 60.f); - StartTextAnimating(x30_textpane_cheats.x0_panes[1], g_MainStringTable->GetString(96), 60.f); + StartTextAnimating(x28_textpane_erase.x0_panes[1], g_MainStringTable->GetString(38), + 60.f); // This string is unmodified in PAL/NTSCJ/Trilogy + StartTextAnimating(x38_textpane_gba.x0_panes[1], g_MainStringTable->GetString(37), + 60.f); // This string is unmodified in PAL/NTSCJ/Trilogy + StartTextAnimating(x30_textpane_cheats.x0_panes[1], + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 96 : 90), 60.f); if (hasSave) { x28_textpane_erase.x0_panes[0]->SetIsSelectable(true); @@ -489,6 +506,27 @@ void CFrontEndUI::SNewFileSelectFrame::ClearFrameContents() { HandleActiveChange(x20_tablegroup_fileselect); } +std::u16string GetTimeString(const CGameState::GameFileStateInfo* data) { + if (data) { + auto pt = std::div(data->x0_playTime, 3600); +#if FE_USE_SECONDS_IN_ELAPSED + return fmt::format(FMT_STRING(u"{:02d}:{:02d}:{:02d}"), pt.quot, pt.rem / 60, pt.rem % 60); +#else + return fmt::format(FMT_STRING(u"{:02d}:{:02d}"), pt.quot, pt.rem / 60); +#endif + } + if (!g_Main->IsUSA() || g_Main->IsTrilogy()) + return g_MainStringTable->GetString(53); + return g_MainStringTable->GetString(52); +} + +std::u16string GetElapsedString(const CGameState::GameFileStateInfo* data) { + if (!g_Main->IsUSA() || g_Main->IsTrilogy()) + return g_MainStringTable->GetString(data ? 55 : 54); + + return std::u16string(g_MainStringTable->GetString(data ? 54 : 53)); +} + void CFrontEndUI::SNewFileSelectFrame::SetupFrameContents() { for (size_t i = 0; i < x64_fileSelections.size(); ++i) { SFileMenuOption& option = x64_fileSelections[i]; @@ -508,7 +546,11 @@ void CFrontEndUI::SNewFileSelectFrame::SetupFrameContents() { case 0: // Completion percent if (data) { - std::u16string fileStr = g_MainStringTable->GetString((data->x20_hardMode ? 106 : 39) + int(i)); + int strIdx = (data->x20_hardMode ? 106 : 39); + if ((!g_Main->IsUSA() || g_Main->IsTrilogy())) + strIdx = (strIdx == 106 ? 100 : 40); + + std::u16string fileStr = g_MainStringTable->GetString(strIdx + int(i)); str = fileStr + fmt::format(FMT_STRING(u" {:02d}%"), data->x18_itemPercent); break; } @@ -524,38 +566,38 @@ void CFrontEndUI::SNewFileSelectFrame::SetupFrameContents() { } break; } - str = g_MainStringTable->GetString(51); + str = g_MainStringTable->GetString(51 + int(!g_Main->IsUSA() || g_Main->IsTrilogy())); break; -#if FE_USE_SECONDS_IN_ELAPSED - case 2: - // Formatted time - if (data) { - auto pt = std::div(data->x0_playTime, 3600); - str = fmt::format(FMT_STRING(u"{:02d}:{:02d}:{:02d}"), pt.quot, pt.rem / 60, pt.rem % 60); - break; - } - str = g_MainStringTable->GetString(52); - break; - case 3: - // "Elapsed" - str = std::u16string(u" ") + std::u16string(g_MainStringTable->GetString(data ? 54 : 53)); - break; -#else case 2: - // Formatted time - if (data) { - auto pt = std::div(data->x0_playTime, 3600); - str = hecl::Char16Format(L"%02d:%02d", pt.quot, pt.rem / 60); - break; +#if FE_USE_SECONDS_IN_ELAPSED + if (!g_Main->IsUSA() || g_Main->IsTrilogy()) { + str = GetElapsedString(data); + } else { + str = GetTimeString(data); + } +#else + if (!g_Main->IsUSA() || g_Main->IsTrilogy()) { + str = GetElapsedString(data); + } else { + str = GetTimeString(data); } - str = g_MainStringTable->GetString(52); - break; - - case 3: - // "Elapsed" - str = g_MainStringTable->GetString(data ? 54 : 53); - break; #endif + break; + case 3: +#if FE_USE_SECONDS_IN_ELAPSED + if (!g_Main->IsUSA() || g_Main->IsTrilogy()) { + str = GetTimeString(data); + } else { + str = std::u16string(u" ") + GetElapsedString(data); + } +#else + if (!g_Main->IsUSA() || g_Main->IsTrilogy()) { + str = GetTimeString(data); + } else { + str = std::u16string(u" ") + GetElapsedString(data); + } +#endif + break; default: break; @@ -681,54 +723,54 @@ void CFrontEndUI::SFusionBonusFrame::SGBALinkFrame::SetUIText(EUIType tp) { switch (tp) { case EUIType::InsertPak: - instructions = 73; // Insert Game Pak - no = 82; - yes = 83; + instructions = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 73 : 67; // Insert Game Pak + no = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 82 : 76; + yes = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 83 : 77; pakoutVisible = true; circleGbaVisible = true; break; case EUIType::ConnectSocket: - instructions = 68; // Connect socket - no = 82; - yes = 83; + instructions = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 68 : 62; // Connect socket + no = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 82 : 76; + yes = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 83 : 77; cableVisible = true; circleGcVisible = true; circleGbaVisible = true; break; case EUIType::PressStartAndSelect: - instructions = 74; // Hold start and select - no = 82; - yes = 83; + instructions = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 74 : 68; // Hold start and select + no = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 82 : 76; + yes = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 83 : 77; cableVisible = true; circleStartVisible = true; gbaScreenVisible = true; break; case EUIType::BeginLink: - instructions = 75; // Begin link? - no = 82; - yes = 83; + instructions = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 75 : 69; // Begin link? + no = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 82 : 76; + yes = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 83 : 77; cableVisible = true; gbaScreenVisible = true; break; case EUIType::TurnOffGBA: - instructions = 76; // Turn off GBA - no = 82; - yes = 83; + instructions = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 76 : 70; // Turn off GBA + no = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 82 : 76; + yes = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 83 : 77; cableVisible = true; gbaScreenVisible = true; circleStartVisible = true; break; case EUIType::Linking: x4_gbaSupport->StartLink(); - instructions = 72; // Linking + instructions = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 72 : 66; // Linking cableVisible = true; gbaScreenVisible = true; connectVisible = true; break; case EUIType::LinkFailed: - instructions = 69; // Link failed - no = 82; - yes = 83; + instructions = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 69 : 63; // Link failed + no = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 82 : 76; + yes = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 83 : 77; cableVisible = true; circleGcVisible = true; circleGbaVisible = true; @@ -736,8 +778,8 @@ void CFrontEndUI::SFusionBonusFrame::SGBALinkFrame::SetUIText(EUIType tp) { gbaScreenVisible = true; break; case EUIType::LinkCompleteOrLinking: - yes = 83; - instructions = x40_linkInProgress + 71; // Complete or linking + yes = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 83 : 77; + instructions = x40_linkInProgress + (g_Main->IsUSA() && !g_Main->IsTrilogy() ? 71 : 65); // Complete or linking cableVisible = true; gbaScreenVisible = true; break; @@ -775,8 +817,9 @@ void CFrontEndUI::SFusionBonusFrame::SGBALinkFrame::SetUIText(EUIType tp) { x0_uiType = tp; } -CFrontEndUI::SFusionBonusFrame::SGBALinkFrame::EAction CFrontEndUI::SFusionBonusFrame::SGBALinkFrame::ProcessUserInput( - const CFinalInput& input, bool linkInProgress, CFrontEndUITouchBar::EAction tbAction) { +CFrontEndUI::SFusionBonusFrame::SGBALinkFrame::EAction +CFrontEndUI::SFusionBonusFrame::SGBALinkFrame::ProcessUserInput(const CFinalInput& input, bool linkInProgress, + CFrontEndUITouchBar::EAction tbAction) { if (linkInProgress != x40_linkInProgress) { x40_linkInProgress = linkInProgress; SetUIText(x0_uiType); @@ -790,9 +833,7 @@ CFrontEndUI::SFusionBonusFrame::SGBALinkFrame::EAction CFrontEndUI::SFusionBonus case EUIType::LinkFailed: case EUIType::LinkCompleteOrLinking: case EUIType::TurnOffGBA: - if (input.PA() || - input.PSpecialKey(boo::ESpecialKey::Enter) || - input.PMouseButton(boo::EMouseButton::Primary) || + if (input.PA() || input.PSpecialKey(boo::ESpecialKey::Enter) || input.PMouseButton(boo::EMouseButton::Primary) || tbAction == CFrontEndUITouchBar::EAction::Confirm) { PlayAdvanceSfx(); SetUIText(NextLinkUI[size_t(x0_uiType)]); @@ -874,18 +915,23 @@ void CFrontEndUI::SFusionBonusFrame::FinishedLoading() { x2c_tablegroup_fusionsuit = static_cast(x24_loadedFrame->FindWidget("tablegroup_fusionsuit")); x30_textpane_instructions = FindTextPanePair(x24_loadedFrame, "textpane_instructions"); - FindAndSetPairText(x24_loadedFrame, "textpane_nes", g_MainStringTable->GetString(66)); - FindAndSetPairText(x24_loadedFrame, "textpane_fusionsuit", g_MainStringTable->GetString(63)); - FindAndSetPairText(x24_loadedFrame, "textpane_fusionsuitno", g_MainStringTable->GetString(65)); - FindAndSetPairText(x24_loadedFrame, "textpane_fusionsuityes", g_MainStringTable->GetString(64)); - FindAndSetPairText(x24_loadedFrame, "textpane_title", g_MainStringTable->GetString(100)); + FindAndSetPairText(x24_loadedFrame, "textpane_nes", + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 66 : 60)); + FindAndSetPairText(x24_loadedFrame, "textpane_fusionsuit", + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 63 : 57)); + FindAndSetPairText(x24_loadedFrame, "textpane_fusionsuitno", + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 65 : 59)); + FindAndSetPairText(x24_loadedFrame, "textpane_fusionsuityes", + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 64 : 58)); + FindAndSetPairText(x24_loadedFrame, "textpane_title", + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 100 : 94)); static_cast(x24_loadedFrame->FindWidget("textpane_proceed")) ->TextSupport() - .SetText(g_MainStringTable->GetString(85)); + .SetText(g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 85 : 79)); static_cast(x24_loadedFrame->FindWidget("textpane_cancel")) ->TextSupport() - .SetText(g_MainStringTable->GetString(82)); + .SetText(g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 82 : 76)); x2c_tablegroup_fusionsuit->SetIsActive(false); x2c_tablegroup_fusionsuit->SetIsVisible(false); @@ -949,22 +995,27 @@ void CFrontEndUI::SFusionBonusFrame::Update(float dt, CSaveGameScreen* saveUI) { if (x28_tablegroup_options->GetUserSelection() == 1) { /* Fusion Suit */ if (x3a_mpNotComplete) - instructionStr = g_MainStringTable->GetString(80); // MP not complete + instructionStr = + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 80 : 74); // MP not complete else if (!showFusionSuit) - instructionStr = g_MainStringTable->GetString(78); // To enable fusion suit + instructionStr = + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 78 : 72); // To enable fusion suit } else { /* NES Metroid */ if (x39_fusionNotComplete) - instructionStr = g_MainStringTable->GetString(79); // You have not completed fusion + instructionStr = g_MainStringTable->GetString( + (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 79 : 73); // You have not completed fusion else if (!g_GameState->SystemOptions().GetPlayerBeatFusion()) - instructionStr = g_MainStringTable->GetString(77); // To play NES Metroid + instructionStr = + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 77 : 71); // To play NES Metroid } x30_textpane_instructions.SetPairText(instructionStr); } -CFrontEndUI::SFusionBonusFrame::EAction CFrontEndUI::SFusionBonusFrame::ProcessUserInput( - const CFinalInput& input, CSaveGameScreen* sui, CFrontEndUITouchBar::EAction tbAction) { +CFrontEndUI::SFusionBonusFrame::EAction +CFrontEndUI::SFusionBonusFrame::ProcessUserInput(const CFinalInput& input, CSaveGameScreen* sui, + CFrontEndUITouchBar::EAction tbAction) { x8_action = EAction::None; if (sui) @@ -1129,15 +1180,18 @@ void CFrontEndUI::SFrontEndFrame::FinishedLoading() { x1c_gbaPair = FindTextPanePair(x14_loadedFrme, "textpane_gba"); x1c_gbaPair.SetPairText(g_MainStringTable->GetString(37)); x24_cheatPair = FindTextPanePair(x14_loadedFrme, "textpane_cheats"); - x24_cheatPair.SetPairText(g_MainStringTable->GetString(96)); + x24_cheatPair.SetPairText(g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 96 : 90)); - FindAndSetPairText(x14_loadedFrme, "textpane_start", g_MainStringTable->GetString(67)); - FindAndSetPairText(x14_loadedFrme, "textpane_options", g_MainStringTable->GetString(94)); - FindAndSetPairText(x14_loadedFrme, "textpane_title", g_MainStringTable->GetString(98)); + FindAndSetPairText(x14_loadedFrme, "textpane_start", + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 67 : 61)); + FindAndSetPairText(x14_loadedFrme, "textpane_options", + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 94 : 88)); + FindAndSetPairText(x14_loadedFrme, "textpane_title", + g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 98 : 92)); CGuiTextPane* proceed = static_cast(x14_loadedFrme->FindWidget("textpane_proceed")); if (proceed) - proceed->TextSupport().SetText(g_MainStringTable->GetString(85)); + proceed->TextSupport().SetText(g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 85 : 79)); x18_tablegroup_mainmenu->SetMenuAdvanceCallback([this](CGuiTableGroup* caller) { DoAdvance(caller); }); x18_tablegroup_mainmenu->SetMenuSelectionChangeCallback( @@ -1220,7 +1274,8 @@ void CFrontEndUI::SFrontEndFrame::HandleActiveChange(CGuiTableGroup* active) { active->SetColors(zeus::skWhite, zeus::CColor{0.627450f, 0.627450f, 0.627450f, 0.784313f}); } -void CFrontEndUI::SFrontEndFrame::DoCancel(CGuiTableGroup* caller) { /* Intentionally empty */ } +void CFrontEndUI::SFrontEndFrame::DoCancel(CGuiTableGroup* caller) { /* Intentionally empty */ +} void CFrontEndUI::SFrontEndFrame::DoSelectionChange(CGuiTableGroup* caller, int oldSel) { CSfxManager::SfxStart(SFXfnt_selection_change, 1.f, 0.f, false, 0x7f, false, kInvalidAreaId); @@ -1260,9 +1315,8 @@ CFrontEndUI::SNesEmulatorFrame::SNesEmulatorFrame() { const SObjectTag* deface = g_ResFactory->GetResourceIdByName("FONT_Deface14B"); CGuiTextProperties props(false, true, EJustification::Left, EVerticalJustification::Center); - xc_textSupport = std::make_unique(deface->id, props, zeus::skWhite, zeus::skBlack, - zeus::skWhite, 0, 0, g_SimplePool, - CGuiWidget::EGuiModelDrawFlags::Alpha); + xc_textSupport = std::make_unique(deface->id, props, zeus::skWhite, zeus::skBlack, zeus::skWhite, 0, + 0, g_SimplePool, CGuiWidget::EGuiModelDrawFlags::Alpha); xc_textSupport->SetText(g_MainStringTable->GetString(103)); xc_textSupport->AutoSetExtent(); xc_textSupport->ClearRenderBuffer(); @@ -1529,7 +1583,8 @@ void CFrontEndUI::SOptionsFrontEndFrame::HandleRightSelectionChange() { void CFrontEndUI::SOptionsFrontEndFrame::SetRightUIText() { const int userSel = x24_tablegroup_leftmenu->GetUserSelection(); - const auto& options = GameOptionsRegistry[userSel]; + const auto& options = + (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? GameOptionsRegistry[userSel] : GameOptionsRegistryNew[userSel]; for (int i = 0; i < 5; ++i) { std::string name = fmt::format(FMT_STRING("textpane_right{}"), i); @@ -1578,24 +1633,31 @@ void CFrontEndUI::SOptionsFrontEndFrame::FinishedLoading() { x34_slidergroup_slider->SetSelectionChangedCallback( [this](CGuiSliderGroup* caller, float value) { DoSliderChange(caller, value); }); - FindTextPanePair(x1c_loadedFrame, "textpane_double0").SetPairText(x20_loadedPauseStrg->GetString(95)); // Off - FindTextPanePair(x1c_loadedFrame, "textpane_double1").SetPairText(x20_loadedPauseStrg->GetString(94)); // On - FindTextPanePair(x1c_loadedFrame, "textpane_triple0").SetPairText(x20_loadedPauseStrg->GetString(96)); // Mono - FindTextPanePair(x1c_loadedFrame, "textpane_triple1").SetPairText(x20_loadedPauseStrg->GetString(97)); // Stereo - FindTextPanePair(x1c_loadedFrame, "textpane_triple2").SetPairText(x20_loadedPauseStrg->GetString(98)); // Dolby + FindTextPanePair(x1c_loadedFrame, "textpane_double0") + .SetPairText(x20_loadedPauseStrg->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 95 : 98)); // Off + FindTextPanePair(x1c_loadedFrame, "textpane_double1") + .SetPairText(x20_loadedPauseStrg->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 94 : 97)); // On + FindTextPanePair(x1c_loadedFrame, "textpane_triple0") + .SetPairText(x20_loadedPauseStrg->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 96 : 99)); // Mono + FindTextPanePair(x1c_loadedFrame, "textpane_triple1") + .SetPairText(x20_loadedPauseStrg->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 97 : 100)); // Stereo + FindTextPanePair(x1c_loadedFrame, "textpane_triple2") + .SetPairText(x20_loadedPauseStrg->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 98 : 101)); // Dolby - FindTextPanePair(x1c_loadedFrame, "textpane_title").SetPairText(g_MainStringTable->GetString(99)); // OPTIONS + FindTextPanePair(x1c_loadedFrame, "textpane_title") + .SetPairText(g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 99 : 93)); // OPTIONS if (CGuiTextPane* proceed = static_cast(x1c_loadedFrame->FindWidget("textpane_proceed"))) - proceed->TextSupport().SetText(g_MainStringTable->GetString(85)); + proceed->TextSupport().SetText(g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 85 : 79)); if (CGuiTextPane* cancel = static_cast(x1c_loadedFrame->FindWidget("textpane_cancel"))) - cancel->TextSupport().SetText(g_MainStringTable->GetString(82)); + cancel->TextSupport().SetText(g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 82 : 76)); // Visor, Display, Sound, Controller for (int i = 0; i < 4; ++i) { const std::string name = fmt::format(FMT_STRING("textpane_filename{}"), i); - FindTextPanePair(x1c_loadedFrame, name).SetPairText(x20_loadedPauseStrg->GetString(16 + i)); + FindTextPanePair(x1c_loadedFrame, name) + .SetPairText(x20_loadedPauseStrg->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 16 : 18 + i)); } x2c_tablegroup_double->SetVertical(false); @@ -1766,7 +1828,9 @@ void CFrontEndUI::StartSlideShow(CArchitectureQueue& queue) { queue.Push(MakeMsg::CreateCreateIOWin(EArchMsgTarget::IOWinManager, 12, 11, std::make_shared())); } -std::string CFrontEndUI::GetAttractMovieFileName(int idx) { return fmt::format(FMT_STRING("Video/attract{}.thp"), idx); } +std::string CFrontEndUI::GetAttractMovieFileName(int idx) { + return fmt::format(FMT_STRING("Video/attract{}.thp"), idx); +} std::string CFrontEndUI::GetNextAttractMovieFileName() { std::string ret = GetAttractMovieFileName(xbc_nextAttract); @@ -2091,10 +2155,8 @@ void CFrontEndUI::ProcessUserInput(const CFinalInput& input, CArchitectureQueue& if (x50_curScreen != x54_nextScreen) { if (x54_nextScreen == EScreen::AttractMovie && - (input.PStart() || input.PA() || - input.PSpecialKey(boo::ESpecialKey::Esc) || - input.PSpecialKey(boo::ESpecialKey::Enter) || - input.PMouseButton(boo::EMouseButton::Primary) || + (input.PStart() || input.PA() || input.PSpecialKey(boo::ESpecialKey::Esc) || + input.PSpecialKey(boo::ESpecialKey::Enter) || input.PMouseButton(boo::EMouseButton::Primary) || touchBarAction == CFrontEndUITouchBar::EAction::Start)) { /* Player wants to return to opening credits from attract movie */ SetFadeBlackTimer(std::min(1.f, x58_fadeBlackTimer)); @@ -2102,10 +2164,8 @@ void CFrontEndUI::ProcessUserInput(const CFinalInput& input, CArchitectureQueue& return; } - if (input.PA() || input.PStart() || - input.PSpecialKey(boo::ESpecialKey::Esc) || - input.PSpecialKey(boo::ESpecialKey::Enter) || - input.PMouseButton(boo::EMouseButton::Primary) || + if (input.PA() || input.PStart() || input.PSpecialKey(boo::ESpecialKey::Esc) || + input.PSpecialKey(boo::ESpecialKey::Enter) || input.PMouseButton(boo::EMouseButton::Primary) || touchBarAction == CFrontEndUITouchBar::EAction::Start) { if (x50_curScreen == EScreen::OpenCredits && x54_nextScreen == EScreen::Title && x58_fadeBlackTimer > 1.f) { /* Player is too impatient to view opening credits */ @@ -2116,10 +2176,8 @@ void CFrontEndUI::ProcessUserInput(const CFinalInput& input, CArchitectureQueue& } } else { if (x50_curScreen == EScreen::Title) { - if (input.PStart() || input.PA() || - input.PSpecialKey(boo::ESpecialKey::Esc) || - input.PSpecialKey(boo::ESpecialKey::Enter) || - input.PMouseButton(boo::EMouseButton::Primary) || + if (input.PStart() || input.PA() || input.PSpecialKey(boo::ESpecialKey::Esc) || + input.PSpecialKey(boo::ESpecialKey::Enter) || input.PMouseButton(boo::EMouseButton::Primary) || touchBarAction == CFrontEndUITouchBar::EAction::Start) { if (x58_fadeBlackTimer < 30.f - g_tweakGame->GetPressStartDelay()) { /* Proceed to file select UI */ diff --git a/Runtime/MP1/CInventoryScreen.cpp b/Runtime/MP1/CInventoryScreen.cpp index 55bc9e012..47082ad3c 100644 --- a/Runtime/MP1/CInventoryScreen.cpp +++ b/Runtime/MP1/CInventoryScreen.cpp @@ -286,7 +286,7 @@ bool CInventoryScreen::HasLeftInventoryItem(int idx) const { void CInventoryScreen::VActivate() { for (int i = 0; i < 5; ++i) { if (HasLeftInventoryItem(i)) { - if (g_Main->IsUSA()) { + if (g_Main->IsUSA() && !g_Main->IsTrilogy()) { xa8_textpane_categories[i]->TextSupport().SetText(xc_pauseStrg.GetString(i + 10)); } else { xa8_textpane_categories[i]->TextSupport().SetText(xc_pauseStrg.GetString(i + 12)); @@ -297,7 +297,7 @@ void CInventoryScreen::VActivate() { } } - if (g_Main->IsUSA()) { + if (g_Main->IsUSA() && !g_Main->IsTrilogy()) { x178_textpane_title->TextSupport().SetText(xc_pauseStrg.GetString(9)); } else { x178_textpane_title->TextSupport().SetText(xc_pauseStrg.GetString(11)); @@ -311,12 +311,12 @@ void CInventoryScreen::UpdateTextBody() { x1ac_textLeaveRequested = false; const SInventoryItem& sel = InventoryRegistry[x70_tablegroup_leftlog->GetUserSelection()].second[x1c_rightSel]; - std::u16string entryText = xc_pauseStrg.GetString(g_Main->IsUSA() ? sel.entryStrIdx : sel.entryStrIdx + 3); + std::u16string entryText = xc_pauseStrg.GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? sel.entryStrIdx : sel.entryStrIdx + 3); if (sel.idx == 23) // Beam combo { CPlayerState& playerState = *x4_mgr.GetPlayerState(); - if (g_Main->IsUSA()) { + if (g_Main->IsUSA() && !g_Main->IsTrilogy()) { entryText += xc_pauseStrg.GetString(playerState.HasPowerUp(CPlayerState::EItemType::SuperMissile) ? 71 : 65); entryText += xc_pauseStrg.GetString(playerState.HasPowerUp(CPlayerState::EItemType::IceSpreader) ? 73 : 65); entryText += xc_pauseStrg.GetString(playerState.HasPowerUp(CPlayerState::EItemType::Wavebuster) ? 75 : 65); @@ -467,7 +467,7 @@ void CInventoryScreen::UpdateRightTable() { CGuiTextPane* title = xd8_textpane_titles[i]; if (i < int(size)) { if (HasRightInventoryItem(data[i].idx)) { - title->TextSupport().SetText(xc_pauseStrg.GetString(g_Main->IsUSA() ? data[i].nameStrIdx : data[i].nameStrIdx + 3)); + title->TextSupport().SetText(xc_pauseStrg.GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? data[i].nameStrIdx : data[i].nameStrIdx + 3)); x84_tablegroup_rightlog->GetWorkerWidget(i + 1)->SetIsSelectable(true); if (i < minSel) minSel = i; diff --git a/Runtime/MP1/CLogBookScreen.cpp b/Runtime/MP1/CLogBookScreen.cpp index b4f0e5549..f469b1722 100644 --- a/Runtime/MP1/CLogBookScreen.cpp +++ b/Runtime/MP1/CLogBookScreen.cpp @@ -200,10 +200,11 @@ void CLogBookScreen::UpdateBodyText() { if (IsArtifactCategorySelected()) { const int headIdx = GetSelectedArtifactHeadScanIndex(); if (headIdx >= 0 && g_GameState->GetPlayerState()->HasPowerUp(CPlayerState::EItemType(headIdx + 29))) { - if (g_Main->IsUSA()) + if (g_Main->IsUSA() && !g_Main->IsTrilogy()) { accumStr = std::u16string(u"\n\n\n\n\n\n").append(g_MainStringTable->GetString(105)); - else + } else { accumStr = std::u16string(u"\n\n\n\n\n\n").append(g_MainStringTable->GetString(107)); + } } } diff --git a/Runtime/MP1/COptionsScreen.cpp b/Runtime/MP1/COptionsScreen.cpp index 442204ebf..ae175de5f 100644 --- a/Runtime/MP1/COptionsScreen.cpp +++ b/Runtime/MP1/COptionsScreen.cpp @@ -179,14 +179,15 @@ bool COptionsScreen::VReady() const { return true; } void COptionsScreen::VActivate() { for (int i = 0; i < 5; ++i) { - if (g_Main->IsUSA()) { + if (g_Main->IsUSA() && !g_Main->IsTrilogy()) { xa8_textpane_categories[i]->TextSupport().SetText(xc_pauseStrg.GetString(i + 16)); } else { xa8_textpane_categories[i]->TextSupport().SetText(xc_pauseStrg.GetString(i + 18)); } } - x178_textpane_title->TextSupport().SetText(xc_pauseStrg.GetString(g_Main->IsUSA() ? 15 : 17)); + x178_textpane_title->TextSupport().SetText( + xc_pauseStrg.GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 15 : 17)); #if 0 for (int i=5 ; i<5 ; ++i) @@ -196,7 +197,7 @@ void COptionsScreen::VActivate() { x174_textpane_body->TextSupport().SetJustification(EJustification::Center); x174_textpane_body->TextSupport().SetVerticalJustification(EVerticalJustification::Bottom); - int stringOffset = g_Main->IsUSA() ? 0 : 3; + int stringOffset = (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 0 : 3; static_cast(x190_tablegroup_double->GetWorkerWidget(0)) ->TextSupport() .SetText(xc_pauseStrg.GetString(95 + stringOffset)); @@ -237,8 +238,8 @@ void COptionsScreen::ChangedMode(EMode oldMode) { void COptionsScreen::UpdateRightTable() { CPauseScreenBase::UpdateRightTable(); const std::pair& category = - g_Main->IsUSA() ? GameOptionsRegistry[x70_tablegroup_leftlog->GetUserSelection()] - : GameOptionsRegistryNew[x70_tablegroup_leftlog->GetUserSelection()]; + (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? GameOptionsRegistry[x70_tablegroup_leftlog->GetUserSelection()] + : GameOptionsRegistryNew[x70_tablegroup_leftlog->GetUserSelection()]; for (int i = 0; i < 5; ++i) { if (i < category.first) { xd8_textpane_titles[i]->TextSupport().SetText(xc_pauseStrg.GetString(category.second[i].stringId)); diff --git a/Runtime/MP1/CPauseScreenBase.cpp b/Runtime/MP1/CPauseScreenBase.cpp index 07712a349..caf457b95 100644 --- a/Runtime/MP1/CPauseScreenBase.cpp +++ b/Runtime/MP1/CPauseScreenBase.cpp @@ -81,7 +81,7 @@ void CPauseScreenBase::InitializeFrameGlue() { x184_textpane_yicon = static_cast(x8_frame.FindWidget("textpane_yicon")); x188_textpane_ytext = static_cast(x8_frame.FindWidget("textpane_ytext")); x184_textpane_yicon->TextSupport().SetText(fmt::format(FMT_STRING(u"&image={};"), g_tweakPlayerRes->xbc_yButton[0])); - x188_textpane_ytext->TextSupport().SetText(xc_pauseStrg.GetString(g_Main->IsUSA() ? 99 : 102)); + x188_textpane_ytext->TextSupport().SetText(xc_pauseStrg.GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 99 : 102)); x188_textpane_ytext->SetColor(g_tweakGuiColors->GetPauseItemAmberColor()); x18c_slidergroup_slider = static_cast(x8_frame.FindWidget("slidergroup_slider")); x18c_slidergroup_slider->SetMouseActive(true); From be45be9d67a297f99270d1adaa7309dc8e18571e Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Thu, 16 Apr 2020 03:35:51 -0700 Subject: [PATCH 190/224] Fix FrontEnd options screen --- Runtime/MP1/CFrontEndUI.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/MP1/CFrontEndUI.cpp b/Runtime/MP1/CFrontEndUI.cpp index c929bc757..4af1b9c98 100644 --- a/Runtime/MP1/CFrontEndUI.cpp +++ b/Runtime/MP1/CFrontEndUI.cpp @@ -1657,7 +1657,7 @@ void CFrontEndUI::SOptionsFrontEndFrame::FinishedLoading() { for (int i = 0; i < 4; ++i) { const std::string name = fmt::format(FMT_STRING("textpane_filename{}"), i); FindTextPanePair(x1c_loadedFrame, name) - .SetPairText(x20_loadedPauseStrg->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 16 : 18 + i)); + .SetPairText(x20_loadedPauseStrg->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy() ? 16 : 18) + i)); } x2c_tablegroup_double->SetVertical(false); From c32c42e12b847240fbe419e660a9d20218accf58 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 16 Apr 2020 13:00:08 -0400 Subject: [PATCH 191/224] CGameOptions: Amend wonky formatting of VisorOptsNew --- Runtime/CGameOptions.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Runtime/CGameOptions.cpp b/Runtime/CGameOptions.cpp index 7ddddc858..35e96fdd7 100644 --- a/Runtime/CGameOptions.cpp +++ b/Runtime/CGameOptions.cpp @@ -50,12 +50,12 @@ constexpr std::array ControllerOpts{{ }}; constexpr std::array VisorOptsNew{{ - {EGameOption::VisorOpacity, 23, 0.f, 255.f, 1.f, EOptionType::Float}, - {EGameOption::HelmetOpacity, 24, 0.f, 255.f, 1.f, EOptionType::Float}, - {EGameOption::HUDLag, 25, 0.f, 1.f, 1.f, EOptionType::DoubleEnum}, - {EGameOption::HintSystem, 26, 0.f, 1.f, 1.f, EOptionType::DoubleEnum}, - {EGameOption::RestoreDefaults, 38, 0.f, 1.f, 1.f, EOptionType::RestoreDefaults}, - }}; + {EGameOption::VisorOpacity, 23, 0.f, 255.f, 1.f, EOptionType::Float}, + {EGameOption::HelmetOpacity, 24, 0.f, 255.f, 1.f, EOptionType::Float}, + {EGameOption::HUDLag, 25, 0.f, 1.f, 1.f, EOptionType::DoubleEnum}, + {EGameOption::HintSystem, 26, 0.f, 1.f, 1.f, EOptionType::DoubleEnum}, + {EGameOption::RestoreDefaults, 38, 0.f, 1.f, 1.f, EOptionType::RestoreDefaults}, +}}; constexpr std::array DisplayOptsNew{{ //{EGameOption::ScreenBrightness, 25, 0.f, 8.f, 1.f, EOptionType::Float}, From dea8438f19261832431126a5f8bcfa5a1ac0f377 Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Thu, 16 Apr 2020 13:18:44 -0700 Subject: [PATCH 192/224] Minor fix for macOS --- DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp | 2 +- DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp b/DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp index 77ceb8b22..c58dac256 100644 --- a/DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp +++ b/DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp @@ -4,7 +4,7 @@ namespace DataSpec::DNAMP1 { -template +template struct AT_SPECIALIZE_PARMS(true, false) CTweakPlayerRes final : ITweakPlayerRes { AT_DECL_DNA_YAML diff --git a/DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp b/DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp index 2b2f3754f..5983dc760 100644 --- a/DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp +++ b/DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp @@ -3,7 +3,7 @@ #include "../../DNACommon/Tweaks/ITweakTargeting.hpp" namespace DataSpec::DNAMP1 { -template +template struct AT_SPECIALIZE_PARMS(true, false) CTweakTargeting final : public ITweakTargeting { AT_DECL_DNA_YAML Value x4_targetRadiusMode; From d16e758f07d67f6a0f7b74acb11195e2ea29dcd0 Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Thu, 16 Apr 2020 13:43:23 -0700 Subject: [PATCH 193/224] Include stdbool because AppleClang is weird --- DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp | 7 ++++--- DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp | 6 ++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp b/DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp index c58dac256..d7e6b6782 100644 --- a/DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp +++ b/DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp @@ -1,10 +1,11 @@ #pragma once -#include "../../DNACommon/Tweaks/ITweakPlayerRes.hpp" - +#include "DataSpec/DNACommon/Tweaks/ITweakPlayerRes.hpp" +// FIXME: Remove this include when it's in the DNA headers +#include namespace DataSpec::DNAMP1 { -template +template struct AT_SPECIALIZE_PARMS(true, false) CTweakPlayerRes final : ITweakPlayerRes { AT_DECL_DNA_YAML diff --git a/DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp b/DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp index 5983dc760..d7f026294 100644 --- a/DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp +++ b/DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp @@ -1,9 +1,11 @@ #pragma once -#include "../../DNACommon/Tweaks/ITweakTargeting.hpp" +#include "DataSpec/DNACommon/Tweaks/ITweakTargeting.hpp" +// FIXME: Remove this include when it's in the DNA headers +#include namespace DataSpec::DNAMP1 { -template +template struct AT_SPECIALIZE_PARMS(true, false) CTweakTargeting final : public ITweakTargeting { AT_DECL_DNA_YAML Value x4_targetRadiusMode; From e7ef1e0b5e0f2c15218dcd3a975901292ab127a8 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 16 Apr 2020 19:42:18 -0400 Subject: [PATCH 194/224] CGameOptions: Make TuneScreenBrightness() a const member function This member function doesn't modify internal class state. --- Runtime/CGameOptions.cpp | 2 +- Runtime/CGameOptions.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Runtime/CGameOptions.cpp b/Runtime/CGameOptions.cpp index 35e96fdd7..283f0fd08 100644 --- a/Runtime/CGameOptions.cpp +++ b/Runtime/CGameOptions.cpp @@ -266,7 +266,7 @@ CGameOptions::CGameOptions() InitSoundMode(); } -float CGameOptions::TuneScreenBrightness() { return (0.375f * 1.f) + (float(x48_screenBrightness) * 0.25f); } +float CGameOptions::TuneScreenBrightness() const { return (0.375f * 1.f) + (float(x48_screenBrightness) * 0.25f); } void CGameOptions::InitSoundMode() { /* If system is mono, force x44 to mono, otherwise honor user preference */ } diff --git a/Runtime/CGameOptions.hpp b/Runtime/CGameOptions.hpp index fc4e7bdb5..cefa673ab 100644 --- a/Runtime/CGameOptions.hpp +++ b/Runtime/CGameOptions.hpp @@ -134,7 +134,7 @@ public: void EnsureSettings(); void PutTo(CBitStreamWriter& writer) const; - float TuneScreenBrightness(); + float TuneScreenBrightness() const; void SetScreenBrightness(s32, bool); s32 GetScreenBrightness() const { return x48_screenBrightness; } void ApplyGamma(); From f844f2028b4a700caf85f2987983ce7f59ad0553 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 16 Apr 2020 19:49:33 -0400 Subject: [PATCH 195/224] CGameOptions: Give all function prototype parameters a name Makes the interface more self-documenting and also allows better IDE introspection. --- Runtime/CGameOptions.cpp | 60 ++++++++++++++++++++++++---------------- Runtime/CGameOptions.hpp | 44 ++++++++++++++--------------- 2 files changed, 58 insertions(+), 46 deletions(-) diff --git a/Runtime/CGameOptions.cpp b/Runtime/CGameOptions.cpp index 283f0fd08..1f662ef9d 100644 --- a/Runtime/CGameOptions.cpp +++ b/Runtime/CGameOptions.cpp @@ -271,11 +271,14 @@ float CGameOptions::TuneScreenBrightness() const { return (0.375f * 1.f) + (floa void CGameOptions::InitSoundMode() { /* If system is mono, force x44 to mono, otherwise honor user preference */ } static float BrightnessCopyFilter = 0.f; -void CGameOptions::SetScreenBrightness(s32 val, bool apply) { - x48_screenBrightness = zeus::clamp(0, val, 8); +void CGameOptions::SetScreenBrightness(s32 value, bool apply) { + x48_screenBrightness = zeus::clamp(0, value, 8); - if (apply) - BrightnessCopyFilter = TuneScreenBrightness(); + if (!apply) { + return; + } + + BrightnessCopyFilter = TuneScreenBrightness(); } void CGameOptions::ApplyGamma() { @@ -287,51 +290,60 @@ void CGameOptions::ApplyGamma() { CGraphics::g_BooFactory->setDisplayGamma(gammaT); } -void CGameOptions::SetGamma(s32 val, bool apply) { - m_gamma = zeus::clamp(-100, val, 100); +void CGameOptions::SetGamma(s32 value, bool apply) { + m_gamma = zeus::clamp(-100, value, 100); - if (apply) - ApplyGamma(); + if (!apply) { + return; + } + + ApplyGamma(); } -void CGameOptions::SetScreenPositionX(s32 pos, bool apply) { - x4c_screenXOffset = zeus::clamp(-30, pos, 30); +void CGameOptions::SetScreenPositionX(s32 position, bool apply) { + x4c_screenXOffset = zeus::clamp(-30, position, 30); if (apply) { /* TOOD: CGraphics related funcs */ } } -void CGameOptions::SetScreenPositionY(s32 pos, bool apply) { - x50_screenYOffset = zeus::clamp(-30, pos, 30); +void CGameOptions::SetScreenPositionY(s32 position, bool apply) { + x50_screenYOffset = zeus::clamp(-30, position, 30); if (apply) { /* TOOD: CGraphics related funcs */ } } -void CGameOptions::SetScreenStretch(s32 st, bool apply) { - x54_screenStretch = zeus::clamp(-10, st, 10); +void CGameOptions::SetScreenStretch(s32 stretch, bool apply) { + x54_screenStretch = zeus::clamp(-10, stretch, 10); if (apply) { /* TOOD: CGraphics related funcs */ } } -void CGameOptions::SetSfxVolume(s32 vol, bool apply) { - x58_sfxVol = zeus::clamp(0, vol, 0x7f); +void CGameOptions::SetSfxVolume(s32 volume, bool apply) { + x58_sfxVol = zeus::clamp(0, volume, 0x7f); - if (apply) { - CAudioSys::SysSetSfxVolume(x58_sfxVol, 1, true, true); - CStreamAudioManager::SetSfxVolume(x58_sfxVol); - CMoviePlayer::SetSfxVolume(x58_sfxVol); + if (!apply) { + return; } + + CAudioSys::SysSetSfxVolume(x58_sfxVol, 1, true, true); + CStreamAudioManager::SetSfxVolume(x58_sfxVol); + CMoviePlayer::SetSfxVolume(x58_sfxVol); } -void CGameOptions::SetMusicVolume(s32 vol, bool apply) { - x5c_musicVol = zeus::clamp(0, vol, 0x7f); - if (apply) - CStreamAudioManager::SetMusicVolume(x5c_musicVol); +void CGameOptions::SetMusicVolume(s32 volume, bool apply) { + x5c_musicVol = zeus::clamp(0, volume, 0x7f); + + if (!apply) { + return; + } + + CStreamAudioManager::SetMusicVolume(x5c_musicVol); } void CGameOptions::SetHUDAlpha(u32 alpha) { x60_hudAlpha = alpha; } diff --git a/Runtime/CGameOptions.hpp b/Runtime/CGameOptions.hpp index cefa673ab..5d6325b34 100644 --- a/Runtime/CGameOptions.hpp +++ b/Runtime/CGameOptions.hpp @@ -77,21 +77,21 @@ public: bool GetCinematicState(CAssetId mlvlId, TEditorId cineId) const; void SetCinematicState(CAssetId mlvlId, TEditorId cineId, bool state); u32 GetAutoMapperKeyState() const { return xbc_autoMapperKeyState; } - void SetAutoMapperKeyState(u32 s) { xbc_autoMapperKeyState = s; } + void SetAutoMapperKeyState(u32 state) { xbc_autoMapperKeyState = state; } bool GetPlayerLinkedFusion() const { return xd0_24_fusionLinked; } - void SetPlayerLinkedFusion(bool v) { xd0_24_fusionLinked = v; } + void SetPlayerLinkedFusion(bool fusionLinked) { xd0_24_fusionLinked = fusionLinked; } bool GetPlayerBeatNormalMode() const { return xd0_25_normalModeBeat; } - void SetPlayerBeatNormalMode(bool v) { xd0_25_normalModeBeat = v; } + void SetPlayerBeatNormalMode(bool normalModeBeat) { xd0_25_normalModeBeat = normalModeBeat; } bool GetPlayerBeatHardMode() const { return xd0_26_hardModeBeat; } - void SetPlayerBeatHardMode(bool v) { xd0_26_hardModeBeat = v; } + void SetPlayerBeatHardMode(bool hardModeBeat) { xd0_26_hardModeBeat = hardModeBeat; } bool GetPlayerBeatFusion() const { return xd0_27_fusionBeat; } - void SetPlayerBeatFusion(bool v) { xd0_27_fusionBeat = v; } + void SetPlayerBeatFusion(bool fusionBeat) { xd0_27_fusionBeat = fusionBeat; } bool GetPlayerFusionSuitActive() const { return xd0_28_fusionSuitActive; } - void SetPlayerFusionSuitActive(bool v) { xd0_28_fusionSuitActive = v; } + void SetPlayerFusionSuitActive(bool fusionSuitActive) { xd0_28_fusionSuitActive = fusionSuitActive; } bool GetAllItemsCollected() const { return xd0_29_allItemsCollected; } - void SetAllItemsCollected(bool v) { xd0_29_allItemsCollected = v; } + void SetAllItemsCollected(bool allItemsCollected) { xd0_29_allItemsCollected = allItemsCollected; } u32 GetLogScanPercent() const { return xcc_logScanPercent; } - void SetLogScanPercent(u32 v) { xcc_logScanPercent = v; } + void SetLogScanPercent(u32 percent) { xcc_logScanPercent = percent; } void IncrementFrozenFpsCount() { xc0_frozenFpsCount = std::min(int(xc0_frozenFpsCount + 1), 3); } bool GetShowFrozenFpsMessage() const { return xc0_frozenFpsCount != 3; } void IncrementFrozenBallCount() { xc4_frozenBallCount = std::min(int(xc4_frozenBallCount + 1), 3); } @@ -135,36 +135,36 @@ public: void PutTo(CBitStreamWriter& writer) const; float TuneScreenBrightness() const; - void SetScreenBrightness(s32, bool); + void SetScreenBrightness(s32 value, bool apply); s32 GetScreenBrightness() const { return x48_screenBrightness; } void ApplyGamma(); - void SetGamma(s32, bool); + void SetGamma(s32 value, bool apply); s32 GetGamma() const { return m_gamma; } - void SetScreenPositionX(s32, bool); + void SetScreenPositionX(s32 position, bool apply); s32 GetScreenPositionX() const { return x4c_screenXOffset; } - void SetScreenPositionY(s32, bool); + void SetScreenPositionY(s32 position, bool apply); s32 GetScreenPositionY() const { return x50_screenYOffset; } - void SetScreenStretch(s32, bool); + void SetScreenStretch(s32 stretch, bool apply); s32 GetScreenStretch() const { return x54_screenStretch; } - void SetSfxVolume(s32, bool); + void SetSfxVolume(s32 volume, bool apply); s32 GetSfxVolume() const { return x58_sfxVol; } - void SetMusicVolume(s32, bool); + void SetMusicVolume(s32 volume, bool apply); s32 GetMusicVolume() const { return x5c_musicVol; } - void SetHUDAlpha(u32); + void SetHUDAlpha(u32 alpha); u32 GetHUDAlpha() const { return x60_hudAlpha; } - void SetHelmetAlpha(u32); + void SetHelmetAlpha(u32 alpha); u32 GetHelmetAlpha() const { return x64_helmetAlpha; } - void SetHUDLag(bool); + void SetHUDLag(bool lag); bool GetHUDLag() const { return x68_24_hudLag; } void SetSurroundMode(int mode, bool apply); CAudioSys::ESurroundModes GetSurroundMode() const; - void SetInvertYAxis(bool); + void SetInvertYAxis(bool invert); bool GetInvertYAxis() const { return x68_25_invertY; } - void SetIsRumbleEnabled(bool); + void SetIsRumbleEnabled(bool rumble); bool GetIsRumbleEnabled() const { return x68_26_rumble; } - void SetSwapBeamControls(bool); + void SetSwapBeamControls(bool swap); bool GetSwapBeamControls() const { return x68_27_swapBeamsControls; } - void SetIsHintSystemEnabled(bool); + void SetIsHintSystemEnabled(bool hints); bool GetIsHintSystemEnabled() const { return x68_28_hintSystem; } void SetControls(int controls); void ResetControllerAssets(int controls); From a551dbc21da583ceaaaedaccbc2247ca3f0545e8 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 16 Apr 2020 19:55:59 -0400 Subject: [PATCH 196/224] CGameState: Silence implicit truncation warnings Ensures boolean conditions are used where applicable. --- Runtime/CGameState.cpp | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/Runtime/CGameState.cpp b/Runtime/CGameState.cpp index ca4d7e469..0289bdc44 100644 --- a/Runtime/CGameState.cpp +++ b/Runtime/CGameState.cpp @@ -24,15 +24,16 @@ union BitsToDouble { }; CWorldLayerState::CWorldLayerState(CBitStreamReader& reader, const CSaveWorld& saveWorld) { - u32 bitCount = reader.ReadEncoded(10); + const u32 bitCount = reader.ReadEncoded(10); x10_saveLayers.reserve(bitCount); for (u32 i = 0; i < bitCount; ++i) { - bool bit = reader.ReadEncoded(1); - if (bit) + const bool bit = reader.ReadEncoded(1) != 0; + if (bit) { x10_saveLayers.setBit(i); - else + } else { x10_saveLayers.unsetBit(i); + } } } @@ -53,11 +54,14 @@ void CWorldLayerState::PutTo(CBitStreamWriter& writer) const { } void CWorldLayerState::InitializeWorldLayers(const std::vector& layers) { - if (x0_areaLayers.size()) + if (!x0_areaLayers.empty()) { return; + } + x0_areaLayers = layers; - if (x10_saveLayers.getBitCount() == 0) + if (x10_saveLayers.getBitCount() == 0) { return; + } u32 a = 0; u32 b = 0; @@ -102,9 +106,9 @@ CGameState::GameFileStateInfo CGameState::LoadGameFileState(const u8* data) { } ret.x14_timestamp = stream.ReadEncoded(32); - ret.x20_hardMode = stream.ReadEncoded(1); + ret.x20_hardMode = stream.ReadEncoded(1) != 0; stream.ReadEncoded(1); - CAssetId origMLVL = u32(stream.ReadEncoded(32)); + const CAssetId origMLVL = u32(stream.ReadEncoded(32)); ret.x8_mlvlId = origMLVL; BitsToDouble conv; @@ -139,8 +143,10 @@ CGameState::CGameState() { x9c_transManager = std::make_shared(); x228_24_hardMode = false; x228_25_initPowerupsAtFirstSpawn = true; - if (g_MemoryCardSys) + + if (g_MemoryCardSys != nullptr) { InitializeMemoryStates(); + } } CGameState::CGameState(CBitStreamReader& stream, u32 saveIdx) : x20c_saveFileIdx(saveIdx) { @@ -153,8 +159,8 @@ CGameState::CGameState(CBitStreamReader& stream, u32 saveIdx) : x20c_saveFileIdx } stream.ReadEncoded(32); - x228_24_hardMode = stream.ReadEncoded(1); - x228_25_initPowerupsAtFirstSpawn = stream.ReadEncoded(1); + x228_24_hardMode = stream.ReadEncoded(1) != 0; + x228_25_initPowerupsAtFirstSpawn = stream.ReadEncoded(1) != 0; x84_mlvlId = u32(stream.ReadEncoded(32)); MP1::CMain::EnsureWorldPakReady(x84_mlvlId); From 20e5595042be4671008dd2acf3ab5d0701556f30 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 16 Apr 2020 19:59:19 -0400 Subject: [PATCH 197/224] CGameState: Always initialize x80_ Provides a deterministic initial state. --- Runtime/CGameState.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/CGameState.hpp b/Runtime/CGameState.hpp index ad4146e6d..ab63a1a28 100644 --- a/Runtime/CGameState.hpp +++ b/Runtime/CGameState.hpp @@ -69,7 +69,7 @@ class CGameState { friend class CStateManager; std::array x0_{}; - u32 x80_; + u32 x80_ = 0; CAssetId x84_mlvlId; std::vector x88_worldStates; std::shared_ptr x98_playerState; From ba3b23edaa5e363f37e0af295cbe60199d671e56 Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Thu, 16 Apr 2020 17:19:55 -0700 Subject: [PATCH 198/224] Disable saving on non-NTSC-U versions --- Runtime/CMemoryCardSysNix.cpp | 75 +++++++++-------- Runtime/CMemoryCardSysOSX.cpp | 55 +++++++------ Runtime/CMemoryCardSysWin.cpp | 140 +++++++++++++++++--------------- Runtime/MP1/CFrontEndUI.cpp | 2 +- Runtime/MP1/CSaveGameScreen.cpp | 17 ++-- 5 files changed, 160 insertions(+), 129 deletions(-) diff --git a/Runtime/CMemoryCardSysNix.cpp b/Runtime/CMemoryCardSysNix.cpp index 7873df934..fa31b6cc8 100644 --- a/Runtime/CMemoryCardSysNix.cpp +++ b/Runtime/CMemoryCardSysNix.cpp @@ -1,50 +1,59 @@ #include "CMemoryCardSys.hpp" +#include "Runtime/GameGlobalObjects.hpp" +#include "Runtime/IMain.hpp" namespace urde { kabufuda::SystemString CMemoryCardSys::ResolveDolphinCardPath(kabufuda::ECardSlot slot) { - const char* home = getenv("HOME"); - if (!home || home[0] != '/') - return {}; - const char* dataHome = getenv("XDG_DATA_HOME"); - - /* XDG-selected data path */ - kabufuda::SystemString path = - ((dataHome && dataHome[0] == '/') ? dataHome : hecl::SystemString(home)) + "/.local/share/dolphin-emu"; - path += fmt::format(FMT_STRING("/GC/MemoryCard{:c}.USA.raw"), slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); - - hecl::Sstat theStat; - if (hecl::Stat(path.c_str(), &theStat) || !S_ISREG(theStat.st_mode)) { - /* legacy case for older dolphin versions */ - path = home; - path += fmt::format(FMT_STRING("/.dolphin-emu/GC/MemoryCard{:c}.USA.raw"), slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); - if (hecl::Stat(path.c_str(), &theStat) || !S_ISREG(theStat.st_mode)) + if (g_Main->IsUSA() && !g_Main->IsTrilogy()) { + const char* home = getenv("HOME"); + if (!home || home[0] != '/') return {}; - } + const char* dataHome = getenv("XDG_DATA_HOME"); - return path; + /* XDG-selected data path */ + kabufuda::SystemString path = + ((dataHome && dataHome[0] == '/') ? dataHome : hecl::SystemString(home)) + "/.local/share/dolphin-emu"; + path += fmt::format(FMT_STRING("/GC/MemoryCard{:c}.USA.raw"), slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); + + hecl::Sstat theStat; + if (hecl::Stat(path.c_str(), &theStat) || !S_ISREG(theStat.st_mode)) { + /* legacy case for older dolphin versions */ + path = home; + path += fmt::format(FMT_STRING("/.dolphin-emu/GC/MemoryCard{:c}.USA.raw"), + slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); + if (hecl::Stat(path.c_str(), &theStat) || !S_ISREG(theStat.st_mode)) + return {}; + } + + return path; + } + return {}; } kabufuda::SystemString CMemoryCardSys::_CreateDolphinCard(kabufuda::ECardSlot slot) { - const char* home = getenv("HOME"); - if (!home || home[0] != '/') - return {}; - const char* dataHome = getenv("XDG_DATA_HOME"); + if (g_Main->IsUSA() && !g_Main->IsTrilogy()) { + const char* home = getenv("HOME"); + if (!home || home[0] != '/') + return {}; + const char* dataHome = getenv("XDG_DATA_HOME"); - /* XDG-selected data path */ - kabufuda::SystemString path = - ((dataHome && dataHome[0] == '/') ? dataHome : hecl::SystemString(home)) + "/.local/share/dolphin-emu/GC"; + /* XDG-selected data path */ + kabufuda::SystemString path = + ((dataHome && dataHome[0] == '/') ? dataHome : hecl::SystemString(home)) + "/.local/share/dolphin-emu/GC"; - if (hecl::RecursiveMakeDir(path.c_str()) < 0) - return {}; + if (hecl::RecursiveMakeDir(path.c_str()) < 0) + return {}; - path += fmt::format(FMT_STRING("/MemoryCard{:c}.USA.raw"), slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); - const auto fp = hecl::FopenUnique(path.c_str(), "wb"); - if (fp == nullptr) { - return {}; + path += fmt::format(FMT_STRING("/MemoryCard{:c}.USA.raw"), slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); + const auto fp = hecl::FopenUnique(path.c_str(), "wb"); + if (fp == nullptr) { + return {}; + } + + return path; } - - return path; + return {}; } } // namespace urde diff --git a/Runtime/CMemoryCardSysOSX.cpp b/Runtime/CMemoryCardSysOSX.cpp index eca7da8d5..b62be99b8 100644 --- a/Runtime/CMemoryCardSysOSX.cpp +++ b/Runtime/CMemoryCardSysOSX.cpp @@ -1,40 +1,47 @@ #include "CMemoryCardSys.hpp" - +#include "Runtime/GameGlobalObjects.hpp" +#include "Runtime/IMain.hpp" namespace urde { kabufuda::SystemString CMemoryCardSys::ResolveDolphinCardPath(kabufuda::ECardSlot slot) { - const char* home = getenv("HOME"); - if (!home) - return {}; + if (g_Main->IsUSA() && !g_Main->IsTrilogy()) { + const char* home = getenv("HOME"); + if (!home) + return {}; - kabufuda::SystemString path = home; - path += fmt::format(FMT_STRING("/Library/Application Support/Dolphin/GC/MemoryCard{:c}.USA.raw"), - slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); + kabufuda::SystemString path = home; + path += fmt::format(FMT_STRING("/Library/Application Support/Dolphin/GC/MemoryCard{:c}.USA.raw"), + slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); - hecl::Sstat theStat; - if (hecl::Stat(path.c_str(), &theStat) || !S_ISREG(theStat.st_mode)) - return {}; + hecl::Sstat theStat; + if (hecl::Stat(path.c_str(), &theStat) || !S_ISREG(theStat.st_mode)) + return {}; - return path; + return path; + } + return {}; } kabufuda::SystemString CMemoryCardSys::_CreateDolphinCard(kabufuda::ECardSlot slot) { - const char* home = getenv("HOME"); - if (!home) - return {}; + if (g_Main->IsUSA() && !g_Main->IsTrilogy()) { + const char* home = getenv("HOME"); + if (!home) + return {}; - kabufuda::SystemString path = home; - path += "/Library/Application Support/Dolphin/GC"; - if (hecl::RecursiveMakeDir(path.c_str()) < 0) - return {}; + kabufuda::SystemString path = home; + path += "/Library/Application Support/Dolphin/GC"; + if (hecl::RecursiveMakeDir(path.c_str()) < 0) + return {}; - path += fmt::format(FMT_STRING("/MemoryCard{:c}.USA.raw"), slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); - const auto fp = hecl::FopenUnique(path.c_str(), "wb"); - if (fp == nullptr) { - return {}; + path += fmt::format(FMT_STRING("/MemoryCard{:c}.USA.raw"), slot == kabufuda::ECardSlot::SlotA ? 'A' : 'B'); + const auto fp = hecl::FopenUnique(path.c_str(), "wb"); + if (fp == nullptr) { + return {}; + } + + return path; } - - return path; + return {}; } } // namespace urde diff --git a/Runtime/CMemoryCardSysWin.cpp b/Runtime/CMemoryCardSysWin.cpp index 6f80119c3..ee5ffb8bf 100644 --- a/Runtime/CMemoryCardSysWin.cpp +++ b/Runtime/CMemoryCardSysWin.cpp @@ -12,101 +12,109 @@ using namespace Windows::Storage; * https://github.com/dolphin-emu/dolphin/blob/master/Source/Core/UICommon/UICommon.cpp * Modified to not use dolphin-binary-relative paths. */ kabufuda::SystemString CMemoryCardSys::ResolveDolphinCardPath(kabufuda::ECardSlot slot) { + if (g_Main->IsUSA() && !g_Main->IsTrilogy()) { #if !WINDOWS_STORE - /* Detect where the User directory is. There are two different cases + /* Detect where the User directory is. There are two different cases * 1. HKCU\Software\Dolphin Emulator\UserConfigPath exists * -> Use this as the user directory path * 2. My Documents exists * -> Use My Documents\Dolphin Emulator as the User directory path - */ + */ - /* Check our registry keys */ - HKEY hkey; - kabufuda::SystemChar configPath[MAX_PATH] = {0}; - if (RegOpenKeyEx(HKEY_CURRENT_USER, _SYS_STR("Software\\Dolphin Emulator"), 0, KEY_QUERY_VALUE, &hkey) == - ERROR_SUCCESS) { - DWORD size = MAX_PATH; - if (RegQueryValueEx(hkey, _SYS_STR("UserConfigPath"), nullptr, nullptr, (LPBYTE)configPath, &size) != ERROR_SUCCESS) - configPath[0] = 0; - RegCloseKey(hkey); - } + /* Check our registry keys */ + HKEY hkey; + kabufuda::SystemChar configPath[MAX_PATH] = {0}; + if (RegOpenKeyEx(HKEY_CURRENT_USER, _SYS_STR("Software\\Dolphin Emulator"), 0, KEY_QUERY_VALUE, &hkey) == + ERROR_SUCCESS) { + DWORD size = MAX_PATH; + if (RegQueryValueEx(hkey, _SYS_STR("UserConfigPath"), nullptr, nullptr, (LPBYTE)configPath, &size) != + ERROR_SUCCESS) + configPath[0] = 0; + RegCloseKey(hkey); + } - /* Get My Documents path in case we need it. */ - kabufuda::SystemChar my_documents[MAX_PATH]; - bool my_documents_found = - SUCCEEDED(SHGetFolderPath(nullptr, CSIDL_MYDOCUMENTS, nullptr, SHGFP_TYPE_CURRENT, my_documents)); + /* Get My Documents path in case we need it. */ + kabufuda::SystemChar my_documents[MAX_PATH]; + bool my_documents_found = + SUCCEEDED(SHGetFolderPath(nullptr, CSIDL_MYDOCUMENTS, nullptr, SHGFP_TYPE_CURRENT, my_documents)); - kabufuda::SystemString path; - if (configPath[0]) /* Case 1 */ - path = configPath; - else if (my_documents_found) /* Case 2 */ - path = kabufuda::SystemString(my_documents) + _SYS_STR("/Dolphin Emulator"); - else /* Unable to find */ - return {}; + kabufuda::SystemString path; + if (configPath[0]) /* Case 1 */ + path = configPath; + else if (my_documents_found) /* Case 2 */ + path = kabufuda::SystemString(my_documents) + _SYS_STR("/Dolphin Emulator"); + else /* Unable to find */ + return {}; #else - StorageFolder ^ localFolder = ApplicationData::Current->LocalFolder; - kabufuda::SystemString path(localFolder->Path->Data()); + StorageFolder ^ localFolder = ApplicationData::Current->LocalFolder; + kabufuda::SystemString path(localFolder->Path->Data()); #endif - path += fmt::format(FMT_STRING(_SYS_STR("/GC/MemoryCard{}.USA.raw")), - slot == kabufuda::ECardSlot::SlotA ? _SYS_STR('A') : _SYS_STR('B')); + path += fmt::format(FMT_STRING(_SYS_STR("/GC/MemoryCard{}.USA.raw")), + slot == kabufuda::ECardSlot::SlotA ? _SYS_STR('A') : _SYS_STR('B')); - hecl::Sstat theStat; - if (hecl::Stat(path.c_str(), &theStat) || !S_ISREG(theStat.st_mode)) - return {}; + hecl::Sstat theStat; + if (hecl::Stat(path.c_str(), &theStat) || !S_ISREG(theStat.st_mode)) + return {}; - return path; + return path; + } + return {}; } kabufuda::SystemString CMemoryCardSys::_CreateDolphinCard(kabufuda::ECardSlot slot) { + if (g_Main->IsUSA() && !g_Main->IsTrilogy()) { #if !WINDOWS_STORE - /* Detect where the User directory is. There are two different cases + /* Detect where the User directory is. There are two different cases * 1. HKCU\Software\Dolphin Emulator\UserConfigPath exists * -> Use this as the user directory path * 2. My Documents exists * -> Use My Documents\Dolphin Emulator as the User directory path - */ + */ - /* Check our registry keys */ - HKEY hkey; - kabufuda::SystemChar configPath[MAX_PATH] = {0}; - if (RegOpenKeyEx(HKEY_CURRENT_USER, _SYS_STR("Software\\Dolphin Emulator"), 0, KEY_QUERY_VALUE, &hkey) == - ERROR_SUCCESS) { - DWORD size = MAX_PATH; - if (RegQueryValueEx(hkey, _SYS_STR("UserConfigPath"), nullptr, nullptr, (LPBYTE)configPath, &size) != ERROR_SUCCESS) - configPath[0] = 0; - RegCloseKey(hkey); - } + /* Check our registry keys */ + HKEY hkey; + kabufuda::SystemChar configPath[MAX_PATH] = {0}; + if (RegOpenKeyEx(HKEY_CURRENT_USER, _SYS_STR("Software\\Dolphin Emulator"), 0, KEY_QUERY_VALUE, &hkey) == + ERROR_SUCCESS) { + DWORD size = MAX_PATH; + if (RegQueryValueEx(hkey, _SYS_STR("UserConfigPath"), nullptr, nullptr, (LPBYTE)configPath, &size) != + ERROR_SUCCESS) + configPath[0] = 0; + RegCloseKey(hkey); + } - /* Get My Documents path in case we need it. */ - kabufuda::SystemChar my_documents[MAX_PATH]; - bool my_documents_found = - SUCCEEDED(SHGetFolderPath(nullptr, CSIDL_MYDOCUMENTS, nullptr, SHGFP_TYPE_CURRENT, my_documents)); + /* Get My Documents path in case we need it. */ + kabufuda::SystemChar my_documents[MAX_PATH]; + bool my_documents_found = + SUCCEEDED(SHGetFolderPath(nullptr, CSIDL_MYDOCUMENTS, nullptr, SHGFP_TYPE_CURRENT, my_documents)); - kabufuda::SystemString path; - if (configPath[0]) /* Case 1 */ - path = configPath; - else if (my_documents_found) /* Case 2 */ - path = kabufuda::SystemString(my_documents) + _SYS_STR("/Dolphin Emulator"); - else /* Unable to find */ - return {}; + kabufuda::SystemString path; + if (configPath[0]) /* Case 1 */ + path = configPath; + else if (my_documents_found) /* Case 2 */ + path = kabufuda::SystemString(my_documents) + _SYS_STR("/Dolphin Emulator"); + else /* Unable to find */ + return {}; #else - StorageFolder ^ localFolder = ApplicationData::Current->LocalFolder; - kabufuda::SystemString path(localFolder->Path->Data()); + StorageFolder ^ localFolder = ApplicationData::Current->LocalFolder; + kabufuda::SystemString path(localFolder->Path->Data()); #endif - path += _SYS_STR("/GC"); - if (hecl::RecursiveMakeDir(path.c_str()) < 0) - return {}; + path += _SYS_STR("/GC"); + if (hecl::RecursiveMakeDir(path.c_str()) < 0) + return {}; - path += fmt::format(FMT_STRING(_SYS_STR("/MemoryCard{}.USA.raw")), - slot == kabufuda::ECardSlot::SlotA ? _SYS_STR('A') : _SYS_STR('B')); - const auto fp = hecl::FopenUnique(path.c_str(), _SYS_STR("wb")); - if (fp == nullptr) { - return {}; + path += fmt::format(FMT_STRING(_SYS_STR("/MemoryCard{}.USA.raw")), + slot == kabufuda::ECardSlot::SlotA ? _SYS_STR('A') : _SYS_STR('B')); + const auto fp = hecl::FopenUnique(path.c_str(), _SYS_STR("wb")); + if (fp == nullptr) { + return {}; + } + + return path; } - - return path; + return {}; } } // namespace urde diff --git a/Runtime/MP1/CFrontEndUI.cpp b/Runtime/MP1/CFrontEndUI.cpp index 4af1b9c98..66460502a 100644 --- a/Runtime/MP1/CFrontEndUI.cpp +++ b/Runtime/MP1/CFrontEndUI.cpp @@ -1317,7 +1317,7 @@ CFrontEndUI::SNesEmulatorFrame::SNesEmulatorFrame() { CGuiTextProperties props(false, true, EJustification::Left, EVerticalJustification::Center); xc_textSupport = std::make_unique(deface->id, props, zeus::skWhite, zeus::skBlack, zeus::skWhite, 0, 0, g_SimplePool, CGuiWidget::EGuiModelDrawFlags::Alpha); - xc_textSupport->SetText(g_MainStringTable->GetString(103)); + xc_textSupport->SetText(g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 103 : 97)); xc_textSupport->AutoSetExtent(); xc_textSupport->ClearRenderBuffer(); } diff --git a/Runtime/MP1/CSaveGameScreen.cpp b/Runtime/MP1/CSaveGameScreen.cpp index 95fe4acda..390fd2705 100644 --- a/Runtime/MP1/CSaveGameScreen.cpp +++ b/Runtime/MP1/CSaveGameScreen.cpp @@ -190,11 +190,18 @@ void CSaveGameScreen::SetUIText() { msgB = 25; // Writing break; case EUIType::NoCardFound: - msgB = 0; // No card found - opt0 = 17; // Continue without saving - opt1 = 18; // Retry - opt2 = -2; - opt2Str = u"Create Dolphin Card"; + if (g_Main->IsUSA() && !g_Main->IsTrilogy()) { + msgB = 0; // No card found + opt0 = 17; // Continue without saving + opt1 = 18; // Retry + opt2 = -2; + opt2Str = u"Create Dolphin Card"; + } else { + msgAStr = u"This version of Metroid Prime\nhas a currently unsupported save format.\n"; + msgBStr = u"&push;&main-color=$ff0000ff;Saving has been disabled.&pop;\n"; + opt0 = -2; + opt0Str = u"Press &image=SI,1.0,0.68,05AF9CAA; to proceed.\n"; + } break; case EUIType::NeedsFormatBroken: msgB = 1; // Needs format (card broken) From ed125031f3ec909c42dd39a15540bcb4eb025451 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 16 Apr 2020 21:10:48 -0400 Subject: [PATCH 199/224] CFluidUVMotion: Collapse separate resize and assignment into a constructor call We can pre-size and insert the elements all at the same time. --- Runtime/World/CFluidUVMotion.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/Runtime/World/CFluidUVMotion.cpp b/Runtime/World/CFluidUVMotion.cpp index e8ad7cc6e..2018038ec 100644 --- a/Runtime/World/CFluidUVMotion.cpp +++ b/Runtime/World/CFluidUVMotion.cpp @@ -6,15 +6,11 @@ namespace urde { -CFluidUVMotion::CFluidUVMotion(float timeToWrap, float orientation, const CFluidUVMotion::SFluidLayerMotion& colorLayer, - const CFluidUVMotion::SFluidLayerMotion& pattern1Layer, - const CFluidUVMotion::SFluidLayerMotion& pattern2Layer) -: x4c_ooTimeToWrap(1.f / timeToWrap), x50_orientation(orientation) { - x0_fluidLayers.resize(3); - x0_fluidLayers[0] = colorLayer; - x0_fluidLayers[1] = pattern1Layer; - x0_fluidLayers[2] = pattern2Layer; -} +CFluidUVMotion::CFluidUVMotion(float timeToWrap, float orientation, const SFluidLayerMotion& colorLayer, + const SFluidLayerMotion& pattern1Layer, const SFluidLayerMotion& pattern2Layer) +: x0_fluidLayers{{colorLayer, pattern1Layer, pattern2Layer}} +, x4c_ooTimeToWrap(1.f / timeToWrap) +, x50_orientation(orientation) {} CFluidUVMotion::CFluidUVMotion(float timeToWrap, float orientation) : x4c_ooTimeToWrap(1.f / timeToWrap), x50_orientation(orientation) { From 3715e6dcbb7a76fc5f4c7aff33fd8ca3f592eec8 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 17 Apr 2020 00:27:20 -0400 Subject: [PATCH 200/224] CFlameWarp: Make use of const where applicable Makes algorithms easier to follow by explicitly marking immutable state. --- Runtime/Particle/CFlameWarp.cpp | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/Runtime/Particle/CFlameWarp.cpp b/Runtime/Particle/CFlameWarp.cpp index 23ea08edf..2cc4e6e68 100644 --- a/Runtime/Particle/CFlameWarp.cpp +++ b/Runtime/Particle/CFlameWarp.cpp @@ -19,9 +19,9 @@ void CFlameWarp::ModifyParticles(std::vector& particles) { float maxTransp = 0.f; u8 idx = 0; for (CParticle& particle : particles) { - float transp = 1.f - particle.x34_color.a(); + const float transp = 1.f - particle.x34_color.a(); if (transp > maxTransp) { - float distSq = (particle.x4_pos - x74_warpPoint).magSquared(); + const float distSq = (particle.x4_pos - x74_warpPoint).magSquared(); if (distSq > x8c_maxDistSq && distSq < x98_maxInfluenceDistSq) { x8c_maxDistSq = distSq; maxTransp = transp; @@ -29,28 +29,30 @@ void CFlameWarp::ModifyParticles(std::vector& particles) { } } - if (particle.x2c_lineLengthOrSize < x90_minSize) + if (particle.x2c_lineLengthOrSize < x90_minSize) { x90_minSize = particle.x2c_lineLengthOrSize; - if (particle.x2c_lineLengthOrSize > x94_maxSize) + } + if (particle.x2c_lineLengthOrSize > x94_maxSize) { x94_maxSize = particle.x2c_lineLengthOrSize; + } vec.emplace_back(transp, idx); if (xa0_25_collisionWarp) { - zeus::CVector3f delta = particle.x4_pos - particle.x10_prevPos; + const zeus::CVector3f delta = particle.x4_pos - particle.x10_prevPos; if (delta.magSquared() >= 0.0011920929f) { - zeus::CVector3f deltaNorm = delta.normalized(); - zeus::CVector3f behindPos = particle.x10_prevPos - deltaNorm * 5.f; - zeus::CVector3f fullDelta = particle.x4_pos - behindPos; - CRayCastResult result = x9c_stateMgr->RayStaticIntersection( + const zeus::CVector3f deltaNorm = delta.normalized(); + const zeus::CVector3f behindPos = particle.x10_prevPos - deltaNorm * 5.f; + const zeus::CVector3f fullDelta = particle.x4_pos - behindPos; + const CRayCastResult result = x9c_stateMgr->RayStaticIntersection( behindPos, deltaNorm, fullDelta.magnitude(), CMaterialFilter::MakeIncludeExclude({EMaterialTypes::Solid}, {EMaterialTypes::ProjectilePassthrough})); if (result.IsValid()) { - float dist = result.GetPlane().pointToPlaneDist(particle.x4_pos); + const float dist = result.GetPlane().pointToPlaneDist(particle.x4_pos); if (dist <= 0.f) { particle.x4_pos -= result.GetPlane().normal() * dist; if (result.GetPlane().normal().dot(particle.x1c_vel) < 0.f) { - zeus::CVector3f prevStepPos = particle.x4_pos - particle.x1c_vel; + const zeus::CVector3f prevStepPos = particle.x4_pos - particle.x1c_vel; particle.x4_pos += (-result.GetPlane().pointToPlaneDist(prevStepPos) / particle.x1c_vel.dot(result.GetPlane().normal()) - 1.f) * @@ -91,8 +93,9 @@ void CFlameWarp::ResetPosition(const zeus::CVector3f& pos) { zeus::CAABox CFlameWarp::CalculateBounds() const { zeus::CAABox ret; - for (const auto& v : x4_collisionPoints) + for (const auto& v : x4_collisionPoints) { ret.accumulateBounds(v); + } return ret; } From fa9f0fdc61af1b5dd90cc5a8ade665b66c6020c9 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 17 Apr 2020 00:44:47 -0400 Subject: [PATCH 201/224] CFishCloud: Brace statements where applicable Makes the code more uniform and consistent. While we're in the same area, we can make use of const where applicable. --- Runtime/World/CFishCloud.cpp | 406 ++++++++++++++++++++++------------- 1 file changed, 254 insertions(+), 152 deletions(-) diff --git a/Runtime/World/CFishCloud.cpp b/Runtime/World/CFishCloud.cpp index a518c3fc2..81399b7bd 100644 --- a/Runtime/World/CFishCloud.cpp +++ b/Runtime/World/CFishCloud.cpp @@ -63,14 +63,18 @@ CFishCloud::CFishCloud(TUniqueId uid, bool active, std::string_view name, const x1b0_models.emplace_back(std::make_unique(aRes)); x250_27_validModel = true; } - if (part1.IsValid()) + if (part1.IsValid()) { x1c4_particleDescs.push_back(g_SimplePool->GetObj({FOURCC('PART'), part1})); - if (part2.IsValid()) + } + if (part2.IsValid()) { x1c4_particleDescs.push_back(g_SimplePool->GetObj({FOURCC('PART'), part2})); - if (part3.IsValid()) + } + if (part3.IsValid()) { x1c4_particleDescs.push_back(g_SimplePool->GetObj({FOURCC('PART'), part3})); - if (part4.IsValid()) + } + if (part4.IsValid()) { x1c4_particleDescs.push_back(g_SimplePool->GetObj({FOURCC('PART'), part4})); + } for (const auto& p : x1c4_particleDescs) { x1f8_particleGens.emplace_back(std::make_unique(p)); x1f8_particleGens.back()->SetParticleEmission(false); @@ -79,7 +83,7 @@ CFishCloud::CFishCloud(TUniqueId uid, bool active, std::string_view name, const x21c_deathParticleCounts.push_back(partCount2); x21c_deathParticleCounts.push_back(partCount3); x21c_deathParticleCounts.push_back(partCount4); - zeus::CAABox aabb = GetBoundingBox(); + const zeus::CAABox aabb = GetBoundingBox(); x238_partitionPitch = (aabb.max - aabb.min) / 7.f; x244_ooPartitionPitch = 1.f / x238_partitionPitch; } @@ -87,17 +91,18 @@ CFishCloud::CFishCloud(TUniqueId uid, bool active, std::string_view name, const void CFishCloud::Accept(IVisitor& visitor) { visitor.Visit(this); } void CFishCloud::UpdateParticles(float dt) { - for (auto& p : x1f8_particleGens) + for (auto& p : x1f8_particleGens) { p->Update(dt); + } } void CFishCloud::UpdatePartitionList() { xf8_boidPartitionLists.clear(); xf8_boidPartitionLists.resize(xf8_boidPartitionLists.capacity()); - auto aabb = GetBoundingBox(); + const auto aabb = GetBoundingBox(); for (auto& b : xe8_boids) { - zeus::CVector3f idxs = (b.x0_pos - aabb.min) * x244_ooPartitionPitch; - int idx = int(idxs.x()) + int(idxs.y()) * 7 + int(idxs.z()) * 49; + const zeus::CVector3f idxs = (b.x0_pos - aabb.min) * x244_ooPartitionPitch; + const int idx = int(idxs.x()) + int(idxs.y()) * 7 + int(idxs.z()) * 49; if (idx >= 0 && idx < 343) { b.x1c_next = xf8_boidPartitionLists[idx]; xf8_boidPartitionLists[idx] = &b; @@ -106,39 +111,41 @@ void CFishCloud::UpdatePartitionList() { } bool CFishCloud::PointInBox(const zeus::CAABox& aabb, const zeus::CVector3f& point) const { - if (!x250_25_worldSpace) + if (!x250_25_worldSpace) { return aabb.pointInside(point); + } return GetUntransformedBoundingBox().pointInside(GetTransform().transposeRotate(point - GetTranslation())); } zeus::CPlane CFishCloud::FindClosestPlane(const zeus::CAABox& aabb, const zeus::CVector3f& point) const { if (!x250_25_worldSpace) { float minDist = FLT_MAX; - zeus::CAABox::EBoxFaceId minFace = zeus::CAABox::EBoxFaceId::YMin; + auto minFace = zeus::CAABox::EBoxFaceId::YMin; for (int i = 0; i < 6; ++i) { - auto tri = aabb.getTri(zeus::CAABox::EBoxFaceId(i), 0); - float dist = zeus::CPlane(tri.x10_verts[0], tri.x10_verts[2], tri.x10_verts[1]).pointToPlaneDist(point); + const auto tri = aabb.getTri(zeus::CAABox::EBoxFaceId(i), 0); + const float dist = zeus::CPlane(tri.x10_verts[0], tri.x10_verts[2], tri.x10_verts[1]).pointToPlaneDist(point); if (dist >= 0.f && dist < minDist) { minDist = dist; minFace = zeus::CAABox::EBoxFaceId(i); } } - auto tri = aabb.getTri(minFace, 0); + const auto tri = aabb.getTri(minFace, 0); return zeus::CPlane(tri.x10_verts[0], tri.x10_verts[2], tri.x10_verts[1]); } else { - auto unPoint = GetTransform().transposeRotate(point - GetTranslation()); - auto unAabb = GetUntransformedBoundingBox(); + const auto unPoint = GetTransform().transposeRotate(point - GetTranslation()); + const auto unAabb = GetUntransformedBoundingBox(); float minDist = FLT_MAX; - zeus::CAABox::EBoxFaceId minFace = zeus::CAABox::EBoxFaceId::YMin; + auto minFace = zeus::CAABox::EBoxFaceId::YMin; for (int i = 0; i < 6; ++i) { - auto tri = unAabb.getTri(zeus::CAABox::EBoxFaceId(i), 0); - float dist = zeus::CPlane(tri.x10_verts[0], tri.x10_verts[2], tri.x10_verts[1]).pointToPlaneDist(unPoint); + const auto tri = unAabb.getTri(zeus::CAABox::EBoxFaceId(i), 0); + const float dist = zeus::CPlane(tri.x10_verts[0], tri.x10_verts[2], tri.x10_verts[1]).pointToPlaneDist(unPoint); if (dist >= 0.f && dist < minDist) { minDist = dist; minFace = zeus::CAABox::EBoxFaceId(i); } } - auto tri = unAabb.getTri(minFace, 0); + + const auto tri = unAabb.getTri(minFace, 0); return zeus::CPlane(GetTransform() * tri.x10_verts[0], GetTransform() * tri.x10_verts[2], GetTransform() * tri.x10_verts[1]); @@ -146,23 +153,28 @@ zeus::CPlane CFishCloud::FindClosestPlane(const zeus::CAABox& aabb, const zeus:: } CFishCloud::CBoid* CFishCloud::GetListAt(const zeus::CVector3f& pos) { - zeus::CAABox aabb = GetBoundingBox(); - zeus::CVector3f ints = (pos - aabb.min) * x244_ooPartitionPitch; - int idx = int(ints.x()) + int(ints.y()) * 7 + int(ints.z()) * 49; - if (idx < 0 || idx >= 343) + const zeus::CAABox aabb = GetBoundingBox(); + const zeus::CVector3f ints = (pos - aabb.min) * x244_ooPartitionPitch; + const int idx = int(ints.x()) + int(ints.y()) * 7 + int(ints.z()) * 49; + + if (idx < 0 || idx >= 343) { return nullptr; + } + return xf8_boidPartitionLists[idx]; } void CFishCloud::BuildBoidNearList(const zeus::CVector3f& pos, float radius, rstl::reserved_vector& nearList) { - float radiusSq = radius * radius; + const float radiusSq = radius * radius; CBoid* b = GetListAt(pos); - while (b && nearList.size() < 25) { + + while (b != nullptr && nearList.size() < 25) { if (b->x20_active) { - float distSq = (b->GetTranslation() - pos).magSquared(); - if (distSq != 0.f && distSq < radiusSq) + const float distSq = (b->GetTranslation() - pos).magSquared(); + if (distSq != 0.f && distSq < radiusSq) { nearList.push_back(b); + } } b = b->x1c_next; } @@ -170,45 +182,54 @@ void CFishCloud::BuildBoidNearList(const zeus::CVector3f& pos, float radius, void CFishCloud::BuildBoidNearPartitionList(const zeus::CVector3f& pos, float radius, rstl::reserved_vector& nearList) { - float radiusSq = radius * radius; - zeus::CAABox aabb = GetBoundingBox(); - float x = std::max(radius * x244_ooPartitionPitch.x(), float(x238_partitionPitch.x())); - float y = std::max(radius * x244_ooPartitionPitch.y(), float(x238_partitionPitch.y())); - float z = std::max(radius * x244_ooPartitionPitch.z(), float(x238_partitionPitch.z())); - float nx = 0.01f - x; - float ny = 0.01f - y; - float nz = 0.01f - z; + const float radiusSq = radius * radius; + const zeus::CAABox aabb = GetBoundingBox(); + const float x = std::max(radius * x244_ooPartitionPitch.x(), float(x238_partitionPitch.x())); + const float y = std::max(radius * x244_ooPartitionPitch.y(), float(x238_partitionPitch.y())); + const float z = std::max(radius * x244_ooPartitionPitch.z(), float(x238_partitionPitch.z())); + const float nx = 0.01f - x; + const float ny = 0.01f - y; + const float nz = 0.01f - z; + for (float lnx = nx; lnx < x; lnx += x238_partitionPitch.x()) { - float cx = lnx + pos.x(); - if (cx < aabb.min.x()) + const float cx = lnx + pos.x(); + if (cx < aabb.min.x()) { continue; - if (cx >= aabb.max.x()) + } + if (cx >= aabb.max.x()) { break; + } for (float lny = ny; lny < y; lny += x238_partitionPitch.y()) { - float cy = lny + pos.y(); - if (cy < aabb.min.y()) + const float cy = lny + pos.y(); + if (cy < aabb.min.y()) { continue; - if (cy >= aabb.max.y()) + } + if (cy >= aabb.max.y()) { break; + } for (float lnz = nz; lnz < z; lnz += x238_partitionPitch.z()) { - float cz = lnz + pos.z(); - if (cz < aabb.min.z()) + const float cz = lnz + pos.z(); + if (cz < aabb.min.z()) { continue; - if (cz >= aabb.max.z()) + } + if (cz >= aabb.max.z()) { break; - zeus::CVector3f ints = (zeus::CVector3f(cx, cy, cz) - aabb.min) * x244_ooPartitionPitch; - int idx = int(ints.x()) + int(ints.y()) * 7 + int(ints.z()) * 49; - if (idx < 0) + } + const zeus::CVector3f ints = (zeus::CVector3f(cx, cy, cz) - aabb.min) * x244_ooPartitionPitch; + const int idx = int(ints.x()) + int(ints.y()) * 7 + int(ints.z()) * 49; + if (idx < 0) { continue; + } if (idx < 343) { CBoid* boid = xf8_boidPartitionLists[idx]; - while (boid) { + while (boid != nullptr) { if (boid->x20_active) { - float distSq = (boid->x0_pos - pos).magSquared(); + const float distSq = (boid->x0_pos - pos).magSquared(); if (distSq != 0.f && distSq < radiusSq) { nearList.push_back(boid); - if (nearList.size() == 25) + if (nearList.size() == 25) { return; + } } } boid = boid->x1c_next; @@ -220,7 +241,7 @@ void CFishCloud::BuildBoidNearPartitionList(const zeus::CVector3f& pos, float ra } void CFishCloud::PlaceBoid(CStateManager& mgr, CBoid& boid, const zeus::CAABox& aabb) const { - auto plane = FindClosestPlane(aabb, boid.x0_pos); + const auto plane = FindClosestPlane(aabb, boid.x0_pos); boid.x0_pos -= plane.pointToPlaneDist(boid.x0_pos) * plane.normal() + 0.0001f * plane.normal(); boid.xc_vel.y() = mgr.GetActiveRandom()->Float() - 0.5f; boid.xc_vel.x() = mgr.GetActiveRandom()->Float() - 0.5f; @@ -233,7 +254,7 @@ void CFishCloud::PlaceBoid(CStateManager& mgr, CBoid& boid, const zeus::CAABox& } } else { if (!PointInBox(aabb, boid.x0_pos)) { - auto unAabb = GetUntransformedBoundingBox(); + const auto unAabb = GetUntransformedBoundingBox(); boid.x0_pos.z() = mgr.GetActiveRandom()->Float() * (unAabb.max.z() - unAabb.min.z()) + unAabb.min.z(); boid.x0_pos.y() = mgr.GetActiveRandom()->Float() * (unAabb.max.y() - unAabb.min.y()) + unAabb.min.y(); boid.x0_pos.x() = mgr.GetActiveRandom()->Float() * (unAabb.max.x() - unAabb.min.x()) + unAabb.min.x(); @@ -243,57 +264,75 @@ void CFishCloud::PlaceBoid(CStateManager& mgr, CBoid& boid, const zeus::CAABox& } void CFishCloud::ApplySeparation(CBoid& boid, const rstl::reserved_vector& nearList) const { - if (nearList.empty()) + if (nearList.empty()) { return; + } + float minDist = FLT_MAX; zeus::CVector3f pos; - for (CBoid* b : nearList) { - float dist = (boid.GetTranslation() - b->GetTranslation()).magSquared(); + for (const CBoid* b : nearList) { + const float dist = (boid.GetTranslation() - b->GetTranslation()).magSquared(); if (dist < minDist) { minDist = dist; pos = b->GetTranslation(); } } + ApplySeparation(boid, pos, x138_separationRadius, x144_separationMagnitude); } void CFishCloud::ApplySeparation(CBoid& boid, const zeus::CVector3f& separateFrom, float separationRadius, float separationMagnitude) const { - zeus::CVector3f delta = boid.GetTranslation() - separateFrom; - if (delta.canBeNormalized()) { - float deltaDistSq = delta.magSquared(); - float capDeltaDistSq = separationRadius * separationRadius; - if (deltaDistSq < capDeltaDistSq) - boid.xc_vel += (1.f - deltaDistSq / capDeltaDistSq) * delta.normalized() * separationMagnitude; + const zeus::CVector3f delta = boid.GetTranslation() - separateFrom; + if (!delta.canBeNormalized()) { + return; } + + const float deltaDistSq = delta.magSquared(); + const float capDeltaDistSq = separationRadius * separationRadius; + if (deltaDistSq >= capDeltaDistSq) { + return; + } + + boid.xc_vel += (1.f - deltaDistSq / capDeltaDistSq) * delta.normalized() * separationMagnitude; } void CFishCloud::ApplyCohesion(CBoid& boid, const rstl::reserved_vector& nearList) const { - if (nearList.empty()) + if (nearList.empty()) { return; + } + zeus::CVector3f avg; - for (CBoid* b : nearList) + for (const CBoid* b : nearList) { avg += b->GetTranslation(); + } + avg = avg / float(nearList.size()); ApplyCohesion(boid, avg, x138_separationRadius, x13c_cohesionMagnitude); } void CFishCloud::ApplyCohesion(CBoid& boid, const zeus::CVector3f& cohesionFrom, float cohesionRadius, float cohesionMagnitude) const { - zeus::CVector3f delta = cohesionFrom - boid.GetTranslation(); - if (delta.canBeNormalized()) { - float distSq = delta.magSquared(); - float capDistSq = cohesionRadius * cohesionRadius; - boid.xc_vel += ((distSq > capDistSq) ? 1.f : distSq / capDistSq) * delta.normalized() * cohesionMagnitude; + const zeus::CVector3f delta = cohesionFrom - boid.GetTranslation(); + if (!delta.canBeNormalized()) { + return; } + + const float distSq = delta.magSquared(); + const float capDistSq = cohesionRadius * cohesionRadius; + boid.xc_vel += ((distSq > capDistSq) ? 1.f : distSq / capDistSq) * delta.normalized() * cohesionMagnitude; } void CFishCloud::ApplyAlignment(CBoid& boid, const rstl::reserved_vector& nearList) const { - if (nearList.empty()) + if (nearList.empty()) { return; + } + zeus::CVector3f avg; - for (CBoid* b : nearList) + for (const CBoid* b : nearList) { avg += b->xc_vel; + } + avg = avg / float(nearList.size()); boid.xc_vel += zeus::CVector3f::getAngleDiff(boid.xc_vel, avg) / M_PIF * (avg * x140_alignmentWeight); @@ -301,12 +340,14 @@ void CFishCloud::ApplyAlignment(CBoid& boid, const rstl::reserved_vector capDistSq) ? 0.f : (1.f - distSq / capDistSq)) * delta.normalized() * attractionMagnitude; + const zeus::CVector3f delta = attractTo - boid.GetTranslation(); + if (!delta.canBeNormalized()) { + return; } + + const float distSq = delta.magSquared(); + const float capDistSq = attractionRadius * attractionRadius; + boid.xc_vel += ((distSq > capDistSq) ? 0.f : (1.f - distSq / capDistSq)) * delta.normalized() * attractionMagnitude; } void CFishCloud::ApplyRepulsion(CBoid& boid, const zeus::CVector3f& attractTo, @@ -316,74 +357,93 @@ void CFishCloud::ApplyRepulsion(CBoid& boid, const zeus::CVector3f& attractTo, void CFishCloud::ApplySwirl(CBoid& boid, const zeus::CVector3f& swirlPoint, bool clockwise, float magnitude, float radius) const { - zeus::CVector3f delta = boid.x0_pos - swirlPoint; - float deltaMag = delta.magnitude(); + const zeus::CVector3f delta = boid.x0_pos - swirlPoint; + const float deltaMag = delta.magnitude(); + zeus::CVector3f alignVec; - if (clockwise) + if (clockwise) { alignVec = delta.normalized().cross(zeus::skUp); - else + } else { alignVec = zeus::skUp.cross(delta / deltaMag); - float weight = deltaMag > radius ? 0.f : 1.f - deltaMag / radius; + } + + const float weight = deltaMag > radius ? 0.f : 1.f - deltaMag / radius; boid.xc_vel += zeus::CVector3f::getAngleDiff(boid.xc_vel, alignVec) / M_PIF * weight * (magnitude * alignVec); } void CFishCloud::ApplyContainment(CBoid& boid, const zeus::CAABox& aabb) const { - if (boid.xc_vel.canBeNormalized()) { - if (!PointInBox(aabb, boid.xc_vel.normalized() * x130_speed * x174_containmentRadius + boid.x0_pos)) { - ApplyAttraction(boid, aabb.center(), 100000.f, x158_containmentMagnitude); - } + if (!boid.xc_vel.canBeNormalized()) { + return; } + + if (PointInBox(aabb, boid.xc_vel.normalized() * x130_speed * x174_containmentRadius + boid.x0_pos)) { + return; + } + + ApplyAttraction(boid, aabb.center(), 100000.f, x158_containmentMagnitude); } void CFishCloud::ScatterBoid(CStateManager& mgr, CBoid& b) const { - float angle = (mgr.GetActiveRandom()->Float() - 0.5f) * M_PIF * x154_maxScatterAngle; - float cosAngle = std::cos(angle); - float sinAngle = std::sin(angle); + const float angle = (mgr.GetActiveRandom()->Float() - 0.5f) * M_PIF * x154_maxScatterAngle; + const float cosAngle = std::cos(angle); + const float sinAngle = std::sin(angle); b.xc_vel.x() += x150_scatterVel * (b.xc_vel.y() * sinAngle + b.xc_vel.x() * cosAngle); b.xc_vel.y() += x150_scatterVel * (b.xc_vel.y() * cosAngle + b.xc_vel.x() * sinAngle); } void CFishCloud::Think(float dt, CStateManager& mgr) { - if (!GetActive()) + if (!GetActive()) { return; + } + const CGameArea* area = mgr.GetWorld()->GetAreaAlways(x4_areaId); - auto occState = area->IsPostConstructed() ? area->GetOcclusionState() : CGameArea::EOcclusionState::Occluded; + const auto occState = area->IsPostConstructed() ? area->GetOcclusionState() : CGameArea::EOcclusionState::Occluded; if (occState == CGameArea::EOcclusionState::Visible) { x168_weaponRepelDamping = std::max(0.f, x168_weaponRepelDamping - x160_weaponRepelDampingSpeed * dt * 0.1f); - if (x250_26_enableWeaponRepelDamping) - x168_weaponRepelDamping = std::min(x160_weaponRepelDampingSpeed * dt + x168_weaponRepelDamping, - x148_weaponRepelMagnitude); + if (x250_26_enableWeaponRepelDamping) { + x168_weaponRepelDamping = + std::min(x160_weaponRepelDampingSpeed * dt + x168_weaponRepelDamping, x148_weaponRepelMagnitude); + } + x164_playerRepelDamping = std::max(0.f, x164_playerRepelDamping - x15c_playerRepelDampingSpeed * dt * 0.1f); - if (x250_30_enablePlayerRepelDamping) - x164_playerRepelDamping = std::min(x15c_playerRepelDampingSpeed * dt + x164_playerRepelDamping, - x14c_playerRepelMagnitude); + if (x250_30_enablePlayerRepelDamping) { + x164_playerRepelDamping = + std::min(x15c_playerRepelDampingSpeed * dt + x164_playerRepelDamping, x14c_playerRepelMagnitude); + } + x250_26_enableWeaponRepelDamping = false; x250_30_enablePlayerRepelDamping = false; ++x118_thinkCounter; + UpdateParticles(dt); UpdatePartitionList(); - zeus::CAABox aabb = GetBoundingBox(); + + const zeus::CAABox aabb = GetBoundingBox(); int idx = 0; for (auto& b : xe8_boids) { if (b.x20_active && (idx & x11c_updateMask) == (x118_thinkCounter & x11c_updateMask)) { rstl::reserved_vector nearList; - if (x250_31_updateWithoutPartitions) + if (x250_31_updateWithoutPartitions) { BuildBoidNearList(b.x0_pos, x138_separationRadius, nearList); - else + } else { BuildBoidNearPartitionList(b.x0_pos, x138_separationRadius, nearList); + } + for (int i = 0; i < 5; ++i) { switch (i) { case 1: ApplySeparation(b, nearList); break; case 2: - if (!x250_24_randomMovement || mgr.GetActiveRandom()->Float() > x12c_randomMovementTimer) + if (!x250_24_randomMovement || mgr.GetActiveRandom()->Float() > x12c_randomMovementTimer) { ApplyCohesion(b, nearList); + } break; case 3: - if (!x250_24_randomMovement || mgr.GetActiveRandom()->Float() > x12c_randomMovementTimer) + if (!x250_24_randomMovement || mgr.GetActiveRandom()->Float() > x12c_randomMovementTimer) { ApplyAlignment(b, nearList); + } break; case 4: ScatterBoid(mgr, b); @@ -391,12 +451,14 @@ void CFishCloud::Think(float dt, CStateManager& mgr) { default: break; } - if (b.xc_vel.magSquared() > 3.2f) + if (b.xc_vel.magSquared() > 3.2f) { break; + } } + if (!x250_24_randomMovement && b.xc_vel.magSquared() < 3.2f) { - for (auto& m : x108_modifierSources) { - if (TCastToPtr act = mgr.ObjectById(m.x0_source)) { + for (const auto& m : x108_modifierSources) { + if (const TCastToConstPtr act = mgr.ObjectById(m.x0_source)) { if (m.xd_isSwirl) { ApplySwirl(b, act->GetTranslation(), m.xc_isRepulsor, m.x8_priority, m.x4_radius); } else if (m.xc_isRepulsor) { @@ -416,28 +478,34 @@ void CFishCloud::Think(float dt, CStateManager& mgr) { } ++idx; } + for (auto& b : xe8_boids) { if (b.x20_active) { ApplyContainment(b, aabb); - float velMag = b.xc_vel.magnitude(); - if (!zeus::close_enough(velMag, 0.f)) + const float velMag = b.xc_vel.magnitude(); + if (!zeus::close_enough(velMag, 0.f)) { b.xc_vel = b.xc_vel / velMag; + } b.xc_vel.z() *= 0.99f; } } + if (x12c_randomMovementTimer > 0.f) { x12c_randomMovementTimer -= dt; } else { x12c_randomMovementTimer = 0.f; x250_24_randomMovement = false; } + for (auto& b : xe8_boids) { if (b.x20_active) { b.x0_pos += b.xc_vel * dt * x130_speed; - if (!PointInBox(aabb, b.x0_pos)) + if (!PointInBox(aabb, b.x0_pos)) { PlaceBoid(mgr, b, aabb); + } } } + if (x250_27_validModel) { for (auto& m : x1b0_models) { m->GetAnimationData()->SetPlaybackRate(1.f); @@ -455,8 +523,8 @@ void CFishCloud::AllocateSkinnedModels(CStateManager& mgr, CModelData::EWhichMod int idx = 0; for (auto& m : x1b0_models) { m->EnableLooping(true); - m->AdvanceAnimation( - m->GetAnimationData()->GetAnimTimeRemaining("Whole Body"sv) * 0.25f * idx, mgr, x4_areaId, true); + m->AdvanceAnimation(m->GetAnimationData()->GetAnimTimeRemaining("Whole Body"sv) * 0.25f * float(idx), mgr, + x4_areaId, true); ++idx; } x230_whichModel = which; @@ -467,10 +535,10 @@ void CFishCloud::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CSt switch (msg) { case EScriptObjectMessage::Registered: { xe8_boids.reserve(x134_numBoids); - zeus::CAABox aabb = GetUntransformedBoundingBox(); - zeus::CVector3f extent = aabb.max - aabb.min; + const zeus::CAABox aabb = GetUntransformedBoundingBox(); + const zeus::CVector3f extent = aabb.max - aabb.min; zeus::CVector3f randPoint; - for (int i = 0; i < x134_numBoids; ++i) { + for (u32 i = 0; i < x134_numBoids; ++i) { randPoint.z() = mgr.GetActiveRandom()->Float() * extent.z() + aabb.min.z(); randPoint.y() = mgr.GetActiveRandom()->Float() * extent.y() + aabb.min.y(); randPoint.x() = mgr.GetActiveRandom()->Float() * extent.x() + aabb.min.x(); @@ -481,8 +549,9 @@ void CFishCloud::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId sender, CSt 0.2f * std::pow(mgr.GetActiveRandom()->Float(), 7.f) + 0.9f); } CreatePartitionList(); - if (x250_27_validModel) + if (x250_27_validModel) { AllocateSkinnedModels(mgr, CModelData::EWhichModel::Normal); + } break; } default: @@ -501,22 +570,26 @@ void CFishCloud::PreRender(CStateManager& mgr, const zeus::CFrustum& frustum) { } void CFishCloud::AddParticlesToRenderer() const { - for (const auto& p : x1f8_particleGens) + for (const auto& p : x1f8_particleGens) { g_Renderer->AddParticleGen(*p); + } } void CFishCloud::RenderBoid(int idx, const CBoid& boid, u32& drawMask, bool thermalHot, const CModelFlags& flags) const { - u32 modelIndex = idx & 0x3; + const u32 modelIndex = idx & 0x3; CModelData& mData = *x1b0_models[modelIndex]; CSkinnedModel& model = mData.PickAnimatedModel(CModelData::EWhichModel::Normal); - if (!model.GetModelInst()->TryLockTextures()) + if (!model.GetModelInst()->TryLockTextures()) { return; - u32 thisDrawMask = 1u << modelIndex; - if (drawMask & thisDrawMask) { + } + + const u32 thisDrawMask = 1u << modelIndex; + if ((drawMask & thisDrawMask) != 0) { drawMask &= ~thisDrawMask; mData.GetAnimationData()->BuildPose(); } + model.GetModelInst()->SetAmbientColor(zeus::skWhite); CGraphics::SetModelMatrix(zeus::lookAt(boid.x0_pos, boid.x0_pos + boid.xc_vel)); if (thermalHot) { @@ -528,24 +601,31 @@ void CFishCloud::RenderBoid(int idx, const CBoid& boid, u32& drawMask, } void CFishCloud::Render(CStateManager& mgr) { - if (!GetActive()) + if (!GetActive()) { return; + } + SCOPED_GRAPHICS_DEBUG_GROUP(fmt::format(FMT_STRING("CFishCloud::Render {} {} {}"), x8_uid, xc_editorId, x10_name).c_str(), zeus::skOrange); - bool thermalHot = mgr.GetThermalDrawFlag() == EThermalDrawFlag::Hot; + + const bool thermalHot = mgr.GetThermalDrawFlag() == EThermalDrawFlag::Hot; CModelFlags flags(0, 0, 3, zeus::skWhite); - if (mgr.GetPlayerState()->GetActiveVisor(mgr) == CPlayerState::EPlayerVisor::XRay) + if (mgr.GetPlayerState()->GetActiveVisor(mgr) == CPlayerState::EPlayerVisor::XRay) { flags = CModelFlags(5, 0, 3, x16c_color); - else + } else { flags = CModelFlags(1, 0, 3, x16c_color); + } + AddParticlesToRenderer(); + if (x250_27_validModel) { // Ambient white int idx = 0; u32 drawMask = 0xffffffff; for (const auto& b : xe8_boids) { - if (b.x20_active) + if (b.x20_active) { RenderBoid(idx, b, drawMask, thermalHot, flags); + } ++idx; } } else { @@ -595,35 +675,41 @@ void CFishCloud::KillBoid(CBoid& b) const { void CFishCloud::Touch(CActor& other, CStateManager& mgr) { CActor::Touch(other, mgr); - if (TCastToPtr weap = other) { + + if (const TCastToConstPtr weap = other) { if (!x250_26_enableWeaponRepelDamping && x250_29_repelFromThreats) { int idx = 0; for (auto& b : xe8_boids) { - if ((idx & 0x3) == (x118_thinkCounter & 0x3)) + if ((idx & 0x3) == (x118_thinkCounter & 0x3)) { ApplyRepulsion(b, weap->GetTranslation(), 8.f, x148_weaponRepelMagnitude - x168_weaponRepelDamping); + } ++idx; } } + x250_26_enableWeaponRepelDamping = true; + if (x250_28_killable) { - if (auto tb = weap->GetTouchBounds()) { + if (const auto tb = weap->GetTouchBounds()) { for (auto& b : xe8_boids) { - if (b.x20_active && - tb->intersects(zeus::CAABox(weap->GetTranslation() - x170_weaponKillRadius, - weap->GetTranslation() + x170_weaponKillRadius))) + if (b.x20_active && tb->intersects(zeus::CAABox(weap->GetTranslation() - x170_weaponKillRadius, + weap->GetTranslation() + x170_weaponKillRadius))) { KillBoid(b); + } } } } } + if (x250_29_repelFromThreats) { - if (TCastToPtr player = other) { - zeus::CVector3f playerPos = player->GetTranslation(); + if (const TCastToConstPtr player = other) { + const zeus::CVector3f playerPos = player->GetTranslation(); for (auto& b : xe8_boids) { zeus::CVector3f adjPlayerPos = playerPos; - float zDelta = b.x0_pos.z() - adjPlayerPos.z(); - if (zDelta > 0.f && zDelta < 2.3f) + const float zDelta = b.x0_pos.z() - adjPlayerPos.z(); + if (zDelta > 0.f && zDelta < 2.3f) { adjPlayerPos.z() = float(b.x0_pos.z()); + } adjPlayerPos.x() += mgr.GetActiveRandom()->Float() * 0.2f - 0.1f; adjPlayerPos.y() += mgr.GetActiveRandom()->Float() * 0.2f - 0.1f; ApplyRepulsion(b, adjPlayerPos, 8.f, x14c_playerRepelMagnitude - x164_playerRepelDamping); @@ -634,7 +720,7 @@ void CFishCloud::Touch(CActor& other, CStateManager& mgr) { } zeus::CAABox CFishCloud::GetUntransformedBoundingBox() const { - zeus::CVector3f extent = x120_scale * 0.75f; + const zeus::CVector3f extent = x120_scale * 0.75f; return zeus::CAABox(-extent, extent); } @@ -643,46 +729,62 @@ zeus::CAABox CFishCloud::GetBoundingBox() const { } void CFishCloud::RemoveRepulsor(TUniqueId sourceId) { - CModifierSource source(sourceId, true, false, 0.f, 0.f); - auto it = rstl::binary_find(x108_modifierSources.begin(), x108_modifierSources.end(), source); - if (it != x108_modifierSources.end()) - x108_modifierSources.erase(it); + const CModifierSource source(sourceId, true, false, 0.f, 0.f); + const auto it = rstl::binary_find(x108_modifierSources.begin(), x108_modifierSources.end(), source); + + if (it == x108_modifierSources.end()) { + return; + } + + x108_modifierSources.erase(it); } void CFishCloud::RemoveAttractor(TUniqueId sourceId) { - CModifierSource source(sourceId, false, false, 0.f, 0.f); - auto it = rstl::binary_find(x108_modifierSources.begin(), x108_modifierSources.end(), source); - if (it != x108_modifierSources.end()) - x108_modifierSources.erase(it); + const CModifierSource source(sourceId, false, false, 0.f, 0.f); + const auto it = rstl::binary_find(x108_modifierSources.begin(), x108_modifierSources.end(), source); + + if (it == x108_modifierSources.end()) { + return; + } + + x108_modifierSources.erase(it); } bool CFishCloud::AddRepulsor(TUniqueId sourceId, bool swirl, float radius, float priority) { - CModifierSource source(sourceId, true, swirl, radius, priority); - auto it = rstl::binary_find(x108_modifierSources.begin(), x108_modifierSources.end(), source); + const CModifierSource source(sourceId, true, swirl, radius, priority); + const auto it = rstl::binary_find(x108_modifierSources.begin(), x108_modifierSources.end(), source); + if (it != x108_modifierSources.end()) { it->x4_radius = radius; it->x8_priority = priority; return true; - } else if (x108_modifierSources.size() < x108_modifierSources.capacity()) { - x108_modifierSources.insert(std::lower_bound( - x108_modifierSources.begin(), x108_modifierSources.end(), source), source); + } + + if (x108_modifierSources.size() < x108_modifierSources.capacity()) { + x108_modifierSources.insert(std::lower_bound(x108_modifierSources.begin(), x108_modifierSources.end(), source), + source); return true; } + return false; } bool CFishCloud::AddAttractor(TUniqueId sourceId, bool swirl, float radius, float priority) { - CModifierSource source(sourceId, false, swirl, radius, priority); - auto it = rstl::binary_find(x108_modifierSources.begin(), x108_modifierSources.end(), source); + const CModifierSource source(sourceId, false, swirl, radius, priority); + const auto it = rstl::binary_find(x108_modifierSources.begin(), x108_modifierSources.end(), source); + if (it != x108_modifierSources.end()) { it->x4_radius = radius; it->x8_priority = priority; return true; - } else if (x108_modifierSources.size() < x108_modifierSources.capacity()) { - x108_modifierSources.insert(std::lower_bound( - x108_modifierSources.begin(), x108_modifierSources.end(), source), source); + } + + if (x108_modifierSources.size() < x108_modifierSources.capacity()) { + x108_modifierSources.insert(std::lower_bound(x108_modifierSources.begin(), x108_modifierSources.end(), source), + source); return true; } + return false; } From 529d7e58bdee7e18f08735219e71f0f832513849 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 17 Apr 2020 00:49:03 -0400 Subject: [PATCH 202/224] CFishCloud: Initialize x230_whichModel on construction Provides a deterministic initial state. --- Runtime/World/CFishCloud.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/World/CFishCloud.hpp b/Runtime/World/CFishCloud.hpp index a26eaef6f..5d8dcc42f 100644 --- a/Runtime/World/CFishCloud.hpp +++ b/Runtime/World/CFishCloud.hpp @@ -80,7 +80,7 @@ class CFishCloud : public CActor { rstl::reserved_vector, 4> x1c4_particleDescs; rstl::reserved_vector, 4> x1f8_particleGens; rstl::reserved_vector x21c_deathParticleCounts; - CModelData::EWhichModel x230_whichModel; + CModelData::EWhichModel x230_whichModel{}; u16 x234_deathSfx; zeus::CVector3f x238_partitionPitch; zeus::CVector3f x244_ooPartitionPitch; From 49cc019699225a4368db5af8121d60e0968c965c Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 17 Apr 2020 00:58:27 -0400 Subject: [PATCH 203/224] CKnockBackController: Make GetKnockBackCharacterState() a const member function This doesn't modify internal instance state, so this can be made const. --- Runtime/World/CKnockBackController.cpp | 5 +++-- Runtime/World/CKnockBackController.hpp | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Runtime/World/CKnockBackController.cpp b/Runtime/World/CKnockBackController.cpp index 61503a15b..8de40cd51 100644 --- a/Runtime/World/CKnockBackController.cpp +++ b/Runtime/World/CKnockBackController.cpp @@ -400,9 +400,10 @@ bool CKnockBackController::TickDeferredTimer(float dt) { return false; } -EKnockBackCharacterState CKnockBackController::GetKnockBackCharacterState(CPatterned& parent) { - if (parent.GetBodyController()->IsFrozen()) +EKnockBackCharacterState CKnockBackController::GetKnockBackCharacterState(const CPatterned& parent) const { + if (parent.GetBodyController()->IsFrozen()) { return parent.IsAlive() ? EKnockBackCharacterState::FrozenAlive : EKnockBackCharacterState::FrozenDead; + } return parent.IsAlive() ? EKnockBackCharacterState::Alive : EKnockBackCharacterState::Dead; } diff --git a/Runtime/World/CKnockBackController.hpp b/Runtime/World/CKnockBackController.hpp index b4a9601e9..54c8b30c2 100644 --- a/Runtime/World/CKnockBackController.hpp +++ b/Runtime/World/CKnockBackController.hpp @@ -99,7 +99,7 @@ private: bool x82_26_locomotionDuringElectrocution : 1; void ApplyImpulse(float dt, CPatterned& parent); bool TickDeferredTimer(float dt); - EKnockBackCharacterState GetKnockBackCharacterState(CPatterned& parent); + EKnockBackCharacterState GetKnockBackCharacterState(const CPatterned& parent) const; void ValidateState(CPatterned& parent); float CalculateExtraHurlVelocity(CStateManager& mgr, float magnitude, float kbResistance); void DoKnockBackAnimation(const zeus::CVector3f& backVec, CStateManager& mgr, CPatterned& parent, float magnitude); From b55d1e4c7798b80d5385872978daf5ff796f2c4a Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 17 Apr 2020 01:03:10 -0400 Subject: [PATCH 204/224] CKnockBackController: Make use of const references where applicable In many cases the CPatterned& parameter is only used for read-only querying. We can make this explicit in the interface. --- Runtime/World/CKnockBackController.cpp | 21 ++++++++++++--------- Runtime/World/CKnockBackController.hpp | 6 +++--- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/Runtime/World/CKnockBackController.cpp b/Runtime/World/CKnockBackController.cpp index 8de40cd51..3792ad3f2 100644 --- a/Runtime/World/CKnockBackController.cpp +++ b/Runtime/World/CKnockBackController.cpp @@ -407,7 +407,7 @@ EKnockBackCharacterState CKnockBackController::GetKnockBackCharacterState(const return parent.IsAlive() ? EKnockBackCharacterState::Alive : EKnockBackCharacterState::Dead; } -void CKnockBackController::ValidateState(CPatterned& parent) { +void CKnockBackController::ValidateState(const CPatterned& parent) { if (x4_activeParms.x0_animState < x18_minAnimState) x4_activeParms.x0_animState = x18_minAnimState; else if (x4_activeParms.x0_animState > x1c_maxAnimState) @@ -518,7 +518,8 @@ void CKnockBackController::DoKnockBackAnimation(const zeus::CVector3f& backVec, } } -void CKnockBackController::ResetKnockBackImpulse(CPatterned& parent, const zeus::CVector3f& backVec, float magnitude) { +void CKnockBackController::ResetKnockBackImpulse(const CPatterned& parent, const zeus::CVector3f& backVec, + float magnitude) { if (x81_24_autoResetImpulse && x4_activeParms.x0_animState == EKnockBackAnimationState::KnockBack && x4_activeParms.x4_animFollowup != EKnockBackAnimationFollowUp::Freeze) { x50_impulseDir = backVec.canBeNormalized() ? backVec.normalized() : -parent.GetTransform().basis[1]; @@ -609,16 +610,18 @@ EKnockBackWeaponType CKnockBackController::GetKnockBackWeaponType(const CDamageI } } -void CKnockBackController::SelectDamageState(CPatterned& parent, const CDamageInfo& info, EWeaponType wType, +void CKnockBackController::SelectDamageState(const CPatterned& parent, const CDamageInfo& info, EWeaponType wType, EKnockBackType type) { - x4_activeParms = KnockBackParms(); - EKnockBackWeaponType weaponType = GetKnockBackWeaponType(info, wType, type); - if (weaponType != EKnockBackWeaponType::Invalid) { - x4_activeParms = - KnockBackParmsTable[size_t(x0_variant)][size_t(weaponType)][size_t(GetKnockBackCharacterState(parent))]; - ValidateState(parent); + + const EKnockBackWeaponType weaponType = GetKnockBackWeaponType(info, wType, type); + if (weaponType == EKnockBackWeaponType::Invalid) { + return; } + + x4_activeParms = + KnockBackParmsTable[size_t(x0_variant)][size_t(weaponType)][size_t(GetKnockBackCharacterState(parent))]; + ValidateState(parent); } void CKnockBackController::KnockBack(const zeus::CVector3f& backVec, CStateManager& mgr, CPatterned& parent, diff --git a/Runtime/World/CKnockBackController.hpp b/Runtime/World/CKnockBackController.hpp index 54c8b30c2..07fc160cc 100644 --- a/Runtime/World/CKnockBackController.hpp +++ b/Runtime/World/CKnockBackController.hpp @@ -100,13 +100,13 @@ private: void ApplyImpulse(float dt, CPatterned& parent); bool TickDeferredTimer(float dt); EKnockBackCharacterState GetKnockBackCharacterState(const CPatterned& parent) const; - void ValidateState(CPatterned& parent); + void ValidateState(const CPatterned& parent); float CalculateExtraHurlVelocity(CStateManager& mgr, float magnitude, float kbResistance); void DoKnockBackAnimation(const zeus::CVector3f& backVec, CStateManager& mgr, CPatterned& parent, float magnitude); - void ResetKnockBackImpulse(CPatterned& parent, const zeus::CVector3f& backVec, float magnitude); + void ResetKnockBackImpulse(const CPatterned& parent, const zeus::CVector3f& backVec, float magnitude); void DoDeferredKnockBack(CStateManager& mgr, CPatterned& parent); EKnockBackWeaponType GetKnockBackWeaponType(const CDamageInfo& info, EWeaponType wType, EKnockBackType type); - void SelectDamageState(CPatterned& parent, const CDamageInfo& info, EWeaponType wType, EKnockBackType type); + void SelectDamageState(const CPatterned& parent, const CDamageInfo& info, EWeaponType wType, EKnockBackType type); public: explicit CKnockBackController(EKnockBackVariant variant); From 58040eb53db7e433b277ee31d96786cd3f679a56 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 17 Apr 2020 01:05:47 -0400 Subject: [PATCH 205/224] CKnockBackController: Make CalculateExtraHurlVelocity() a const member function This doesn't modify internal member state, so it can be marked const While we're at it we can also invert the conditional to unindent the main calculation. --- Runtime/World/CKnockBackController.cpp | 10 ++++++---- Runtime/World/CKnockBackController.hpp | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Runtime/World/CKnockBackController.cpp b/Runtime/World/CKnockBackController.cpp index 3792ad3f2..18ec84b05 100644 --- a/Runtime/World/CKnockBackController.cpp +++ b/Runtime/World/CKnockBackController.cpp @@ -473,10 +473,12 @@ void CKnockBackController::ValidateState(const CPatterned& parent) { } } -float CKnockBackController::CalculateExtraHurlVelocity(CStateManager& mgr, float magnitude, float kbResistance) { - if (magnitude > kbResistance) - return (1.1f - 0.2f * mgr.GetActiveRandom()->Float()) * 2.f * (magnitude - kbResistance); - return 0.f; +float CKnockBackController::CalculateExtraHurlVelocity(CStateManager& mgr, float magnitude, float kbResistance) const { + if (magnitude <= kbResistance) { + return 0.f; + } + + return (1.1f - 0.2f * mgr.GetActiveRandom()->Float()) * 2.f * (magnitude - kbResistance); } void CKnockBackController::DoKnockBackAnimation(const zeus::CVector3f& backVec, CStateManager& mgr, CPatterned& parent, diff --git a/Runtime/World/CKnockBackController.hpp b/Runtime/World/CKnockBackController.hpp index 07fc160cc..d8bfd46b8 100644 --- a/Runtime/World/CKnockBackController.hpp +++ b/Runtime/World/CKnockBackController.hpp @@ -101,7 +101,7 @@ private: bool TickDeferredTimer(float dt); EKnockBackCharacterState GetKnockBackCharacterState(const CPatterned& parent) const; void ValidateState(const CPatterned& parent); - float CalculateExtraHurlVelocity(CStateManager& mgr, float magnitude, float kbResistance); + float CalculateExtraHurlVelocity(CStateManager& mgr, float magnitude, float kbResistance) const; void DoKnockBackAnimation(const zeus::CVector3f& backVec, CStateManager& mgr, CPatterned& parent, float magnitude); void ResetKnockBackImpulse(const CPatterned& parent, const zeus::CVector3f& backVec, float magnitude); void DoDeferredKnockBack(CStateManager& mgr, CPatterned& parent); From a06594f404f9c2aa1c815635e5604cbe964a8937 Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Fri, 17 Apr 2020 05:53:22 -0700 Subject: [PATCH 206/224] Fix CAutoMapper strings, disable saving on non-USA/GC versions --- Runtime/AutoMapper/CAutoMapper.cpp | 12 ++++++------ Runtime/CStateManager.cpp | 2 +- Runtime/MP1/CFrontEndUI.cpp | 27 ++++++++++++++++++++++++--- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/Runtime/AutoMapper/CAutoMapper.cpp b/Runtime/AutoMapper/CAutoMapper.cpp index d018c6bd6..f13e03012 100644 --- a/Runtime/AutoMapper/CAutoMapper.cpp +++ b/Runtime/AutoMapper/CAutoMapper.cpp @@ -1049,13 +1049,13 @@ void CAutoMapper::ProcessControllerInput(const CFinalInput& input, CStateManager } else { x2fc_textpane_hint->TextSupport().SetText(u""); std::u16string str = fmt::format(FMT_STRING(u"&image=SI,0.6,1.0,{};"), g_tweakPlayerRes->x24_lStick[x2e4_lStickPos]); - str += g_MainStringTable->GetString(46); // Rotate + str += g_MainStringTable->GetString(46 + (!g_Main->IsUSA() || g_Main->IsTrilogy())); // Rotate x300_textpane_instructions->TextSupport().SetText(str); str = fmt::format(FMT_STRING(u"&image=SI,0.6,1.0,{};"), g_tweakPlayerRes->x4c_cStick[x2e8_rStickPos]); - str += g_MainStringTable->GetString(47); // Move + str += g_MainStringTable->GetString(47 + (!g_Main->IsUSA() || g_Main->IsTrilogy())); // Move x304_textpane_instructions1->TextSupport().SetText(str); str = fmt::format(FMT_STRING(u"&image={};"), g_tweakPlayerRes->x74_lTrigger[x2ec_lTriggerPos]); - str += g_MainStringTable->GetString(48); // Zoom + str += g_MainStringTable->GetString(48 + (!g_Main->IsUSA() || g_Main->IsTrilogy())); // Zoom str += fmt::format(FMT_STRING(u"&image={};"), g_tweakPlayerRes->x80_rTrigger[x2f0_rTriggerPos]); x308_textpane_instructions2->TextSupport().SetText(str); } @@ -1104,10 +1104,10 @@ void CAutoMapper::Update(float dt, CStateManager& mgr) { m_frmeInitialized = true; static_cast(x28_frmeMapScreen->FindWidget("textpane_left")) ->TextSupport() - .SetText(g_MainStringTable->GetString(42)); + .SetText(g_MainStringTable->GetString(42 + (!g_Main->IsUSA() || g_Main->IsTrilogy()))); static_cast(x28_frmeMapScreen->FindWidget("textpane_yicon")) ->TextSupport() - .SetText(g_MainStringTable->GetString(43)); + .SetText(g_MainStringTable->GetString(43 + (!g_Main->IsUSA() || g_Main->IsTrilogy()))); x2fc_textpane_hint = static_cast(x28_frmeMapScreen->FindWidget("textpane_hint")); x300_textpane_instructions = static_cast(x28_frmeMapScreen->FindWidget("textpane_instructions")); x304_textpane_instructions1 = static_cast(x28_frmeMapScreen->FindWidget("textpane_instructions1")); @@ -1115,7 +1115,7 @@ void CAutoMapper::Update(float dt, CStateManager& mgr) { CGuiTextPane* mapLegend = static_cast(x28_frmeMapScreen->FindWidget("textpane_mapLegend")); mapLegend->TextSupport().ClearRenderBuffer(); mapLegend->TextSupport().SetImageBaseline(true); - mapLegend->TextSupport().SetText(g_MainStringTable->GetString(49)); + mapLegend->TextSupport().SetText(g_MainStringTable->GetString(49 + (!g_Main->IsUSA() || g_Main->IsTrilogy()))); x30c_basewidget_leftPane = x28_frmeMapScreen->FindWidget("basewidget_leftPane"); x310_basewidget_yButtonPane = x28_frmeMapScreen->FindWidget("basewidget_yButtonPane"); x314_basewidget_bottomPane = x28_frmeMapScreen->FindWidget("basewidget_bottomPane"); diff --git a/Runtime/CStateManager.cpp b/Runtime/CStateManager.cpp index 2b5ebc9ea..a82c4a470 100644 --- a/Runtime/CStateManager.cpp +++ b/Runtime/CStateManager.cpp @@ -2580,7 +2580,7 @@ std::pair CStateManager::CalculateScanCompletionRate() const { void CStateManager::SetBossParams(TUniqueId bossId, float maxEnergy, u32 stringIdx) { xf18_bossId = bossId; xf1c_totalBossEnergy = maxEnergy; - xf20_bossStringIdx = stringIdx; + xf20_bossStringIdx = stringIdx - (g_Main->IsUSA() && !g_Main->IsTrilogy() ? 0 : 6); } float CStateManager::IntegrateVisorFog(float f) const { diff --git a/Runtime/MP1/CFrontEndUI.cpp b/Runtime/MP1/CFrontEndUI.cpp index 66460502a..30065b8af 100644 --- a/Runtime/MP1/CFrontEndUI.cpp +++ b/Runtime/MP1/CFrontEndUI.cpp @@ -125,6 +125,16 @@ void CFrontEndUI::SNewFileSelectFrame::FinishedLoading() { x20_tablegroup_fileselect = static_cast(x1c_loadedFrame->FindWidget("tablegroup_fileselect")); x24_model_erase = static_cast(x1c_loadedFrame->FindWidget("model_erase")); xf8_model_erase_position = x24_model_erase->GetLocalPosition(); + + // TODO: Implement language menu + auto langPair = FindTextPanePair(x1c_loadedFrame, "textpane_lang"); + if (langPair.x0_panes[0] != nullptr) { + langPair.x0_panes[0]->SetIsSelectable(false); + langPair.x0_panes[0]->SetIsVisible(false); + langPair.x0_panes[1]->SetIsSelectable(false); + langPair.x0_panes[1]->SetIsVisible(false); + } + x28_textpane_erase = FindTextPanePair(x1c_loadedFrame, "textpane_erase"); x38_textpane_gba = FindTextPanePair(x1c_loadedFrame, "textpane_gba"); x30_textpane_cheats = FindTextPanePair(x1c_loadedFrame, "textpane_cheats"); @@ -1177,14 +1187,25 @@ void CFrontEndUI::SFrontEndFrame::FinishedLoading() { x14_loadedFrme->SetAspectConstraint(1.78f); x18_tablegroup_mainmenu = static_cast(x14_loadedFrme->FindWidget("tablegroup_mainmenu")); - x1c_gbaPair = FindTextPanePair(x14_loadedFrme, "textpane_gba"); + //TODO: HACK: Implement language menu so this isn't necessary + if (g_Main->IsUSA() && !g_Main->IsTrilogy()) { + x1c_gbaPair = FindTextPanePair(x14_loadedFrme, "textpane_gba"); + } else { + x1c_gbaPair = FindTextPanePair(x14_loadedFrme, "textpane_lang"); + } x1c_gbaPair.SetPairText(g_MainStringTable->GetString(37)); - x24_cheatPair = FindTextPanePair(x14_loadedFrme, "textpane_cheats"); + //TODO: HACK: Implement language menu so this isn't necessary + if (g_Main->IsUSA() && !g_Main->IsTrilogy()) { + x24_cheatPair = FindTextPanePair(x14_loadedFrme, "textpane_cheats"); + } else { + x24_cheatPair = FindTextPanePair(x14_loadedFrme, "textpane_options"); + } x24_cheatPair.SetPairText(g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 96 : 90)); FindAndSetPairText(x14_loadedFrme, "textpane_start", g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 67 : 61)); - FindAndSetPairText(x14_loadedFrme, "textpane_options", + //TODO: HACK: Implement language menu so this isn't necessary + FindAndSetPairText(x14_loadedFrme, (g_Main->IsUSA() && !g_Main->IsTrilogy()) ? "textpane_options" : "textpane_gba", g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 94 : 88)); FindAndSetPairText(x14_loadedFrme, "textpane_title", g_MainStringTable->GetString((g_Main->IsUSA() && !g_Main->IsTrilogy()) ? 98 : 92)); From 26ac3b166d761304f1a835c0eeb78b1ede66c45b Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 17 Apr 2020 13:12:17 -0400 Subject: [PATCH 207/224] CKnockBackController: Make use of braces where applicable Makes code more consistent. Where applicable we can also unindent code. --- Runtime/World/CKnockBackController.cpp | 76 ++++++++++++++++---------- 1 file changed, 46 insertions(+), 30 deletions(-) diff --git a/Runtime/World/CKnockBackController.cpp b/Runtime/World/CKnockBackController.cpp index 18ec84b05..18cbc80e9 100644 --- a/Runtime/World/CKnockBackController.cpp +++ b/Runtime/World/CKnockBackController.cpp @@ -380,23 +380,29 @@ CKnockBackController::CKnockBackController(EKnockBackVariant variant) void CKnockBackController::ApplyImpulse(float dt, CPatterned& parent) { x60_impulseRemTime = std::max(0.f, x60_impulseRemTime - dt); - if (!parent.GetMaterialList().HasMaterial(EMaterialTypes::Immovable) && x60_impulseRemTime > 0.f) { - float remFac = 1.f; - if (x20_impulseDurationIdx == 1) - remFac = x60_impulseRemTime / ImpulseDurationTable[x20_impulseDurationIdx]; - parent.ApplyImpulseWR( - parent.GetMoveToORImpulseWR( - parent.GetTransform().transposeRotate( - x50_impulseDir * (remFac * x5c_impulseMag * dt / ImpulseDurationTable[x20_impulseDurationIdx])), - dt), - zeus::CAxisAngle()); + + if (parent.GetMaterialList().HasMaterial(EMaterialTypes::Immovable) || x60_impulseRemTime <= 0.f) { + return; } + + float remFac = 1.f; + if (x20_impulseDurationIdx == 1) { + remFac = x60_impulseRemTime / ImpulseDurationTable[x20_impulseDurationIdx]; + } + + parent.ApplyImpulseWR( + parent.GetMoveToORImpulseWR( + parent.GetTransform().transposeRotate( + x50_impulseDir * (remFac * x5c_impulseMag * dt / ImpulseDurationTable[x20_impulseDurationIdx])), + dt), + zeus::CAxisAngle()); } bool CKnockBackController::TickDeferredTimer(float dt) { x68_deferRemTime -= dt; - if (x14_deferWeaponType != EWeaponType::None) + if (x14_deferWeaponType != EWeaponType::None) { return x68_deferRemTime <= 0.f; + } return false; } @@ -408,12 +414,13 @@ EKnockBackCharacterState CKnockBackController::GetKnockBackCharacterState(const } void CKnockBackController::ValidateState(const CPatterned& parent) { - if (x4_activeParms.x0_animState < x18_minAnimState) + if (x4_activeParms.x0_animState < x18_minAnimState) { x4_activeParms.x0_animState = x18_minAnimState; - else if (x4_activeParms.x0_animState > x1c_maxAnimState) + } else if (x4_activeParms.x0_animState > x1c_maxAnimState) { x4_activeParms.x0_animState = x1c_maxAnimState; + } - EKnockBackAnimationState useState = EKnockBackAnimationState::Invalid; + auto useState = EKnockBackAnimationState::Invalid; if (parent.IsAlive()) { if (parent.GetBodyController()->HasBodyState(pas::EAnimationState::Hurled) && x80_availableStates.test(3) && x4_activeParms.x0_animState >= EKnockBackAnimationState::Hurled) { @@ -490,7 +497,7 @@ void CKnockBackController::DoKnockBackAnimation(const zeus::CVector3f& backVec, hurlVel += CalculateExtraHurlVelocity(mgr, magnitude, hInfo->GetKnockbackResistance()); } hurlVel = std::sqrt(parent.GetGravityConstant() * 0.5f * hurlVel); - zeus::CVector3f backUpVec = backVec + backVec.magnitude() * zeus::skUp; + const zeus::CVector3f backUpVec = backVec + backVec.magnitude() * zeus::skUp; if (backUpVec.canBeNormalized()) { parent.GetBodyController()->GetCommandMgr().DeliverCmd(CBCHurledCmd(-backVec, backUpVec.normalized() * hurlVel)); parent.SetMomentumWR({0.f, 0.f, parent.GetGravityConstant() * -parent.GetMass()}); @@ -506,7 +513,7 @@ void CKnockBackController::DoKnockBackAnimation(const zeus::CVector3f& backVec, break; } case EKnockBackAnimationState::Flinch: { - std::pair bestAnim = + const std::pair bestAnim = parent.GetBodyController()->GetPASDatabase().FindBestAnimation(CPASAnimParmData(23), *mgr.GetActiveRandom(), -1); if (bestAnim.first > 0.f) { parent.GetModelData()->GetAnimationData()->AddAdditiveAnimation(bestAnim.second, 1.f, false, true); @@ -539,8 +546,8 @@ void CKnockBackController::DoDeferredKnockBack(CStateManager& mgr, CPatterned& p x4_activeParms = KnockBackParmsTable[size_t(x0_variant)][size_t(EKnockBackWeaponType::WaveComboedDirect)] [size_t(GetKnockBackCharacterState(parent))]; ValidateState(parent); - if (CHealthInfo* hInfo = parent.HealthInfo(mgr)) { - zeus::CVector3f backVec = -parent.GetTransform().basis[1]; + if (parent.HealthInfo(mgr) != nullptr) { + const zeus::CVector3f backVec = -parent.GetTransform().basis[1]; DoKnockBackAnimation(backVec, mgr, parent, 10.f); ResetKnockBackImpulse(parent, backVec, 2.f); x82_25_inDeferredKnockBack = true; @@ -555,17 +562,21 @@ void CKnockBackController::DoDeferredKnockBack(CStateManager& mgr, CPatterned& p } void CKnockBackController::sub80233d40(int i, float f1, float f2) { - if (i < 0 || i > 4) + if (i < 0 || i > 4) { return; + } x24_[i] = std::make_pair(f1, f2); } void CKnockBackController::SetAutoResetImpulse(bool b) { x81_24_autoResetImpulse = b; - if (!b) { - x5c_impulseMag = 0.f; - x60_impulseRemTime = 0.f; + + if (b) { + return; } + + x5c_impulseMag = 0.f; + x60_impulseRemTime = 0.f; } void CKnockBackController::Update(float dt, CStateManager& mgr, CPatterned& parent) { @@ -587,9 +598,11 @@ EKnockBackWeaponType CKnockBackController::GetKnockBackWeaponType(const CDamageI } else if (info.GetWeaponMode().IsComboed()) { stacking = 2; } + if (wType > EWeaponType::Phazon) { return EKnockBackWeaponType::Invalid; } + switch (wType) { case EWeaponType::Power: return EKnockBackWeaponType(type != EKnockBackType::Direct ? stacking : stacking + 1); @@ -628,15 +641,18 @@ void CKnockBackController::SelectDamageState(const CPatterned& parent, const CDa void CKnockBackController::KnockBack(const zeus::CVector3f& backVec, CStateManager& mgr, CPatterned& parent, const CDamageInfo& info, EKnockBackType type, float magnitude) { - if (!x82_25_inDeferredKnockBack) { - zeus::CVector3f vec(backVec.toVec2f()); - if (!vec.isMagnitudeSafe()) { - vec = -parent.GetTransform().basis[1]; - } - SelectDamageState(parent, info, info.GetWeaponMode().GetType(), type); - DoKnockBackAnimation(vec, mgr, parent, magnitude); - ResetKnockBackImpulse(parent, vec, 2.f); + if (x82_25_inDeferredKnockBack) { + return; } + + zeus::CVector3f vec(backVec.toVec2f()); + if (!vec.isMagnitudeSafe()) { + vec = -parent.GetTransform().basis[1]; + } + + SelectDamageState(parent, info, info.GetWeaponMode().GetType(), type); + DoKnockBackAnimation(vec, mgr, parent, magnitude); + ResetKnockBackImpulse(parent, vec, 2.f); } } // namespace urde From 5491f3ff236bc4bdb36fd06749c5c39f9d55b838 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 17 Apr 2020 13:17:01 -0400 Subject: [PATCH 208/224] CKnockBackController: Simplify initialization of x24_ in constructor Same behavior, less code. --- Runtime/World/CKnockBackController.cpp | 5 +---- Runtime/World/CKnockBackController.hpp | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Runtime/World/CKnockBackController.cpp b/Runtime/World/CKnockBackController.cpp index 18cbc80e9..2ffa1ebc8 100644 --- a/Runtime/World/CKnockBackController.cpp +++ b/Runtime/World/CKnockBackController.cpp @@ -372,10 +372,7 @@ CKnockBackController::CKnockBackController(EKnockBackVariant variant) , x82_24_(true) , x82_25_inDeferredKnockBack(false) , x82_26_locomotionDuringElectrocution(false) { - for (int i = 0; i < 5; ++i) { - x24_.push_back(std::make_pair(0.f, FLT_MAX)); - x80_availableStates.set(i); - } + x24_.resize(x24_.capacity(), std::make_pair(0.0f, FLT_MAX)); } void CKnockBackController::ApplyImpulse(float dt, CPatterned& parent) { diff --git a/Runtime/World/CKnockBackController.hpp b/Runtime/World/CKnockBackController.hpp index d8bfd46b8..ec3b831e3 100644 --- a/Runtime/World/CKnockBackController.hpp +++ b/Runtime/World/CKnockBackController.hpp @@ -85,7 +85,7 @@ private: u32 x70_ = 0; u32 x74_ = 0; pas::ESeverity x7c_severity = pas::ESeverity::One; - std::bitset<5> x80_availableStates; + std::bitset<5> x80_availableStates{0b11111}; bool x81_24_autoResetImpulse : 1; // t bool x81_25_enableFreeze : 1; // t bool x81_26_enableShock : 1; From 90877603e6129938f5eccdcf4ddbb062d47f1c43 Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Fri, 17 Apr 2020 11:12:47 -0700 Subject: [PATCH 209/224] Update hecl, remove stdbool includes from CTweakPlayerRes and CTweakTargeting --- DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp | 7 +++---- DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp | 2 -- hecl | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp b/DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp index d7e6b6782..d784efd52 100644 --- a/DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp +++ b/DataSpec/DNAMP1/Tweaks/CTweakPlayerRes.hpp @@ -1,8 +1,7 @@ #pragma once #include "DataSpec/DNACommon/Tweaks/ITweakPlayerRes.hpp" -// FIXME: Remove this include when it's in the DNA headers -#include + namespace DataSpec::DNAMP1 { template @@ -18,8 +17,8 @@ struct AT_SPECIALIZE_PARMS(true, false) CTweakPlayerRes final : ITweakPlayerRes String<-1> m_minesBreakSecondTopIcon; String<-1> m_minesBreakSecondBottomIcon; - String m_mapArrowDown; - String m_mapArrowUp; + String m_mapArrowDown; + String m_mapArrowUp; String<-1> m_lStickN; String<-1> m_lStickU; diff --git a/DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp b/DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp index d7f026294..5ac3535f3 100644 --- a/DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp +++ b/DataSpec/DNAMP1/Tweaks/CTweakTargeting.hpp @@ -1,8 +1,6 @@ #pragma once #include "DataSpec/DNACommon/Tweaks/ITweakTargeting.hpp" -// FIXME: Remove this include when it's in the DNA headers -#include namespace DataSpec::DNAMP1 { template diff --git a/hecl b/hecl index a52732d1d..98c76fd2d 160000 --- a/hecl +++ b/hecl @@ -1 +1 @@ -Subproject commit a52732d1dea9e8e61a35fc262d46bc0730026ce9 +Subproject commit 98c76fd2d6bf12e55f8e24640779774401cb1f5a From 73b9d2024bd5a5fa3102a963ee128105142b15a4 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 17 Apr 2020 14:24:06 -0400 Subject: [PATCH 210/224] MP1: Use SystemStringConv for printing version string --- Runtime/MP1/MP1.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Runtime/MP1/MP1.cpp b/Runtime/MP1/MP1.cpp index 665e0a099..06c74a17a 100644 --- a/Runtime/MP1/MP1.cpp +++ b/Runtime/MP1/MP1.cpp @@ -796,7 +796,8 @@ void CMain::Init(const hecl::Runtime::FileStoreManager& storeMgr, hecl::CVarMana MainLog.report(logvisor::Level::Fatal, FMT_STRING("Attempted to initialize URDE in MP1 mode with non-MP1 data!!!!")); } - boo::SystemStringView versionView(GetVersionString()); + hecl::SystemStringConv conv(GetVersionString()); + boo::SystemStringView versionView(conv.sys_str()); MainLog.report(logvisor::Level::Info, FMT_STRING("Loading data from Metroid Prime version {} from region {}{}"), versionView, char(GetRegion()), IsTrilogy() ? _SYS_STR(" from trilogy") : _SYS_STR("")); } else { From 248e7654fa7cbfac0a46f1bb4f6a2a416567dc5b Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 17 Apr 2020 14:31:29 -0400 Subject: [PATCH 211/224] MP1: char -> boo::SystemChar --- Runtime/MP1/MP1.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/MP1/MP1.cpp b/Runtime/MP1/MP1.cpp index 06c74a17a..f68b07602 100644 --- a/Runtime/MP1/MP1.cpp +++ b/Runtime/MP1/MP1.cpp @@ -799,7 +799,7 @@ void CMain::Init(const hecl::Runtime::FileStoreManager& storeMgr, hecl::CVarMana hecl::SystemStringConv conv(GetVersionString()); boo::SystemStringView versionView(conv.sys_str()); MainLog.report(logvisor::Level::Info, FMT_STRING("Loading data from Metroid Prime version {} from region {}{}"), - versionView, char(GetRegion()), IsTrilogy() ? _SYS_STR(" from trilogy") : _SYS_STR("")); + versionView, boo::SystemChar(GetRegion()), IsTrilogy() ? _SYS_STR(" from trilogy") : _SYS_STR("")); } else { MainLog.report(logvisor::Level::Fatal, FMT_STRING("Unable to load version info")); } From 4a8f077d926920d395191be0c63a29ca886376b0 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 17 Apr 2020 14:39:40 -0400 Subject: [PATCH 212/224] MP1: Use _SYS_STR where needed --- Runtime/MP1/MP1.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/MP1/MP1.cpp b/Runtime/MP1/MP1.cpp index f68b07602..8fe307f85 100644 --- a/Runtime/MP1/MP1.cpp +++ b/Runtime/MP1/MP1.cpp @@ -798,7 +798,7 @@ void CMain::Init(const hecl::Runtime::FileStoreManager& storeMgr, hecl::CVarMana } hecl::SystemStringConv conv(GetVersionString()); boo::SystemStringView versionView(conv.sys_str()); - MainLog.report(logvisor::Level::Info, FMT_STRING("Loading data from Metroid Prime version {} from region {}{}"), + MainLog.report(logvisor::Level::Info, FMT_STRING(_SYS_STR("Loading data from Metroid Prime version {} from region {}{}")), versionView, boo::SystemChar(GetRegion()), IsTrilogy() ? _SYS_STR(" from trilogy") : _SYS_STR("")); } else { MainLog.report(logvisor::Level::Fatal, FMT_STRING("Unable to load version info")); From 36bbc5004f1003dcd5c71f506e6000efb15c1fed Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 17 Apr 2020 14:52:25 -0400 Subject: [PATCH 213/224] CDvdFile: Use auto for string_view::begin --- Runtime/CDvdFile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/CDvdFile.cpp b/Runtime/CDvdFile.cpp index 4e62104e5..80e3f81e5 100644 --- a/Runtime/CDvdFile.cpp +++ b/Runtime/CDvdFile.cpp @@ -96,7 +96,7 @@ std::shared_ptr CDvdFile::AsyncSeekRead(void* buf, u32 len, ESeekOr } hecl::ProjectPath CDvdFile::ResolvePath(std::string_view path) { - const char* start = path.begin(); + const auto* start = path.begin(); while (*start == '/') { ++start; } From 61e656e732e92cf110a2b18d9a7282b52212e63c Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 17 Apr 2020 15:01:31 -0400 Subject: [PATCH 214/224] CDvdFile: Remove const from auto type for MSVC --- Runtime/CDvdFile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/CDvdFile.cpp b/Runtime/CDvdFile.cpp index 80e3f81e5..33b109ac4 100644 --- a/Runtime/CDvdFile.cpp +++ b/Runtime/CDvdFile.cpp @@ -96,7 +96,7 @@ std::shared_ptr CDvdFile::AsyncSeekRead(void* buf, u32 len, ESeekOr } hecl::ProjectPath CDvdFile::ResolvePath(std::string_view path) { - const auto* start = path.begin(); + auto start = path.begin(); while (*start == '/') { ++start; } From 8f5caca1e53c15ae69ad6e4fd58445f1775fe230 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 17 Apr 2020 15:10:52 -0400 Subject: [PATCH 215/224] CMemoryCardSysWin: Add includes --- Runtime/CMemoryCardSysWin.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Runtime/CMemoryCardSysWin.cpp b/Runtime/CMemoryCardSysWin.cpp index ee5ffb8bf..fa869cd8a 100644 --- a/Runtime/CMemoryCardSysWin.cpp +++ b/Runtime/CMemoryCardSysWin.cpp @@ -1,5 +1,8 @@ #include "Runtime/CMemoryCardSys.hpp" +#include "Runtime/GameGlobalObjects.hpp" +#include "Runtime/IMain.hpp" + #include namespace urde { From 0b05c906df9bf07d8278da061afdebe668d227b7 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 17 Apr 2020 16:31:00 -0400 Subject: [PATCH 216/224] CScriptEffect: Eliminate variable shadowing Avoids clashing names. --- Runtime/World/CScriptEffect.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Runtime/World/CScriptEffect.cpp b/Runtime/World/CScriptEffect.cpp index f5a84c874..48407c0ab 100644 --- a/Runtime/World/CScriptEffect.cpp +++ b/Runtime/World/CScriptEffect.cpp @@ -153,12 +153,14 @@ void CScriptEffect::AcceptScriptMsg(EScriptObjectMessage msg, TUniqueId uid, CSt if (oldActive != GetActive()) { std::vector playIds; for (const SConnection& conn : x20_conns) { - if (conn.x0_state != EScriptObjectState::Play || conn.x4_msg != EScriptObjectMessage::Activate) + if (conn.x0_state != EScriptObjectState::Play || conn.x4_msg != EScriptObjectMessage::Activate) { continue; + } - TUniqueId uid = mgr.GetIdForScript(conn.x8_objId); - if (uid != kInvalidUniqueId) - playIds.push_back(uid); + const TUniqueId scriptId = mgr.GetIdForScript(conn.x8_objId); + if (scriptId != kInvalidUniqueId) { + playIds.push_back(scriptId); + } } if (playIds.size() > 0) { From 75e5851e5b8879047350ab42bdd9bba691b864fa Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 17 Apr 2020 16:40:46 -0400 Subject: [PATCH 217/224] Disable exceptions/RTTI for MSVC/clang-cl --- CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5f39083d2..72f1932a6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,7 +88,10 @@ if(MSVC) add_compile_options( # Disable exceptions - $<$:/EHsc> + $<$:/EHsc-> + + # Disable RTTI + $<$:/GR-> # Enforce various standards compliant behavior. $<$:/permissive-> @@ -102,6 +105,7 @@ if(MSVC) # Use latest C++ standard. $<$:/std:c++latest> ) + add_compile_definitions(FMT_EXCEPTIONS=0 _HAS_EXCEPTIONS=0) if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") # Flags for MSVC (not clang-cl) From 76f0b57340e62162a59377f47ca690a183364a42 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Fri, 17 Apr 2020 17:39:04 -0400 Subject: [PATCH 218/224] General: Use bool literals where applicable More indicative of the passed in type compared to raw values. --- Runtime/Weapon/CPlayerGun.cpp | 2 +- Runtime/World/CScriptTrigger.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Runtime/Weapon/CPlayerGun.cpp b/Runtime/Weapon/CPlayerGun.cpp index 8fd887f80..b74da08de 100644 --- a/Runtime/Weapon/CPlayerGun.cpp +++ b/Runtime/Weapon/CPlayerGun.cpp @@ -124,7 +124,7 @@ float CPlayerGun::CMotionState::gGunExtendDistance = 0.125f; float CPlayerGun::skTractorBeamFactor = 0.5f / CPlayerState::GetMissileComboChargeFactor(); CPlayerGun::CPlayerGun(TUniqueId playerId) -: x0_lights(8, zeus::CVector3f{-30.f, 0.f, 30.f}, 4, 4, 0, 0, 0, 0.1f) +: x0_lights(8, zeus::CVector3f{-30.f, 0.f, 30.f}, 4, 4, false, 0, 0, 0.1f) , x538_playerId(playerId) , x550_camBob(CPlayerCameraBob::ECameraBobType::One, CPlayerCameraBob::GetCameraBobExtent(), CPlayerCameraBob::GetCameraBobPeriod()) diff --git a/Runtime/World/CScriptTrigger.cpp b/Runtime/World/CScriptTrigger.cpp index 5c0dd3f12..9dcbc39ec 100644 --- a/Runtime/World/CScriptTrigger.cpp +++ b/Runtime/World/CScriptTrigger.cpp @@ -255,7 +255,7 @@ void CScriptTrigger::Touch(CActor& act, CStateManager& mgr) { x148_29_didPhazonDamage = false; } else if (x100_damageInfo.GetDamage() > 0.f) { const CDamageVulnerability* dVuln = mgr.Player()->GetDamageVulnerability(); - if (dVuln->WeaponHurts(x100_damageInfo.GetWeaponMode(), 0) && + if (dVuln->WeaponHurts(x100_damageInfo.GetWeaponMode(), false) && x100_damageInfo.GetWeaponMode().GetType() == EWeaponType::Phazon && !mgr.GetPlayerState()->HasPowerUp(CPlayerState::EItemType::PhazonSuit)) { pl->IncrementEnvironmentDamage(); From df75c00203b42f742b82a1c028b6ddb0804a5654 Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Fri, 17 Apr 2020 15:32:26 -0700 Subject: [PATCH 219/224] Fix WideScreenFilter crash --- Runtime/Graphics/Shaders/CColoredQuadFilter.cpp | 2 +- Runtime/World/ScriptLoader.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Runtime/Graphics/Shaders/CColoredQuadFilter.cpp b/Runtime/Graphics/Shaders/CColoredQuadFilter.cpp index 9628ba8b0..b7a19e217 100644 --- a/Runtime/Graphics/Shaders/CColoredQuadFilter.cpp +++ b/Runtime/Graphics/Shaders/CColoredQuadFilter.cpp @@ -34,7 +34,7 @@ static boo::ObjToken SelectPipeline(EFilterType type) { case EFilterType::Multiply: return s_MultPipeline; default: - return {}; + return s_AlphaPipeline; } } diff --git a/Runtime/World/ScriptLoader.cpp b/Runtime/World/ScriptLoader.cpp index 68dde9d09..b2fca89dc 100644 --- a/Runtime/World/ScriptLoader.cpp +++ b/Runtime/World/ScriptLoader.cpp @@ -1052,7 +1052,7 @@ CEntity* ScriptLoader::LoadCameraFilterKeyframe(CStateManager& mgr, CInputStream color.readRGBABig(in); float timeIn = in.readFloatBig(); float timeOut = in.readFloatBig(); - CAssetId txtr = in.readUint32Big(); + CAssetId txtr(in); return new CScriptCameraFilterKeyframe(mgr.AllocateUniqueId(), name, info, ftype, shape, filterIdx, unk, color, timeIn, timeOut, txtr, active); From f26e9288bb50535c07eb75d75515e02e9f70f92b Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 17 Apr 2020 20:47:31 -0400 Subject: [PATCH 220/224] Update hecl/extern/boo --- hecl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hecl b/hecl index 98c76fd2d..68758e1ef 160000 --- a/hecl +++ b/hecl @@ -1 +1 @@ -Subproject commit 98c76fd2d6bf12e55f8e24640779774401cb1f5a +Subproject commit 68758e1efdf6370574db8ebf40074ee10106a724 From 75f19d174e8fabcea0ebc5f3acca8ed71bf63733 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 17 Apr 2020 21:02:50 -0400 Subject: [PATCH 221/224] Add CMakeSettings.json for VS --- CMakeSettings.json | 186 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 CMakeSettings.json diff --git a/CMakeSettings.json b/CMakeSettings.json new file mode 100644 index 000000000..7dfcfe1d9 --- /dev/null +++ b/CMakeSettings.json @@ -0,0 +1,186 @@ +{ + "configurations": [ + { + "name": "x64-Clang-Debug", + "generator": "Ninja", + "configurationType": "Debug", + "inheritEnvironments": [ "clang_cl_x64" ], + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "-v", + "ctestCommandArgs": "", + "variables": [ + { + "name": "CMAKE_PREFIX_PATH", + "value": "C:\\Qt\\5.14.2\\msvc2017_64", + "type": "FILEPATH" + }, + { + "name": "CMAKE_CXX_FLAGS", + "value": "-m64 -fdiagnostics-absolute-paths", + "type": "STRING" + }, + { + "name": "CMAKE_C_FLAGS", + "value": "-m64 -fdiagnostics-absolute-paths", + "type": "STRING" + }, + { + "name": "CMAKE_LINKER", + "value": "C:\\Program Files\\LLVM\\bin\\lld-link.exe", + "type": "FILEPATH" + }, + { + "name": "CMAKE_C_COMPILER", + "value": "C:\\Program Files\\LLVM\\bin\\clang-cl.exe", + "type": "FILEPATH" + }, + { + "name": "CMAKE_CXX_COMPILER", + "value": "C:\\Program Files\\LLVM\\bin\\clang-cl.exe", + "type": "FILEPATH" + }, + { + "name": "CMAKE_C_COMPILER_RANLIB", + "value": "C:\\Program Files\\LLVM\\bin\\llvm-ranlib.exe", + "type": "FILEPATH" + }, + { + "name": "CMAKE_C_COMPILER_AR", + "value": "C:\\Program Files\\LLVM\\bin\\llvm-ar.exe", + "type": "FILEPATH" + }, + { + "name": "CMAKE_CXX_COMPILER_AR", + "value": "C:\\Program Files\\LLVM\\bin\\llvm-ar.exe", + "type": "FILEPATH" + }, + { + "name": "CMAKE_CXX_COMPILER_RANLIB", + "value": "C:\\Program Files\\LLVM\\bin\\llvm-ranlib.exe", + "type": "FILEPATH" + } + ] + }, + { + "name": "x64-Clang-Release", + "generator": "Ninja", + "configurationType": "RelWithDebInfo", + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "-v", + "ctestCommandArgs": "", + "inheritEnvironments": [ "clang_cl_x64" ], + "variables": [ + { + "name": "CMAKE_PREFIX_PATH", + "value": "C:\\Qt\\5.14.2\\msvc2017_64", + "type": "FILEPATH" + }, + { + "name": "CMAKE_CXX_FLAGS", + "value": "-m64 -fdiagnostics-absolute-paths", + "type": "STRING" + }, + { + "name": "CMAKE_C_FLAGS", + "value": "-m64 -fdiagnostics-absolute-paths", + "type": "STRING" + }, + { + "name": "CMAKE_LINKER", + "value": "C:\\Program Files\\LLVM\\bin\\lld-link.exe", + "type": "FILEPATH" + }, + { + "name": "CMAKE_C_COMPILER", + "value": "C:\\Program Files\\LLVM\\bin\\clang-cl.exe", + "type": "FILEPATH" + }, + { + "name": "CMAKE_CXX_COMPILER", + "value": "C:\\Program Files\\LLVM\\bin\\clang-cl.exe", + "type": "FILEPATH" + }, + { + "name": "CMAKE_C_COMPILER_RANLIB", + "value": "C:\\Program Files\\LLVM\\bin\\llvm-ranlib.exe", + "type": "FILEPATH" + }, + { + "name": "CMAKE_C_COMPILER_AR", + "value": "C:\\Program Files\\LLVM\\bin\\llvm-ar.exe", + "type": "FILEPATH" + }, + { + "name": "CMAKE_CXX_COMPILER_AR", + "value": "C:\\Program Files\\LLVM\\bin\\llvm-ar.exe", + "type": "FILEPATH" + }, + { + "name": "CMAKE_CXX_COMPILER_RANLIB", + "value": "C:\\Program Files\\LLVM\\bin\\llvm-ranlib.exe", + "type": "FILEPATH" + } + ] + }, + { + "name": "x64-MSVC-Release", + "generator": "Ninja", + "configurationType": "RelWithDebInfo", + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "-v", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x64" ], + "variables": [ + { + "name": "CMAKE_PREFIX_PATH", + "value": "C:\\Qt\\5.14.2\\msvc2017_64", + "type": "FILEPATH" + }, + { + "name": "CMAKE_CXX_FLAGS", + "value": "", + "type": "STRING" + }, + { + "name": "CMAKE_C_FLAGS", + "value": "", + "type": "STRING" + } + ] + }, + { + "name": "x64-MSVC-Debug", + "generator": "Ninja", + "configurationType": "Debug", + "buildRoot": "${projectDir}\\out\\build\\${name}", + "installRoot": "${projectDir}\\out\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "-v", + "ctestCommandArgs": "", + "inheritEnvironments": [ "msvc_x64" ], + "variables": [ + { + "name": "CMAKE_PREFIX_PATH", + "value": "C:\\Qt\\5.14.2\\msvc2017_64", + "type": "FILEPATH" + }, + { + "name": "CMAKE_CXX_FLAGS", + "value": "", + "type": "STRING" + }, + { + "name": "CMAKE_C_FLAGS", + "value": "", + "type": "STRING" + } + ] + } + ] +} \ No newline at end of file From 2b62bb95774dc5c01f39c7f67c524bbe9aa010b5 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Fri, 17 Apr 2020 21:48:23 -0400 Subject: [PATCH 222/224] Update boo (fix WinUSB scanning) --- hecl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hecl b/hecl index 68758e1ef..95ac3ef77 160000 --- a/hecl +++ b/hecl @@ -1 +1 @@ -Subproject commit 68758e1efdf6370574db8ebf40074ee10106a724 +Subproject commit 95ac3ef77c8a5dfe70f498fdffea5fe92091bd73 From 7f15390d4f78733e5810867949735c0882b0b642 Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sat, 18 Apr 2020 03:02:44 -0400 Subject: [PATCH 223/224] Editor: Only create Win32 console & redirect logging if not attached --- Editor/main.cpp | 3 ++- Runtime/CStateManager.cpp | 9 +++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Editor/main.cpp b/Editor/main.cpp index 01c40d59f..8fdb3c0fd 100644 --- a/Editor/main.cpp +++ b/Editor/main.cpp @@ -207,7 +207,8 @@ int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR lpCmdLine, int) { for (int i = 0; i < argc; ++i) booArgv[i + 1] = argv[i]; - if (IsClientLoggingEnabled(argc + 1, booArgv)) + const DWORD outType = GetFileType(GetStdHandle(STD_OUTPUT_HANDLE)); + if (IsClientLoggingEnabled(argc + 1, booArgv) && outType == FILE_TYPE_UNKNOWN) logvisor::CreateWin32Console(); return wmain(argc + 1, booArgv); } diff --git a/Runtime/CStateManager.cpp b/Runtime/CStateManager.cpp index a82c4a470..bbc581345 100644 --- a/Runtime/CStateManager.cpp +++ b/Runtime/CStateManager.cpp @@ -417,12 +417,7 @@ void CStateManager::SetupParticleHook(const CActor& actor) const { void CStateManager::MurderScriptInstanceNames() { xb40_uniqueInstanceNames.clear(); } std::string CStateManager::HashInstanceName(CInputStream& in) { - if (hecl::com_developer && hecl::com_developer->toBoolean()) { - return in.readString(); - } else { - while (in.readByte() != 0) {}; - return ""; - } + return in.readString(); } void CStateManager::SetActorAreaId(CActor& actor, TAreaId aid) { @@ -517,6 +512,7 @@ void CStateManager::BuildDynamicLightListForWorld() { } void CStateManager::DrawDebugStuff() const { +#ifndef NDEBUG for (CEntity* ent : GetActorObjectList()) { if (TCastToPtr ai = ent) { if (CPathFindSearch* path = ai->GetSearchPath()) { @@ -524,6 +520,7 @@ void CStateManager::DrawDebugStuff() const { } } } +#endif } void CStateManager::RenderCamerasAndAreaLights() { From 81c2e5b03caea4fa6683db4b881062dd1ee22b0f Mon Sep 17 00:00:00 2001 From: Luke Street Date: Sat, 18 Apr 2020 17:37:02 -0400 Subject: [PATCH 224/224] CTweakGame: Add tweak.game.SplashScreensDisabled CVar --- DataSpec/DNAMP1/Tweaks/CTweakGame.cpp | 17 +++++++++++++++-- hecl-gui | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/DataSpec/DNAMP1/Tweaks/CTweakGame.cpp b/DataSpec/DNAMP1/Tweaks/CTweakGame.cpp index ea63571c6..f2f7a923a 100644 --- a/DataSpec/DNAMP1/Tweaks/CTweakGame.cpp +++ b/DataSpec/DNAMP1/Tweaks/CTweakGame.cpp @@ -8,10 +8,12 @@ namespace DataSpec::DNAMP1 { hecl::CVar* tw_fov = nullptr; hecl::CVar* tw_hardmodeDMult = nullptr; hecl::CVar* tw_hardmodeWMult = nullptr; +hecl::CVar* tw_splashScreensDisabled = nullptr; namespace { constexpr std::string_view skFov = "tweak.game.FieldOfView"sv; constexpr std::string_view skHardModeDamageMultName = "tweak.game.HardModeDamageMult"sv; constexpr std::string_view skHardModeWeaponMultName = "tweak.game.HardModeWeaponMult"sv; +constexpr std::string_view skSplashScreensDisabled = "tweak.game.SplashScreensDisabled"sv; } // anonymous namespace void CTweakGame::_tweakGameListener(hecl::CVar* cv) { @@ -21,6 +23,8 @@ void CTweakGame::_tweakGameListener(hecl::CVar* cv) { x60_hardmodeDamageMult = cv->toReal(); } else if (cv == tw_hardmodeWMult) { x64_hardmodeWeaponMult = cv->toReal(); + } else if (cv == tw_splashScreensDisabled) { + x2b_splashScreensDisabled = cv->toBoolean(); } } @@ -33,14 +37,23 @@ void CTweakGame::initCVars(hecl::CVarManager* mgr) { cv->addListener([this](hecl::CVar* cv) { _tweakGameListener(cv); }); return cv; }; + auto assignBoolValue = [this, mgr](std::string_view name, std::string_view desc, bool& v, hecl::CVar::EFlags flags) { + hecl::CVar* cv = mgr->findOrMakeCVar(name, desc, v, flags); + // Check if the CVar was deserialized, this avoid an unnecessary conversion + if (cv->wasDeserialized()) + v = cv->toBoolean(); + cv->addListener([this](hecl::CVar* cv) { _tweakGameListener(cv); }); + return cv; + }; - tw_fov = assignRealValue(skFov, "", x24_fov, - hecl::CVar::EFlags::Game | hecl::CVar::EFlags::Archive); + tw_fov = assignRealValue(skFov, "", x24_fov, hecl::CVar::EFlags::Game | hecl::CVar::EFlags::Archive); tw_hardmodeDMult = assignRealValue(skHardModeDamageMultName, "", x60_hardmodeDamageMult, hecl::CVar::EFlags::Game | hecl::CVar::EFlags::Archive | hecl::CVar::EFlags::Cheat); tw_hardmodeWMult = assignRealValue(skHardModeWeaponMultName, "", x64_hardmodeWeaponMult, hecl::CVar::EFlags::Game | hecl::CVar::EFlags::Archive | hecl::CVar::EFlags::Cheat); + tw_splashScreensDisabled = assignBoolValue(skSplashScreensDisabled, "", x2b_splashScreensDisabled, + hecl::CVar::EFlags::Game | hecl::CVar::EFlags::Archive); } } // namespace DataSpec::DNAMP1 diff --git a/hecl-gui b/hecl-gui index db38d19ac..c66d33b0b 160000 --- a/hecl-gui +++ b/hecl-gui @@ -1 +1 @@ -Subproject commit db38d19ac3ed624f4e55fb071c177db4feed3ce0 +Subproject commit c66d33b0b2fca695c39d1c0c829489ba67a52f47

Slo5a=3+oz4PbZNX^N4ZzK7U5ZU{5O~i#yPF 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%0A@E*5S&hpb{W6 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 z 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