Etc Obj: Do mesh scaling otherwise Simple shader would break

This commit is contained in:
korenkonder
2024-05-10 22:06:30 +03:00
parent a44971446e
commit 46865f091b
+106 -259
View File
@@ -874,7 +874,7 @@ namespace mdl {
gl_state_bind_element_array_buffer(0);
}
static size_t gen_grid_vertices(prj::vector<float_t>& data,
static size_t gen_grid_vertices(prj::vector<prj::pair<vec3, vec3>>& data,
int32_t w, int32_t h, int32_t ws, int32_t hs) {
const int32_t ws_half = ws / 2;
const int32_t hs_half = hs / 2;
@@ -884,134 +884,71 @@ namespace mdl {
const float_t width = w_flt * 0.5f;
const float_t height = h_flt * 0.5f;
data.reserve(6ULL * 2 * ws * 2);
data.reserve(ws * 2ULL);
for (int32_t i = 0; i <= ws; i++) {
if (i == ws_half)
continue;
const float_t w = (float_t)i * (w_flt / ((float_t)ws_half * 2.0f)) - width;
data.push_back(w);
data.push_back(0.0f);
data.push_back(-height);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(w);
data.push_back(0.0f);
data.push_back(height);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back({ { w, 0.0f, -height }, { 0.0f } });
data.push_back({ { w, 0.0f, height }, { 0.0f } });
}
data.reserve(6ULL * 2 * hs * 2);
data.reserve(hs * 2ULL);
for (int32_t i = 0; i <= hs; i++) {
if (i == hs_half)
continue;
const float_t h = (float_t)i * (h_flt / ((float_t)hs_half * 2.0f)) - height;
data.push_back(-width);
data.push_back(0.0f);
data.push_back(h);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(width);
data.push_back(0.0f);
data.push_back(h);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back({ { -width, 0.0f, h }, { 0.0f } });
data.push_back({ { width, 0.0f, h }, { 0.0f } });
}
size_t center_offset = data.size();
data.reserve(6ULL * 2 * 2 * 2);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(-height);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(height);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(-width);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(width);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.reserve(2 * 2ULL);
data.push_back({ { 0.0f, 0.0f, -height }, { 0.0f } });
data.push_back({ { 0.0f, 0.0f, height }, { 0.0f } });
data.push_back({ { -width, 0.0f, 0.0f }, { 0.0f } });
data.push_back({ { width, 0.0f, 0.0f }, { 0.0f } });
return center_offset;
}
static void gen_cube_vertices(prj::vector<float_t>& data) {
data.resize(6ULL * 2 * 4 * 6);
static void gen_cube_vertices(prj::vector<prj::pair<vec3, vec3>>& data, vec3 size) {
size *= 0.5f;
vec3* vtx = (vec3*)data.data();
*vtx++ = { -1.0f, -1.0f, -1.0f };
*vtx++ = { 0.0f, 0.0f, -1.0f };
*vtx++ = { 1.0f, 1.0f, -1.0f };
*vtx++ = { 0.0f, 0.0f, -1.0f };
*vtx++ = { 1.0f, -1.0f, -1.0f };
*vtx++ = { 0.0f, 0.0f, -1.0f };
*vtx++ = { -1.0f, 1.0f, -1.0f };
*vtx++ = { 0.0f, 0.0f, -1.0f };
data.reserve(4 * 6ULL);
*vtx++ = { -1.0f, -1.0f, 1.0f };
*vtx++ = { 0.0f, 0.0f, 1.0f };
*vtx++ = { 1.0f, -1.0f, 1.0f };
*vtx++ = { 0.0f, 0.0f, 1.0f };
*vtx++ = { 1.0f, 1.0f, 1.0f };
*vtx++ = { 0.0f, 0.0f, 1.0f };
*vtx++ = { -1.0f, 1.0f, 1.0f };
*vtx++ = { 0.0f, 0.0f, 1.0f };
data.push_back({ { -size.x, -size.y, -size.z }, { 0.0f, 0.0f, -1.0f } });
data.push_back({ { size.x, size.y, -size.z }, { 0.0f, 0.0f, -1.0f } });
data.push_back({ { size.x, -size.y, -size.z }, { 0.0f, 0.0f, -1.0f } });
data.push_back({ { -size.x, size.y, -size.z }, { 0.0f, 0.0f, -1.0f } });
*vtx++ = { -1.0f, 1.0f, 1.0f };
*vtx++ = { -1.0f, 0.0f, 0.0f };
*vtx++ = { -1.0f, 1.0f, -1.0f };
*vtx++ = { -1.0f, 0.0f, 0.0f };
*vtx++ = { -1.0f, -1.0f, -1.0f };
*vtx++ = { -1.0f, 0.0f, 0.0f };
*vtx++ = { -1.0f, -1.0f, 1.0f };
*vtx++ = { -1.0f, 0.0f, 0.0f };
data.push_back({ { -size.x, -size.y, size.z }, { 0.0f, 0.0f, 1.0f } });
data.push_back({ { size.x, -size.y, size.z }, { 0.0f, 0.0f, 1.0f } });
data.push_back({ { size.x, size.y, size.z }, { 0.0f, 0.0f, 1.0f } });
data.push_back({ { -size.x, size.y, size.z }, { 0.0f, 0.0f, 1.0f } });
*vtx++ = { 1.0f, 1.0f, -1.0f };
*vtx++ = { 1.0f, 0.0f, 0.0f };
*vtx++ = { 1.0f, 1.0f, 1.0f };
*vtx++ = { 1.0f, 0.0f, 0.0f };
*vtx++ = { 1.0f, -1.0f, -1.0f };
*vtx++ = { 1.0f, 0.0f, 0.0f };
*vtx++ = { 1.0f, -1.0f, 1.0f };
*vtx++ = { 1.0f, 0.0f, 0.0f };
data.push_back({ { -size.x, size.y, size.z }, { -1.0f, 0.0f, 0.0f } });
data.push_back({ { -size.x, size.y, -size.z }, { -1.0f, 0.0f, 0.0f } });
data.push_back({ { -size.x, -size.y, -size.z }, { -1.0f, 0.0f, 0.0f } });
data.push_back({ { -size.x, -size.y, size.z }, { -1.0f, 0.0f, 0.0f } });
*vtx++ = { -1.0f, -1.0f, -1.0f };
*vtx++ = { 0.0f, -1.0f, 0.0f };
*vtx++ = { 1.0f, -1.0f, -1.0f };
*vtx++ = { 0.0f, -1.0f, 0.0f };
*vtx++ = { 1.0f, -1.0f, 1.0f };
*vtx++ = { 0.0f, -1.0f, 0.0f };
*vtx++ = { -1.0f, -1.0f, 1.0f };
*vtx++ = { 0.0f, -1.0f, 0.0f };
data.push_back({ { size.x, size.y, -size.z }, { 1.0f, 0.0f, 0.0f } });
data.push_back({ { size.x, size.y, size.z }, { 1.0f, 0.0f, 0.0f } });
data.push_back({ { size.x, -size.y, -size.z }, { 1.0f, 0.0f, 0.0f } });
data.push_back({ { size.x, -size.y, size.z }, { 1.0f, 0.0f, 0.0f } });
*vtx++ = { -1.0f, 1.0f, -1.0f };
*vtx++ = { 0.0f, 1.0f, 0.0f };
*vtx++ = { 1.0f, 1.0f, 1.0f };
*vtx++ = { 0.0f, 1.0f, 0.0f };
*vtx++ = { 1.0f, 1.0f, -1.0f };
*vtx++ = { 0.0f, 1.0f, 0.0f };
*vtx++ = { -1.0f, 1.0f, 1.0f };
*vtx++ = { 0.0f, 1.0f, 0.0f };
data.push_back({ { -size.x, -size.y, -size.z }, { 0.0f, -1.0f, 0.0f } });
data.push_back({ { size.x, -size.y, -size.z }, { 0.0f, -1.0f, 0.0f } });
data.push_back({ { size.x, -size.y, size.z }, { 0.0f, -1.0f, 0.0f } });
data.push_back({ { -size.x, -size.y, size.z }, { 0.0f, -1.0f, 0.0f } });
data.push_back({ { -size.x, size.y, -size.z }, { 0.0f, 1.0f, 0.0f } });
data.push_back({ { size.x, size.y, size.z }, { 0.0f, 1.0f, 0.0f } });
data.push_back({ { size.x, size.y, -size.z }, { 0.0f, 1.0f, 0.0f } });
data.push_back({ { -size.x, size.y, size.z }, { 0.0f, 1.0f, 0.0f } });
}
static size_t gen_cube_indices(prj::vector<uint32_t>& indices) {
@@ -1041,20 +978,12 @@ namespace mdl {
return wire_offset;
}
static void gen_sphere_vertices(prj::vector<float_t>& data,
static void gen_sphere_vertices(prj::vector<prj::pair<vec3, vec3>>& data,
int32_t slices, int32_t stacks, float_t radius) {
if (slices < 2 || stacks < 2)
return;
data.reserve(6ULL * 2);
data.push_back(0.0f);
data.push_back(radius);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back({ { 0.0f, radius, 0.0f }, { 0.0f, -1.0f, 0.0f} });
double_t slice_step = (M_PI * 2.0) / (double_t)slices;
double_t stack_step = M_PI / (double_t)stacks;
@@ -1064,7 +993,7 @@ namespace mdl {
float_t xz = cosf(stack_angle);
float_t y = sinf(stack_angle);
data.reserve(6ULL * 2 * slices);
data.reserve(slices);
for (int32_t j = 0; j < slices; j++) {
float_t slice_angle = (float_t)((double_t)j * slice_step);
@@ -1072,25 +1001,11 @@ namespace mdl {
float_t x = xz * cosf(slice_angle);
float_t z = xz * sinf(slice_angle);
data.push_back(x * radius);
data.push_back(y * radius);
data.push_back(z * radius);
data.push_back(x);
data.push_back(y);
data.push_back(z);
data.push_back({ { x * radius, y * radius, z * radius }, { x, y, z } });
}
}
data.reserve(6ULL * 2);
data.push_back(0.0f);
data.push_back(-radius);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(-1.0f);
data.push_back(0.0f);
data.push_back({ { 0.0f, -radius, 0.0f }, { 0.0f, -1.0f, 0.0f} });
}
static size_t gen_sphere_indices(prj::vector<uint32_t>& indices,
@@ -1212,112 +1127,36 @@ namespace mdl {
return wire_offset;
}
static void gen_plane_vertices(prj::vector<float_t>& data) {
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(1.0f);
static void gen_plane_vertices(prj::vector<prj::pair<vec3, vec3>>& data, int32_t w, int32_t h) {
float_t width = (float_t)w * 0.5f;
float_t height = (float_t)h * 0.5f;
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.reserve(4);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(-1.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(-1.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(-1.0f);
data.push_back(0.0f);
data.push_back(-1.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back({ { width, 0.0f, height }, { 0.0f, 1.0f, 0.0f } });
data.push_back({ { width, 0.0f, -height }, { 0.0f, 1.0f, 0.0f } });
data.push_back({ { -width, 0.0f, height }, { 0.0f, 1.0f, 0.0f } });
data.push_back({ { -width, 0.0f, -height }, { 0.0f, 1.0f, 0.0f } });
}
static void gen_line_vertices(prj::vector<float_t>& data, float_t length) {
static void gen_line_vertices(prj::vector<prj::pair<vec3, vec3>>& data, float_t length) {
length *= 0.5f;
data.reserve(6ULL * 2);
data.reserve(2);
data.push_back(0.0f);
data.push_back(length);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(-length);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back({ { 0.0f, length, 0.0f }, { 0.0f } });
data.push_back({ { 0.0f, -length, 0.0f }, { 0.0f } });
}
static void gen_cross_vertices(prj::vector<float_t>& data) {
data.reserve(6ULL * 2 * 6);
static void gen_cross_vertices(prj::vector<prj::pair<vec3, vec3>>& data, float_t size) {
data.reserve(6);
data.push_back(-1.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(-1.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(-1.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(1.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back(0.0f);
data.push_back({ { -size, 0.0f, 0.0f }, { 0.0f } });
data.push_back({ { size, 0.0f, 0.0f }, { 0.0f } });
data.push_back({ { 0.0f, -size, 0.0f }, { 0.0f } });
data.push_back({ { 0.0f, size, 0.0f }, { 0.0f }});
data.push_back({ { 0.0f, 0.0f, -size }, { 0.0f } });
data.push_back({ { 0.0f, 0.0f, size }, { 0.0f } });
}
void DispManager::add_vertex_array(EtcObj* etc, mat4& mat) {
@@ -1353,30 +1192,21 @@ namespace mdl {
case mdl::ETC_OBJ_CUBE: {
EtcObjCube& cube = etc->data.cube;
vec3 size = cube.size * 0.5f;
mat4_scale_rot(&mat, &size, &mat);
indexed = true;
wire = cube.wire;
} break;
case mdl::ETC_OBJ_SPHERE: {
EtcObjSphere& sphere = etc->data.sphere;
mat4_scale_rot(&mat, sphere.radius, &mat);
indexed = true;
wire = sphere.wire;
} break;
case mdl::ETC_OBJ_PLANE: {
EtcObjPlane& plane = etc->data.plane;
mat4_scale_rot(&mat, (float_t)plane.w * 0.5f, 1.0f, (float_t)plane.h * 0.5f, &mat);
} break;
case mdl::ETC_OBJ_CONE: {
EtcObjCone& cone = etc->data.cone;
mat4_scale_rot(&mat, cone.base, cone.height, cone.base, &mat);
indexed = true;
wire = cone.wire;
} break;
@@ -1400,8 +1230,6 @@ namespace mdl {
} break;
case mdl::ETC_OBJ_CROSS: {
EtcObjCross& cross = etc->data.cross;
mat4_scale_rot(&mat, cross.size, &mat);
} break;
}
@@ -1414,16 +1242,23 @@ namespace mdl {
|| type == mdl::ETC_OBJ_GRID
&& !memcmp(&i.data.grid, &etc->data.grid, sizeof(EtcObjGrid))
|| type == mdl::ETC_OBJ_CUBE
&& vec3::dot(vec3::abs(i.data.cube.size - etc->data.cube.size), 1.0f) < 0.00001f
|| type == mdl::ETC_OBJ_SPHERE
&& i.data.sphere.slices == etc->data.sphere.slices
&& i.data.sphere.stacks == etc->data.sphere.stacks
&& fabsf(i.data.sphere.radius - etc->data.sphere.radius) < 0.00001f
|| type == mdl::ETC_OBJ_PLANE
&& i.data.plane.w == etc->data.plane.w
&& i.data.plane.h == etc->data.plane.h
|| type == mdl::ETC_OBJ_CONE
&& i.data.cone.slices == etc->data.cone.slices
&& i.data.cone.stacks == etc->data.cone.stacks
&& fabsf(i.data.cone.base - etc->data.cone.base) < 0.00001f
&& fabsf(i.data.cone.height - etc->data.cone.height) < 0.00001f
|| type == mdl::ETC_OBJ_LINE
&& fabsf(vec3::distance(i.data.line.pos[0], i.data.line.pos[1]) - length) < 0.00001f
|| type == mdl::ETC_OBJ_CROSS)
|| type == mdl::ETC_OBJ_CROSS
&& fabsf(i.data.cross.size - etc->data.cross.size) < 0.00001f)
if (i.vertex_array) {
i.alive_time = 2;
if (!wire) {
@@ -1480,7 +1315,7 @@ namespace mdl {
etc_vertex_array->data = etc->data;
etc_vertex_array->type = type;
prj::vector<float_t> vtx_data;
prj::vector<prj::pair<vec3, vec3>> vtx_data;
prj::vector<uint32_t> vtx_indices;
switch (type) {
case mdl::ETC_OBJ_TEAPOT: {
@@ -1499,7 +1334,7 @@ namespace mdl {
case mdl::ETC_OBJ_CUBE: {
EtcObjCube& cube = etc->data.cube;
gen_cube_vertices(vtx_data);
gen_cube_vertices(vtx_data, cube.size);
size_t wire_offset = gen_cube_indices(vtx_indices);
etc_vertex_array->offset = 0;
@@ -1510,7 +1345,7 @@ namespace mdl {
case mdl::ETC_OBJ_SPHERE: {
EtcObjSphere& sphere = etc->data.sphere;
gen_sphere_vertices(vtx_data, sphere.slices, sphere.stacks, 1.0f);
gen_sphere_vertices(vtx_data, sphere.slices, sphere.stacks, sphere.radius);
size_t wire_offset = gen_sphere_indices(vtx_indices, sphere.slices, sphere.stacks);
etc_vertex_array->offset = 0;
@@ -1521,9 +1356,9 @@ namespace mdl {
case mdl::ETC_OBJ_PLANE: {
EtcObjPlane& plane = etc->data.plane;
gen_plane_vertices(vtx_data);
gen_plane_vertices(vtx_data, plane.w, plane.h);
etc_vertex_array->count = (GLsizei)(vtx_data.size() / 6);
etc_vertex_array->count = (GLsizei)(vtx_data.size());
} break;
case mdl::ETC_OBJ_CONE: {
EtcObjCone& cone = etc->data.cone;
@@ -1535,14 +1370,14 @@ namespace mdl {
gen_line_vertices(vtx_data, length);
etc_vertex_array->count = (GLsizei)(vtx_data.size() / 6);
etc_vertex_array->count = (GLsizei)(vtx_data.size());
} break;
case mdl::ETC_OBJ_CROSS: {
EtcObjCross& cross = etc->data.cross;
gen_cross_vertices(vtx_data);
gen_cross_vertices(vtx_data, cross.size);
etc_vertex_array->count = (GLsizei)(vtx_data.size() / 6);
etc_vertex_array->count = (GLsizei)(vtx_data.size());
} break;
}
@@ -1575,10 +1410,10 @@ namespace mdl {
gl_state_bind_vertex_array(etc_vertex_array->vertex_array);
if (etc_vertex_array->vertex_buffer.IsNull())
etc_vertex_array->vertex_buffer.Create(sizeof(float_t) * vtx_data.size());
etc_vertex_array->vertex_buffer.Create(sizeof(vec3) * 2 * vtx_data.size());
etc_vertex_array->vertex_buffer.Bind(true);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(float_t)
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vec3) * 2
* vtx_data.size(), vtx_data.data());
if (indexed) {
@@ -1700,6 +1535,7 @@ namespace mdl {
mat4 mat;
mat4_translate(&i, &mat);
mat4_transpose(&mat, &mat);
entry_obj_etc(&mat, &etc);
}
@@ -1714,6 +1550,7 @@ namespace mdl {
mat4 mat;
mat4_translate(&i, &mat);
mat4_transpose(&mat, &mat);
entry_obj_etc(&mat, &etc);
}
}
@@ -2745,17 +2582,23 @@ namespace mdl {
return i.vertex_array;
break;
case mdl::ETC_OBJ_CUBE:
return i.vertex_array;
if (vec3::dot(vec3::abs(i.data.cube.size - etc->data.cube.size), 1.0f) < 0.00001f)
return i.vertex_array;
case mdl::ETC_OBJ_SPHERE:
if (i.data.sphere.slices == etc->data.sphere.slices
&& i.data.sphere.stacks == etc->data.sphere.stacks)
&& i.data.sphere.stacks == etc->data.sphere.stacks
&& fabsf(i.data.sphere.radius - etc->data.sphere.radius) < 0.00001f)
return i.vertex_array;
break;
case mdl::ETC_OBJ_PLANE:
return i.vertex_array;
if (i.data.plane.w == etc->data.plane.w
&& i.data.plane.h == etc->data.plane.h)
return i.vertex_array;
case mdl::ETC_OBJ_CONE:
if (i.data.cone.slices == etc->data.cone.slices
&& i.data.cone.stacks == etc->data.cone.stacks)
&& i.data.cone.stacks == etc->data.cone.stacks
&& fabsf(i.data.cone.base - etc->data.cone.base) < 0.00001f
&& fabsf(i.data.cone.height - etc->data.cone.height) < 0.00001f)
return i.vertex_array;
break;
case mdl::ETC_OBJ_LINE:
@@ -2763,7 +2606,8 @@ namespace mdl {
return i.vertex_array;
break;
case mdl::ETC_OBJ_CROSS:
return i.vertex_array;
if (fabsf(i.data.cross.size - etc->data.cross.size) < 0.00001f)
return i.vertex_array;
}
}
return 0;
@@ -2993,8 +2837,9 @@ namespace mdl {
int32_t set_id = object_database_get_set_id(*(int32_t*)(a1 + 0x68));
int32_t id = object_database_get_set_obj_id(*(int32_t*)(a1 + 0x68), *(int32_t*)(a1 + 0x74));
disp_manager->set_obj_flags((mdl::ObjFlags)(*(int32_t*)(a1 + 0x84) | mdl::OBJ_40 | mdl::OBJ_20));
mat4 mat;
mat4_rotate_xyz(*(float_t*)(a1 + 0x78), *(float_t*)(a1 + 0x7C), *(float_t*)(a1 + 0x80), &mat);
mat4_rotate_xyz((vec3*)(a1 + 0x78), &mat);
mat4_transpose(&mat, &mat);
vec3 pos = 0.0f;
@@ -3004,18 +2849,19 @@ namespace mdl {
disp_manager->set_obj_flags((mdl::ObjFlags)0);
}
HOOK(void, FASTCALL, sub_14031AF10, 0x000000014031AF10, obj_axis_aligned_bounding_box* aabb, color4u8_bgra color) {
mdl::EtcObj etc(mdl::ETC_OBJ_SPHERE);
HOOK(void, FASTCALL, MeshDw__DrawObjAxisAlignedBoundingBox, 0x000000014031AF10, obj_axis_aligned_bounding_box* aabb, color4u8_bgra color) {
mdl::EtcObj etc(mdl::ETC_OBJ_CUBE);
etc.color = color;
etc.fog = false;
etc.data.cube.size = aabb->size * 2.0f;
mat4 mat;
mat4_translate(&aabb->center, &mat);
mat4_transpose(&mat, &mat);
disp_manager->entry_obj_etc(&mat, &etc);
}
HOOK(void, FASTCALL, sub_14031AFE0, 0x000000014031AFE0, obj_bounding_sphere* bounding_sphere, color4u8_bgra color) {
HOOK(void, FASTCALL, MeshDw__DrawObjBoundingSphere, 0x000000014031AFE0, obj_bounding_sphere* bounding_sphere, color4u8_bgra color) {
mdl::EtcObj etc(mdl::ETC_OBJ_SPHERE);
etc.color = color;
etc.fog = false;
@@ -3026,6 +2872,7 @@ namespace mdl {
mat4 mat;
mat4_translate(&bounding_sphere->center, &mat);
mat4_transpose(&mat, &mat);
disp_manager->entry_obj_etc(&mat, &etc);
}
@@ -3073,8 +2920,8 @@ namespace mdl {
void disp_manager_patch() {
INSTALL_HOOK(DataTestObjectManager__Disp);
INSTALL_HOOK(sub_14031AF10);
INSTALL_HOOK(sub_14031AFE0);
INSTALL_HOOK(MeshDw__DrawObjAxisAlignedBoundingBox);
INSTALL_HOOK(MeshDw__DrawObjBoundingSphere);
INSTALL_HOOK(DispManager__entry_obj);
INSTALL_HOOK(DispManager__entry_obj_etc);
INSTALL_HOOK(DispManager__entry_obj_by_obj);