#include "render.h"
#include "CORE/MATH/matrix34.h"
#include "CORE/MATH/transfrm.h"
#include "CORE/V1DB/dbsetup.h"
#include "CORE/V1DB/modrend.h"
#include "harness/hooks.h"
#include "harness/trace.h"
#include <string.h>
#define RendererModelMul(self, a1) self->dispatch->_modelMulF(self, a1);
#define RendererStatePush(self, a1) self->dispatch->_statePush(self, a1);
#define RendererStatePop(self, a1) self->dispatch->_statePop(self, a1);
// IDA: void __cdecl BrDbModelRender(br_actor *actor, br_model *model, br_material *material, void *render_data, br_uint_8 style, int on_screen, int use_custom)
void BrDbModelRender(br_actor* actor, br_model* model, br_material* material, void* render_data, br_uint_8 style, int on_screen, int use_custom) {
//br_int_32 count; // Pierre-Marie Baty -- unused variable
//br_token_value tv[5]; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p, %p, %p, %p, %d, %d, %d)", actor, model, material, render_data, style, on_screen, use_custom);
v1db.model_to_screen_valid = 0;
if (use_custom && (model->flags & BR_MODF_CUSTOM)) {
model->custom(actor, model, material, render_data, style, on_screen);
return;
}
if (model->prepared == NULL && model->stored == NULL) {
// TELL_ME_IF_WE_PASS_THIS_WAY();
// TODO: gShadow_model is not created yet. Will trip into this
// LOG_WARN("Tried to render un-prepared model %s", model->identifier ? model->identifier : "<NULL>");
}
RenderStyleCalls[style](actor, model, material, render_data, style, on_screen);
}
// IDA: br_uint_32 __cdecl BrOnScreenCheck(br_bounds3 *bounds)
br_uint_32 BrOnScreenCheck(br_bounds3* bounds) {
br_token r;
LOG_TRACE("(%p)", bounds);
STUB_ONCE(); // Add call to STUB_ONCE to mark this function as not implemented.
return 1;
// FIXME: use this once the clouse clear up.
v1db.renderer->dispatch->_boundsTestF(v1db.renderer, &r, (br_bounds3_f*)bounds);
return r;
}
// IDA: br_uint_16 __usercall prependActorTransform@<AX>(br_actor *ap@<EAX>, br_uint_16 t@<EDX>)
br_uint_16 prependActorTransform(br_actor* ap, br_uint_16 t) {
br_matrix34 mt;
LOG_TRACE("(%p, %d)", ap, t);
if (BrTransformTypeIsMatrix34(ap->t.type)) {
RendererModelMul(v1db.renderer, (void*)&ap->t.t.mat);
} else {
BrTransformToMatrix34(&mt, &ap->t);
RendererModelMul(v1db.renderer, (void*)&mt);
}
t = BrTransformCombineTypes(t, ap->t.type);
// RendererPartSet(v1db.renderer, BRT_MATRIX, 0,
// BRT_MODEL_TO_VIEW_HINT_T, BrTransformTypeIsLP(t) ? BRT_LENGTH_PRESERVING : BRT_NONE);
return t;
}
// IDA: br_uint_16 __usercall prependMatrix@<AX>(br_matrix34 *mat@<EAX>, br_uint_16 mat_t@<EDX>, br_uint_16 t@<EBX>)
br_uint_16 prependMatrix(br_matrix34* mat, br_uint_16 mat_t, br_uint_16 t) {
//br_matrix34 mt; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p, %d, %d)", mat, mat_t, t);
RendererModelMul(v1db.renderer, (void*)mat);
t = BrTransformCombineTypes(t, mat_t);
return t;
}
// IDA: void __usercall actorRender(br_actor *ap@<EAX>, br_model *model@<EDX>, br_material *material@<EBX>, void *render_data@<ECX>, br_uint_8 style, br_uint_16 t)
void actorRender(br_actor* ap, br_model* model, br_material* material, void* render_data, br_uint_8 style, br_uint_16 t) {
br_material* this_material;
br_model* this_model;
void* this_render_data;
br_actor* a;
br_token s;
LOG_TRACE("(%p, %p, %p, %p, %d, %d)", ap, model, material, render_data, style, t);
if (ap->children == NULL && ap->type != BR_ACTOR_MODEL)
return;
if (ap->render_style != BR_RSTYLE_DEFAULT)
style = ap->render_style;
if (style == BR_RSTYLE_NONE)
return;
this_material = ap->material ? ap->material : material;
this_model = ap->model ? ap->model : model;
this_render_data = ap->render_data ? ap->render_data : render_data;
if (ap->t.type == BR_TRANSFORM_IDENTITY) {
switch (ap->type) {
case BR_ACTOR_MODEL:
if ((s = BrOnScreenCheck(&this_model->bounds)) != BRT_REJECT) {
BrDbModelRender(ap, this_model, this_material, this_render_data, style, s, 1);
}
break;
case BR_ACTOR_BOUNDS:
if (BrOnScreenCheck(ap->type_data) == BRT_REJECT)
return;
break;
case BR_ACTOR_BOUNDS_CORRECT:
switch (BrOnScreenCheck(ap->type_data)) {
case BRT_ACCEPT:
BR_FOR_SIMPLELIST(&ap->children, a)
actorRenderOnScreen(a, this_model, this_material, this_render_data, style, t);
return;
case BRT_REJECT:
return;
}
}
BR_FOR_SIMPLELIST(&ap->children, a)
actorRender(a, this_model, this_material, this_render_data, style, t);
return;
}
RendererStatePush(v1db.renderer, BR_STATE_MATRIX);
t = prependActorTransform(ap, t);
switch (ap->type) {
case BR_ACTOR_MODEL:
if ((s = BrOnScreenCheck(&this_model->bounds)) != BRT_REJECT) {
BrDbModelRender(ap, this_model, this_material, this_render_data, style, s, 1);
}
break;
case BR_ACTOR_BOUNDS:
if (BrOnScreenCheck(ap->type_data) == BRT_REJECT) {
RendererStatePop(v1db.renderer, BR_STATE_MATRIX);
return;
}
break;
case BR_ACTOR_BOUNDS_CORRECT:
switch (BrOnScreenCheck(ap->type_data)) {
case BRT_ACCEPT:
BR_FOR_SIMPLELIST(&ap->children, a)
actorRenderOnScreen(a, this_model, this_material, this_render_data, style, t);
return;
case BRT_REJECT:
RendererStatePop(v1db.renderer, BR_STATE_MATRIX);
return;
}
}
BR_FOR_SIMPLELIST(&ap->children, a)
actorRender(a, this_model, this_material, this_render_data, style, t);
RendererStatePop(v1db.renderer, BR_STATE_MATRIX);
}
// IDA: void __usercall actorRenderOnScreen(br_actor *ap@<EAX>, br_model *model@<EDX>, br_material *material@<EBX>, void *render_data@<ECX>, br_uint_8 style, br_uint_16 t)
void actorRenderOnScreen(br_actor* ap, br_model* model, br_material* material, void* render_data, br_uint_8 style, br_uint_16 t) {
//br_material* this_material; // Pierre-Marie Baty -- unused variable
//br_model* this_model; // Pierre-Marie Baty -- unused variable
//void* this_render_data; // Pierre-Marie Baty -- unused variable
//br_actor* a; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p, %p, %p, %p, %d, %d)", ap, model, material, render_data, style, t);
NOT_IMPLEMENTED();
}
// IDA: void __usercall sceneRenderWorld(br_actor *world@<EAX>)
void sceneRenderWorld(br_actor* world) {
//br_model* model; // Pierre-Marie Baty -- unused variable
//br_material* material; // Pierre-Marie Baty -- unused variable
//void* render_data; // Pierre-Marie Baty -- unused variable
//br_uint_8 style; // Pierre-Marie Baty -- unused variable
//br_actor* a; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p)", world);
NOT_IMPLEMENTED();
}
// IDA: void __usercall sceneRenderAdd(br_actor *tree@<EAX>)
void sceneRenderAdd(br_actor* tree) {
br_material* material;
br_model* model;
void* render_data;
br_uint_8 style;
br_actor* a;
br_int_32 t;
br_matrix34 m;
LOG_TRACE("(%p)", tree);
material = NULL;
model = NULL;
render_data = NULL;
style = BR_RSTYLE_DEFAULT;
if (tree->parent == NULL) {
actorRender(tree,
v1db.default_model,
v1db.default_material,
v1db.default_render_data, BR_RSTYLE_DEFAULT,
(br_uint_16)v1db.ttype);
return;
}
t = BR_TRANSFORM_IDENTITY;
BrMatrix34Identity(&m);
for (a = tree->parent; a; a = a->parent) {
if (material == NULL && a->material)
material = a->material;
if (model == NULL && a->model)
model = a->model;
if (render_data == NULL && a->render_data)
render_data = a->render_data;
if (a->render_style != BR_RSTYLE_DEFAULT)
style = a->render_style;
if (a == v1db.render_root)
break;
if (a->t.type != BR_TRANSFORM_IDENTITY) {
BrMatrix34PostTransform(&m, &a->t);
t = BrTransformCombineTypes(t, a->t.type);
}
}
if (material == NULL)
material = v1db.default_material;
if (model == NULL)
model = v1db.default_model;
if (render_data == NULL)
render_data = v1db.default_render_data;
if (t == BR_TRANSFORM_IDENTITY) {
actorRender(tree, model, material, render_data, style, (br_uint_16)v1db.ttype);
} else {
RendererStatePush(v1db.renderer, BR_STATE_MATRIX);
t = prependMatrix(&m, (unsigned short)t, (unsigned short)v1db.ttype);
actorRender(tree, model, material, render_data, style, (br_uint_16)t);
RendererStatePop(v1db.renderer, BR_STATE_MATRIX);
}
}
// IDA: void __cdecl BrDbSceneRenderBegin(br_actor *world, br_actor *camera)
void BrDbSceneRenderBegin(br_actor* world, br_actor* camera) {
br_matrix34 tfm;
//br_matrix4 vtos; // Pierre-Marie Baty -- unused variable
br_actor* a;
int i;
//br_token vtos_type; // Pierre-Marie Baty -- unused variable
//br_uint_32 dummy; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p, %p)", world, camera);
// this is not complete
STUB_ONCE();
/*
* Collect transforms from camera to root
*
* Make a stack of cumulative transforms for each level between
* the camera and the root - this is so that model->view
* transforms can use the shortest route, rather than via the root
*/
for (i = 0; i < BR_ASIZE(v1db.camera_path); i++) {
v1db.camera_path[i].a = NULL;
}
i = camera->depth;
a = camera;
BrMatrix34Identity(&v1db.camera_path[i].m);
v1db.camera_path[i].transform_type = BR_TRANSFORM_IDENTITY;
for (; (i > 0) && (a != world); a = a->parent, i--) {
BrTransformToMatrix34(&tfm, &a->t);
BrMatrix34Mul(&v1db.camera_path[i - 1].m, &v1db.camera_path[i].m, &tfm);
v1db.camera_path[i - 1].transform_type = BrTransformCombineTypes(v1db.camera_path[i].transform_type, a->t.type);
v1db.camera_path[i].a = a;
}
if (world != a) {
// BrFailure("camera is not in world hierachy");
}
}
// IDA: br_renderbounds_cbfn* __cdecl BrDbSetRenderBoundsCallback(br_renderbounds_cbfn *new_cbfn)
br_renderbounds_cbfn* BrDbSetRenderBoundsCallback(br_renderbounds_cbfn* new_cbfn) {
//br_renderbounds_cbfn* old_cbfn; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p)", new_cbfn);
NOT_IMPLEMENTED();
}
// IDA: void __usercall SetOrigin(br_pixelmap *buffer@<EAX>)
void SetOrigin(br_pixelmap* buffer) {
LOG_TRACE("(%p)", buffer);
NOT_IMPLEMENTED();
}
// IDA: void __usercall SetViewport(br_pixelmap *buffer@<EAX>)
void SetViewport(br_pixelmap* buffer) {
LOG_TRACE("(%p)", buffer);
NOT_IMPLEMENTED();
}
// IDA: void __cdecl BrZbSceneRenderBegin(br_actor *world, br_actor *camera, br_pixelmap *colour_buffer, br_pixelmap *depth_buffer)
void BrZbSceneRenderBegin(br_actor* world, br_actor* camera, br_pixelmap* colour_buffer, br_pixelmap* depth_buffer) {
// LOG_TRACE("(%p, %p, %p, %p)", world, camera, colour_buffer, depth_buffer);
BrDbSceneRenderBegin(world, camera);
gHarness_platform.Renderer_BeginScene(camera, colour_buffer, depth_buffer);
}
// IDA: void __cdecl BrZbSceneRenderAdd(br_actor *tree)
void BrZbSceneRenderAdd(br_actor* tree) {
// LOG_TRACE("(%p)", tree);
sceneRenderAdd(tree);
}
// IDA: void __cdecl BrZbSceneRenderEnd()
void BrZbSceneRenderEnd(void) {
// LOG_TRACE("()");
gHarness_platform.Renderer_FlushBuffers();
gHarness_platform.Renderer_EndScene();
}
// IDA: void __cdecl BrZbSceneRender(br_actor *world, br_actor *camera, br_pixelmap *colour_buffer, br_pixelmap *depth_buffer)
void BrZbSceneRender(br_actor* world, br_actor* camera, br_pixelmap* colour_buffer, br_pixelmap* depth_buffer) {
//br_actor* a; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p, %p, %p, %p)", world, camera, colour_buffer, depth_buffer);
NOT_IMPLEMENTED();
}
// IDA: void __cdecl BrZsSceneRenderBegin(br_actor *world, br_actor *camera, br_pixelmap *colour_buffer)
void BrZsSceneRenderBegin(br_actor* world, br_actor* camera, br_pixelmap* colour_buffer) {
//br_camera* camera_data; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p, %p, %p)", world, camera, colour_buffer);
NOT_IMPLEMENTED();
}
// IDA: void __cdecl BrZsSceneRenderAdd(br_actor *tree)
void BrZsSceneRenderAdd(br_actor* tree) {
LOG_TRACE("(%p)", tree);
NOT_IMPLEMENTED();
}
// IDA: void __cdecl BrZsSceneRenderEnd()
void BrZsSceneRenderEnd(void) {
LOG_TRACE("()");
NOT_IMPLEMENTED();
}
// IDA: void __cdecl BrZsSceneRender(br_actor *world, br_actor *camera, br_pixelmap *colour_buffer)
void BrZsSceneRender(br_actor* world, br_actor* camera, br_pixelmap* colour_buffer) {
//br_actor* a; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p, %p, %p)", world, camera, colour_buffer);
NOT_IMPLEMENTED();
}
// IDA: br_primitive_cbfn* __cdecl BrZsPrimitiveCallbackSet(br_primitive_cbfn *new_cbfn)
br_primitive_cbfn* BrZsPrimitiveCallbackSet(br_primitive_cbfn* new_cbfn) {
//br_primitive_cbfn* old_cbfn; // Pierre-Marie Baty -- unused variable
LOG_TRACE("(%p)", new_cbfn);
NOT_IMPLEMENTED();
}
// IDA: void __cdecl BrZbModelRender(br_actor *actor, br_model *model, br_material *material, br_uint_8 style, int on_screen, int use_custom)
void BrZbModelRender(br_actor* actor, br_model* model, br_material* material, br_uint_8 style, int on_screen, int use_custom) {
LOG_TRACE("(%p, %p, %p, %d, %d, %d)", actor, model, material, style, on_screen, use_custom);
BrDbModelRender(actor, model, material, 0, style, on_screen, use_custom);
}
// IDA: void __cdecl BrZsModelRender(br_actor *actor, br_model *model, br_material *material, br_order_table *order_table, br_uint_8 style, int on_screen, int use_custom)
void BrZsModelRender(br_actor* actor, br_model* model, br_material* material, br_order_table* order_table, br_uint_8 style, int on_screen, int use_custom) {
LOG_TRACE("(%p, %p, %p, %p, %d, %d, %d)", actor, model, material, order_table, style, on_screen, use_custom);
NOT_IMPLEMENTED();
}
// IDA: br_renderbounds_cbfn* __cdecl BrZbRenderBoundsCallbackSet(br_renderbounds_cbfn *new_cbfn)
br_renderbounds_cbfn* BrZbRenderBoundsCallbackSet(br_renderbounds_cbfn* new_cbfn) {
LOG_TRACE("(%p)", new_cbfn);
NOT_IMPLEMENTED();
}
// IDA: br_renderbounds_cbfn* __cdecl BrZsRenderBoundsCallbackSet(br_renderbounds_cbfn *new_cbfn)
br_renderbounds_cbfn* BrZsRenderBoundsCallbackSet(br_renderbounds_cbfn* new_cbfn) {
LOG_TRACE("(%p)", new_cbfn);
NOT_IMPLEMENTED();
}