|
19 | 19 |
|
20 | 20 | #include "gui/widgets/registers.h" |
21 | 21 |
|
| 22 | +#include <cmath> |
| 23 | +#include <numbers> |
| 24 | + |
22 | 25 | #include "core/disr3000a.h" |
23 | 26 | #include "core/r3000a.h" |
24 | 27 | #include "core/system.h" |
@@ -98,77 +101,228 @@ void PCSX::Widgets::Registers::draw(PCSX::GUI* gui, PCSX::psxRegisters* register |
98 | 101 | ImGui::EndTabItem(); |
99 | 102 | } |
100 | 103 | if (ImGui::BeginTabItem("CP2D")) { |
| 104 | + ImGui::Checkbox(_("Show fixed point"), &m_showFixed); |
101 | 105 | auto v0 = registers->CP2D.n.v0; |
102 | | - ImGui::Text("v0 : {%i, %i, %i}", v0.x, v0.y, v0.z); |
| 106 | + if (m_showFixed) { |
| 107 | + ImGui::Text("v0 : {% 3.5f, % 3.5f, % 3.5f}", fixedToFloat(v0.x), fixedToFloat(v0.y), |
| 108 | + fixedToFloat(v0.z)); |
| 109 | + } else { |
| 110 | + ImGui::Text("v0 : {%i, %i, %i}", v0.x, v0.y, v0.z); |
| 111 | + } |
103 | 112 | auto v1 = registers->CP2D.n.v1; |
104 | | - ImGui::Text("v1 : {%i, %i, %i}", v1.x, v1.y, v1.z); |
| 113 | + if (m_showFixed) { |
| 114 | + ImGui::Text("v1 : {% 3.5f, % 3.5f, % 3.5f}", fixedToFloat(v1.x), fixedToFloat(v1.y), |
| 115 | + fixedToFloat(v1.z)); |
| 116 | + } else { |
| 117 | + ImGui::Text("v1 : {%i, %i, %i}", v1.x, v1.y, v1.z); |
| 118 | + } |
105 | 119 | auto v2 = registers->CP2D.n.v2; |
106 | | - ImGui::Text("v2 : {%i, %i, %i}", v2.x, v2.y, v2.z); |
| 120 | + if (m_showFixed) { |
| 121 | + ImGui::Text("v2 : {% 3.5f, % 3.5f, % 3.5f}", fixedToFloat(v2.x), fixedToFloat(v2.y), |
| 122 | + fixedToFloat(v2.z)); |
| 123 | + } else { |
| 124 | + ImGui::Text("v2 : {%i, %i, %i}", v2.x, v2.y, v2.z); |
| 125 | + } |
107 | 126 | auto rgb = registers->CP2D.n.rgb; |
108 | 127 | ImGui::Text("rgb : {%i, %i, %i, %i}", rgb.r, rgb.g, rgb.b, rgb.c); |
109 | | - ImGui::Text("otz : %i", registers->CP2D.n.otz); |
110 | | - ImGui::Text("ir0 : %i", registers->CP2D.n.ir0); |
111 | | - ImGui::Text("ir1 : %i", registers->CP2D.n.ir1); |
112 | | - ImGui::Text("ir2 : %i", registers->CP2D.n.ir2); |
113 | | - ImGui::Text("ir3 : %i", registers->CP2D.n.ir3); |
| 128 | + if (m_showFixed) { |
| 129 | + ImGui::Text("otz : % 3.5f", fixedToFloat(registers->CP2D.n.otz)); |
| 130 | + } else { |
| 131 | + ImGui::Text("otz : %i", registers->CP2D.n.otz); |
| 132 | + } |
| 133 | + if (m_showFixed) { |
| 134 | + ImGui::Text("ir0 : % 3.5f", fixedToFloat(registers->CP2D.n.ir0)); |
| 135 | + } else { |
| 136 | + ImGui::Text("ir0 : %i", registers->CP2D.n.ir0); |
| 137 | + } |
| 138 | + if (m_showFixed) { |
| 139 | + ImGui::Text("ir1 : % 3.5f", fixedToFloat(registers->CP2D.n.ir1)); |
| 140 | + } else { |
| 141 | + ImGui::Text("ir1 : %i", registers->CP2D.n.ir1); |
| 142 | + } |
| 143 | + if (m_showFixed) { |
| 144 | + ImGui::Text("ir2 : % 3.5f", fixedToFloat(registers->CP2D.n.ir2)); |
| 145 | + } else { |
| 146 | + ImGui::Text("ir2 : %i", registers->CP2D.n.ir2); |
| 147 | + } |
| 148 | + if (m_showFixed) { |
| 149 | + ImGui::Text("ir3 : % 3.5f", fixedToFloat(registers->CP2D.n.ir3)); |
| 150 | + } else { |
| 151 | + ImGui::Text("ir3 : %i", registers->CP2D.n.ir3); |
| 152 | + } |
114 | 153 | auto sxy0 = registers->CP2D.n.sxy0; |
115 | | - ImGui::Text("sxy0: {%i, %i}", sxy0.x, sxy0.y); |
| 154 | + if (m_showFixed) { |
| 155 | + ImGui::Text("sxy0: {% 3.5f, % 3.5f}", fixedToFloat(sxy0.x), fixedToFloat(sxy0.y)); |
| 156 | + } else { |
| 157 | + ImGui::Text("sxy0: {%i, %i}", sxy0.x, sxy0.y); |
| 158 | + } |
116 | 159 | auto sxy1 = registers->CP2D.n.sxy1; |
117 | | - ImGui::Text("sxy1: {%i, %i}", sxy1.x, sxy1.y); |
| 160 | + if (m_showFixed) { |
| 161 | + ImGui::Text("sxy1: {% 3.5f, % 3.5f}", fixedToFloat(sxy1.x), fixedToFloat(sxy1.y)); |
| 162 | + } else { |
| 163 | + ImGui::Text("sxy1: {%i, %i}", sxy1.x, sxy1.y); |
| 164 | + } |
118 | 165 | auto sxy2 = registers->CP2D.n.sxy2; |
119 | | - ImGui::Text("sxy2: {%i, %i}", sxy2.x, sxy2.y); |
| 166 | + if (m_showFixed) { |
| 167 | + ImGui::Text("sxy2: {% 3.5f, % 3.5f}", fixedToFloat(sxy2.x), fixedToFloat(sxy2.y)); |
| 168 | + } else { |
| 169 | + ImGui::Text("sxy2: {%i, %i}", sxy2.x, sxy2.y); |
| 170 | + } |
120 | 171 | auto sxyp = registers->CP2D.n.sxyp; |
121 | | - ImGui::Text("sxyp: {%i, %i}", sxyp.x, sxyp.y); |
| 172 | + if (m_showFixed) { |
| 173 | + ImGui::Text("sxyp: {% 3.5f, % 3.5f}", fixedToFloat(sxyp.x), fixedToFloat(sxyp.y)); |
| 174 | + } else { |
| 175 | + ImGui::Text("sxyp: {%i, %i}", sxyp.x, sxyp.y); |
| 176 | + } |
122 | 177 | auto sz0 = registers->CP2D.n.sz0; |
123 | | - ImGui::Text("sz0 : {%i, %i}", sz0.z, sz0.unused); |
| 178 | + if (m_showFixed) { |
| 179 | + ImGui::Text("sz0 : % 3.5f", fixedToFloat(sz0.z)); |
| 180 | + } else { |
| 181 | + ImGui::Text("sz0 : %i", sz0.z); |
| 182 | + } |
124 | 183 | auto sz1 = registers->CP2D.n.sz1; |
125 | | - ImGui::Text("sz1 : {%i, %i}", sz1.z, sz1.unused); |
| 184 | + if (m_showFixed) { |
| 185 | + ImGui::Text("sz1 : % 3.5f", fixedToFloat(sz1.z)); |
| 186 | + } else { |
| 187 | + ImGui::Text("sz1 : %i", sz1.z); |
| 188 | + } |
126 | 189 | auto sz2 = registers->CP2D.n.sz2; |
127 | | - ImGui::Text("sz2 : {%i, %i}", sz2.z, sz2.unused); |
| 190 | + if (m_showFixed) { |
| 191 | + ImGui::Text("sz2 : % 3.5f", fixedToFloat(sz2.z)); |
| 192 | + } else { |
| 193 | + ImGui::Text("sz2 : %i", sz2.z); |
| 194 | + } |
128 | 195 | auto sz3 = registers->CP2D.n.sz3; |
129 | | - ImGui::Text("sz3 : {%i, %i}", sz3.z, sz3.unused); |
| 196 | + if (m_showFixed) { |
| 197 | + ImGui::Text("sz3 : % 3.5f", fixedToFloat(sz3.z)); |
| 198 | + } else { |
| 199 | + ImGui::Text("sz3 : %i", sz3.z); |
| 200 | + } |
130 | 201 | auto rgb0 = registers->CP2D.n.rgb0; |
131 | 202 | ImGui::Text("rgb0: {%i, %i, %i, %i}", rgb0.r, rgb0.g, rgb0.b, rgb0.c); |
132 | 203 | auto rgb1 = registers->CP2D.n.rgb0; |
133 | 204 | ImGui::Text("rgb1: {%i, %i, %i, %i}", rgb1.r, rgb1.g, rgb1.b, rgb1.c); |
134 | 205 | auto rgb2 = registers->CP2D.n.rgb0; |
135 | 206 | ImGui::Text("rgb2: {%i, %i, %i, %i}", rgb2.r, rgb2.g, rgb2.b, rgb2.c); |
136 | | - ImGui::Text("mac0: %i", registers->CP2D.n.mac0); |
137 | | - ImGui::Text("mac1: %i", registers->CP2D.n.mac1); |
138 | | - ImGui::Text("mac2: %i", registers->CP2D.n.mac2); |
139 | | - ImGui::Text("mac3: %i", registers->CP2D.n.mac3); |
| 207 | + if (m_showFixed) { |
| 208 | + ImGui::Text("mac0: % 3.5f", fixedToFloat(registers->CP2D.n.mac0)); |
| 209 | + } else { |
| 210 | + ImGui::Text("mac0: %i", registers->CP2D.n.mac0); |
| 211 | + } |
| 212 | + if (m_showFixed) { |
| 213 | + ImGui::Text("mac1: % 3.5f", fixedToFloat(registers->CP2D.n.mac1)); |
| 214 | + } else { |
| 215 | + ImGui::Text("mac1: %i", registers->CP2D.n.mac1); |
| 216 | + } |
| 217 | + if (m_showFixed) { |
| 218 | + ImGui::Text("mac2: % 3.5f", fixedToFloat(registers->CP2D.n.mac2)); |
| 219 | + } else { |
| 220 | + ImGui::Text("mac2: %i", registers->CP2D.n.mac2); |
| 221 | + } |
| 222 | + if (m_showFixed) { |
| 223 | + ImGui::Text("mac3: % 3.5f", fixedToFloat(registers->CP2D.n.mac3)); |
| 224 | + } else { |
| 225 | + ImGui::Text("mac3: %i", registers->CP2D.n.mac3); |
| 226 | + } |
140 | 227 | ImGui::Text("irgb: %u", registers->CP2D.n.irgb); |
141 | 228 | ImGui::Text("orgb: %u", registers->CP2D.n.orgb); |
142 | | - ImGui::Text("lzcs: %i", registers->CP2D.n.lzcs); |
143 | | - ImGui::Text("lzcr: %i", registers->CP2D.n.lzcr); |
| 229 | + if (m_showFixed) { |
| 230 | + ImGui::Text("lzcs: % 3.5f", fixedToFloat(registers->CP2D.n.lzcs)); |
| 231 | + } else { |
| 232 | + ImGui::Text("lzcs: %i", registers->CP2D.n.lzcs); |
| 233 | + } |
| 234 | + if (m_showFixed) { |
| 235 | + ImGui::Text("lzcr: % 3.5f", fixedToFloat(registers->CP2D.n.lzcr)); |
| 236 | + } else { |
| 237 | + ImGui::Text("lzcr: %i", registers->CP2D.n.lzcr); |
| 238 | + } |
144 | 239 | ImGui::EndTabItem(); |
145 | 240 | } |
146 | 241 | if (ImGui::BeginTabItem("CP2C")) { |
147 | | - auto displayMatrix = [](const SMatrix3D& matrix, const char* name) { |
| 242 | + ImGui::Checkbox(_("Show fixed point"), &m_showFixed); |
| 243 | + auto showFixed = m_showFixed; |
| 244 | + auto displayMatrixPlain = [](SMatrix3D matrix, const char* name) { |
148 | 245 | ImGui::Text(" [%5i, %5i, %5i]", matrix.m11, matrix.m12, matrix.m13); |
149 | 246 | ImGui::Text("%s: [%5i, %5i, %5i]", name, matrix.m21, matrix.m22, matrix.m23); |
150 | 247 | ImGui::Text(" [%5i, %5i, %5i]", matrix.m31, matrix.m32, matrix.m33); |
151 | 248 | }; |
| 249 | + auto displayMatrixFixed = [](SMatrix3D matrix, const char* name) { |
| 250 | + ImGui::Text(" [% 3.5f, % 3.5f, % 3.5f]", fixedToFloat(matrix.m11), fixedToFloat(matrix.m12), |
| 251 | + fixedToFloat(matrix.m13)); |
| 252 | + ImGui::Text("%s: [% 3.5f, % 3.5f, % 3.5f]", name, fixedToFloat(matrix.m21), fixedToFloat(matrix.m22), |
| 253 | + fixedToFloat(matrix.m23)); |
| 254 | + ImGui::Text(" [% 3.5f, % 3.5f, % 3.5f]", fixedToFloat(matrix.m31), fixedToFloat(matrix.m32), |
| 255 | + fixedToFloat(matrix.m33)); |
| 256 | + }; |
| 257 | + auto displayMatrix = showFixed ? displayMatrixFixed : displayMatrixPlain; |
152 | 258 | displayMatrix(registers->CP2C.n.rMatrix, "R"); |
| 259 | + if (showFixed) { |
| 260 | + float m11 = fixedToFloat(registers->CP2C.n.rMatrix.m11); |
| 261 | + float m12 = fixedToFloat(registers->CP2C.n.rMatrix.m12); |
| 262 | + float m13 = fixedToFloat(registers->CP2C.n.rMatrix.m13); |
| 263 | + float m21 = fixedToFloat(registers->CP2C.n.rMatrix.m21); |
| 264 | + float m22 = fixedToFloat(registers->CP2C.n.rMatrix.m22); |
| 265 | + float m23 = fixedToFloat(registers->CP2C.n.rMatrix.m23); |
| 266 | + float m31 = fixedToFloat(registers->CP2C.n.rMatrix.m31); |
| 267 | + float m32 = fixedToFloat(registers->CP2C.n.rMatrix.m32); |
| 268 | + float m33 = fixedToFloat(registers->CP2C.n.rMatrix.m33); |
| 269 | + float c11 = m22 * m33 - m23 * m32; |
| 270 | + float c12 = m23 * m31 - m21 * m33; |
| 271 | + float c13 = m21 * m32 - m22 * m31; |
| 272 | + auto trace = m11 + m22 + m33; |
| 273 | + auto determinant = m11 * c11 + m12 * c12 + m13 * c13; |
| 274 | + ImGui::Text(" :: deter: % 3.5f", determinant); |
| 275 | + ImGui::Text(" :: trace: % 3.5f", trace); |
| 276 | + auto angle = std::acos((trace - 1.0) / 2.0); |
| 277 | + ImGui::Text(" :: angle: % 3.5f x Pi", angle / std::numbers::pi); |
| 278 | + float f = 1.0f / (2.0f * std::sin(angle)); |
| 279 | + float x = (m32 - m23) * f; |
| 280 | + float y = (m13 - m31) * f; |
| 281 | + float z = (m21 - m12) * f; |
| 282 | + float magnitude = std::sqrt(x * x + y * y + z * z); |
| 283 | + x /= magnitude; |
| 284 | + y /= magnitude; |
| 285 | + z /= magnitude; |
| 286 | + ImGui::Text(" :: axis : {%3.5f, %3.5f, %3.5f}", x, y, z); |
| 287 | + } |
153 | 288 | ImGui::Text("trX : %i", registers->CP2C.n.trX); |
154 | 289 | ImGui::Text("trY : %i", registers->CP2C.n.trY); |
155 | 290 | ImGui::Text("trZ : %i", registers->CP2C.n.trZ); |
156 | 291 | displayMatrix(registers->CP2C.n.lMatrix, "L"); |
157 | | - ImGui::Text("rbk : %i", registers->CP2C.n.rbk); |
158 | | - ImGui::Text("gbk : %i", registers->CP2C.n.gbk); |
159 | | - ImGui::Text("bbk : %i", registers->CP2C.n.bbk); |
| 292 | + if (showFixed) { |
| 293 | + ImGui::Text("rbk : % 3.5f", fixedToFloat(registers->CP2C.n.rbk)); |
| 294 | + ImGui::Text("gbk : % 3.5f", fixedToFloat(registers->CP2C.n.gbk)); |
| 295 | + ImGui::Text("bbk : % 3.5f", fixedToFloat(registers->CP2C.n.bbk)); |
| 296 | + } else { |
| 297 | + ImGui::Text("rbk : %i", registers->CP2C.n.rbk); |
| 298 | + ImGui::Text("gbk : %i", registers->CP2C.n.gbk); |
| 299 | + ImGui::Text("bbk : %i", registers->CP2C.n.bbk); |
| 300 | + } |
160 | 301 | displayMatrix(registers->CP2C.n.cMatrix, "C"); |
161 | | - ImGui::Text("rfc : %i", registers->CP2C.n.rfc); |
162 | | - ImGui::Text("gfc : %i", registers->CP2C.n.gfc); |
163 | | - ImGui::Text("bfc : %i", registers->CP2C.n.bfc); |
164 | | - ImGui::Text("ofx : %i", registers->CP2C.n.ofx); |
165 | | - ImGui::Text("ofy : %i", registers->CP2C.n.ofy); |
166 | | - ImGui::Text("h : %i", registers->CP2C.n.h); |
167 | | - ImGui::Text("dqa : %i", registers->CP2C.n.dqa); |
168 | | - ImGui::Text("dqb : %i", registers->CP2C.n.dqb); |
169 | | - ImGui::Text("zsf3: %i", registers->CP2C.n.zsf3); |
170 | | - ImGui::Text("zsf4: %i", registers->CP2C.n.zsf4); |
171 | | - ImGui::Text("flag: %i", registers->CP2C.n.flag); |
| 302 | + if (showFixed) { |
| 303 | + ImGui::Text("rfc : % 3.5f", fixedToFloat<4>(registers->CP2C.n.rfc)); |
| 304 | + ImGui::Text("gfc : % 3.5f", fixedToFloat<4>(registers->CP2C.n.gfc)); |
| 305 | + ImGui::Text("bfc : % 3.5f", fixedToFloat<4>(registers->CP2C.n.bfc)); |
| 306 | + ImGui::Text("ofx : % 3.5f", fixedToFloat<15>(registers->CP2C.n.ofx)); |
| 307 | + ImGui::Text("ofy : % 3.5f", fixedToFloat<15>(registers->CP2C.n.ofy)); |
| 308 | + ImGui::Text("h : % i", registers->CP2C.n.h); |
| 309 | + ImGui::Text("dqa : % 3.5f", fixedToFloat<8>(registers->CP2C.n.dqa)); |
| 310 | + ImGui::Text("dqb : % 3.5f", fixedToFloat<24>(registers->CP2C.n.dqb)); |
| 311 | + ImGui::Text("zsf3: % 3.5f", fixedToFloat(registers->CP2C.n.zsf3)); |
| 312 | + ImGui::Text("zsf4: % 3.5f", fixedToFloat(registers->CP2C.n.zsf4)); |
| 313 | + } else { |
| 314 | + ImGui::Text("rfc : %i", registers->CP2C.n.rfc); |
| 315 | + ImGui::Text("gfc : %i", registers->CP2C.n.gfc); |
| 316 | + ImGui::Text("bfc : %i", registers->CP2C.n.bfc); |
| 317 | + ImGui::Text("ofx : %i", registers->CP2C.n.ofx); |
| 318 | + ImGui::Text("ofy : %i", registers->CP2C.n.ofy); |
| 319 | + ImGui::Text("h : %i", registers->CP2C.n.h); |
| 320 | + ImGui::Text("dqa : %i", registers->CP2C.n.dqa); |
| 321 | + ImGui::Text("dqb : %i", registers->CP2C.n.dqb); |
| 322 | + ImGui::Text("zsf3: %i", registers->CP2C.n.zsf3); |
| 323 | + ImGui::Text("zsf4: %i", registers->CP2C.n.zsf4); |
| 324 | + } |
| 325 | + ImGui::Text("flag: 0x%08x", registers->CP2C.n.flag); |
172 | 326 | ImGui::EndTabItem(); |
173 | 327 | } |
174 | 328 | if (ImGui::BeginTabItem(_("Misc"))) { |
|
0 commit comments