Subversion Repositories Games.Carmageddon

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
20 pmbaty 1
#include "render.h"
2
#include "CORE/MATH/matrix34.h"
3
#include "CORE/MATH/transfrm.h"
4
#include "CORE/V1DB/dbsetup.h"
5
#include "CORE/V1DB/modrend.h"
6
#include "harness/hooks.h"
7
#include "harness/trace.h"
8
#include <string.h>
9
 
10
#define RendererModelMul(self, a1) self->dispatch->_modelMulF(self, a1);
11
#define RendererStatePush(self, a1) self->dispatch->_statePush(self, a1);
12
#define RendererStatePop(self, a1) self->dispatch->_statePop(self, a1);
13
 
14
// 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)
15
void BrDbModelRender(br_actor* actor, br_model* model, br_material* material, void* render_data, br_uint_8 style, int on_screen, int use_custom) {
16
    //br_int_32 count; // Pierre-Marie Baty -- unused variable
17
    //br_token_value tv[5]; // Pierre-Marie Baty -- unused variable
18
    LOG_TRACE("(%p, %p, %p, %p, %d, %d, %d)", actor, model, material, render_data, style, on_screen, use_custom);
19
 
20
    v1db.model_to_screen_valid = 0;
21
    if (use_custom && (model->flags & BR_MODF_CUSTOM)) {
22
        model->custom(actor, model, material, render_data, style, on_screen);
23
        return;
24
    }
25
 
26
    if (model->prepared == NULL && model->stored == NULL) {
27
        // TELL_ME_IF_WE_PASS_THIS_WAY();
28
        // TODO: gShadow_model is not created yet. Will trip into this
29
        // LOG_WARN("Tried to render un-prepared model %s", model->identifier ? model->identifier : "<NULL>");
30
    }
31
 
32
    RenderStyleCalls[style](actor, model, material, render_data, style, on_screen);
33
}
34
 
35
// IDA: br_uint_32 __cdecl BrOnScreenCheck(br_bounds3 *bounds)
36
br_uint_32 BrOnScreenCheck(br_bounds3* bounds) {
37
    br_token r;
38
    LOG_TRACE("(%p)", bounds);
39
 
40
    STUB_ONCE(); // Add call to STUB_ONCE to mark this function as not implemented.
41
    return 1;
42
 
43
    // FIXME: use this once the clouse clear up.
44
    v1db.renderer->dispatch->_boundsTestF(v1db.renderer, &r, (br_bounds3_f*)bounds);
45
    return r;
46
}
47
 
48
// IDA: br_uint_16 __usercall prependActorTransform@<AX>(br_actor *ap@<EAX>, br_uint_16 t@<EDX>)
49
br_uint_16 prependActorTransform(br_actor* ap, br_uint_16 t) {
50
    br_matrix34 mt;
51
    LOG_TRACE("(%p, %d)", ap, t);
52
 
53
    if (BrTransformTypeIsMatrix34(ap->t.type)) {
54
        RendererModelMul(v1db.renderer, (void*)&ap->t.t.mat);
55
    } else {
56
        BrTransformToMatrix34(&mt, &ap->t);
57
        RendererModelMul(v1db.renderer, (void*)&mt);
58
    }
59
    t = BrTransformCombineTypes(t, ap->t.type);
60
 
61
    // RendererPartSet(v1db.renderer, BRT_MATRIX, 0,
62
    //     BRT_MODEL_TO_VIEW_HINT_T, BrTransformTypeIsLP(t) ? BRT_LENGTH_PRESERVING : BRT_NONE);
63
 
64
    return t;
65
}
66
 
67
// IDA: br_uint_16 __usercall prependMatrix@<AX>(br_matrix34 *mat@<EAX>, br_uint_16 mat_t@<EDX>, br_uint_16 t@<EBX>)
68
br_uint_16 prependMatrix(br_matrix34* mat, br_uint_16 mat_t, br_uint_16 t) {
69
    //br_matrix34 mt; // Pierre-Marie Baty -- unused variable
70
    LOG_TRACE("(%p, %d, %d)", mat, mat_t, t);
71
 
72
    RendererModelMul(v1db.renderer, (void*)mat);
73
 
74
    t = BrTransformCombineTypes(t, mat_t);
75
 
76
    return t;
77
}
78
 
79
// 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)
80
void actorRender(br_actor* ap, br_model* model, br_material* material, void* render_data, br_uint_8 style, br_uint_16 t) {
81
    br_material* this_material;
82
    br_model* this_model;
83
    void* this_render_data;
84
    br_actor* a;
85
    br_token s;
86
    LOG_TRACE("(%p, %p, %p, %p, %d, %d)", ap, model, material, render_data, style, t);
87
 
88
    if (ap->children == NULL && ap->type != BR_ACTOR_MODEL)
89
        return;
90
 
91
    if (ap->render_style != BR_RSTYLE_DEFAULT)
92
        style = ap->render_style;
93
 
94
    if (style == BR_RSTYLE_NONE)
95
        return;
96
 
97
    this_material = ap->material ? ap->material : material;
98
    this_model = ap->model ? ap->model : model;
99
    this_render_data = ap->render_data ? ap->render_data : render_data;
100
 
101
    if (ap->t.type == BR_TRANSFORM_IDENTITY) {
102
 
103
        switch (ap->type) {
104
 
105
        case BR_ACTOR_MODEL:
106
 
107
            if ((s = BrOnScreenCheck(&this_model->bounds)) != BRT_REJECT) {
108
                BrDbModelRender(ap, this_model, this_material, this_render_data, style, s, 1);
109
            }
110
            break;
111
 
112
        case BR_ACTOR_BOUNDS:
113
 
114
            if (BrOnScreenCheck(ap->type_data) == BRT_REJECT)
115
                return;
116
            break;
117
 
118
        case BR_ACTOR_BOUNDS_CORRECT:
119
            switch (BrOnScreenCheck(ap->type_data)) {
120
            case BRT_ACCEPT:
121
                BR_FOR_SIMPLELIST(&ap->children, a)
122
                actorRenderOnScreen(a, this_model, this_material, this_render_data, style, t);
123
                return;
124
            case BRT_REJECT:
125
                return;
126
            }
127
        }
128
 
129
        BR_FOR_SIMPLELIST(&ap->children, a)
130
        actorRender(a, this_model, this_material, this_render_data, style, t);
131
        return;
132
    }
133
 
134
    RendererStatePush(v1db.renderer, BR_STATE_MATRIX);
135
 
136
    t = prependActorTransform(ap, t);
137
 
138
    switch (ap->type) {
139
 
140
    case BR_ACTOR_MODEL:
141
        if ((s = BrOnScreenCheck(&this_model->bounds)) != BRT_REJECT) {
142
            BrDbModelRender(ap, this_model, this_material, this_render_data, style, s, 1);
143
        }
144
        break;
145
 
146
    case BR_ACTOR_BOUNDS:
147
        if (BrOnScreenCheck(ap->type_data) == BRT_REJECT) {
148
            RendererStatePop(v1db.renderer, BR_STATE_MATRIX);
149
            return;
150
        }
151
        break;
152
 
153
    case BR_ACTOR_BOUNDS_CORRECT:
154
        switch (BrOnScreenCheck(ap->type_data)) {
155
        case BRT_ACCEPT:
156
            BR_FOR_SIMPLELIST(&ap->children, a)
157
            actorRenderOnScreen(a, this_model, this_material, this_render_data, style, t);
158
            return;
159
        case BRT_REJECT:
160
            RendererStatePop(v1db.renderer, BR_STATE_MATRIX);
161
            return;
162
        }
163
    }
164
 
165
    BR_FOR_SIMPLELIST(&ap->children, a)
166
    actorRender(a, this_model, this_material, this_render_data, style, t);
167
    RendererStatePop(v1db.renderer, BR_STATE_MATRIX);
168
}
169
 
170
// 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)
171
void actorRenderOnScreen(br_actor* ap, br_model* model, br_material* material, void* render_data, br_uint_8 style, br_uint_16 t) {
172
    //br_material* this_material; // Pierre-Marie Baty -- unused variable
173
    //br_model* this_model; // Pierre-Marie Baty -- unused variable
174
    //void* this_render_data; // Pierre-Marie Baty -- unused variable
175
    //br_actor* a; // Pierre-Marie Baty -- unused variable
176
    LOG_TRACE("(%p, %p, %p, %p, %d, %d)", ap, model, material, render_data, style, t);
177
    NOT_IMPLEMENTED();
178
}
179
 
180
// IDA: void __usercall sceneRenderWorld(br_actor *world@<EAX>)
181
void sceneRenderWorld(br_actor* world) {
182
    //br_model* model; // Pierre-Marie Baty -- unused variable
183
    //br_material* material; // Pierre-Marie Baty -- unused variable
184
    //void* render_data; // Pierre-Marie Baty -- unused variable
185
    //br_uint_8 style; // Pierre-Marie Baty -- unused variable
186
    //br_actor* a; // Pierre-Marie Baty -- unused variable
187
    LOG_TRACE("(%p)", world);
188
    NOT_IMPLEMENTED();
189
}
190
 
191
// IDA: void __usercall sceneRenderAdd(br_actor *tree@<EAX>)
192
void sceneRenderAdd(br_actor* tree) {
193
    br_material* material;
194
    br_model* model;
195
    void* render_data;
196
    br_uint_8 style;
197
    br_actor* a;
198
    br_int_32 t;
199
    br_matrix34 m;
200
    LOG_TRACE("(%p)", tree);
201
 
202
    material = NULL;
203
    model = NULL;
204
    render_data = NULL;
205
    style = BR_RSTYLE_DEFAULT;
206
 
207
    if (tree->parent == NULL) {
208
        actorRender(tree,
209
            v1db.default_model,
210
            v1db.default_material,
211
            v1db.default_render_data, BR_RSTYLE_DEFAULT,
212
            (br_uint_16)v1db.ttype);
213
        return;
214
    }
215
 
216
    t = BR_TRANSFORM_IDENTITY;
217
    BrMatrix34Identity(&m);
218
 
219
    for (a = tree->parent; a; a = a->parent) {
220
        if (material == NULL && a->material)
221
            material = a->material;
222
 
223
        if (model == NULL && a->model)
224
            model = a->model;
225
 
226
        if (render_data == NULL && a->render_data)
227
            render_data = a->render_data;
228
        if (a->render_style != BR_RSTYLE_DEFAULT)
229
            style = a->render_style;
230
 
231
        if (a == v1db.render_root)
232
            break;
233
 
234
        if (a->t.type != BR_TRANSFORM_IDENTITY) {
235
            BrMatrix34PostTransform(&m, &a->t);
236
            t = BrTransformCombineTypes(t, a->t.type);
237
        }
238
    }
239
 
240
    if (material == NULL)
241
        material = v1db.default_material;
242
 
243
    if (model == NULL)
244
        model = v1db.default_model;
245
 
246
    if (render_data == NULL)
247
        render_data = v1db.default_render_data;
248
 
249
    if (t == BR_TRANSFORM_IDENTITY) {
250
        actorRender(tree, model, material, render_data, style, (br_uint_16)v1db.ttype);
251
    } else {
252
        RendererStatePush(v1db.renderer, BR_STATE_MATRIX);
253
        t = prependMatrix(&m, (unsigned short)t, (unsigned short)v1db.ttype);
254
        actorRender(tree, model, material, render_data, style, (br_uint_16)t);
255
        RendererStatePop(v1db.renderer, BR_STATE_MATRIX);
256
    }
257
}
258
 
259
// IDA: void __cdecl BrDbSceneRenderBegin(br_actor *world, br_actor *camera)
260
void BrDbSceneRenderBegin(br_actor* world, br_actor* camera) {
261
    br_matrix34 tfm;
262
    //br_matrix4 vtos; // Pierre-Marie Baty -- unused variable
263
    br_actor* a;
264
    int i;
265
    //br_token vtos_type; // Pierre-Marie Baty -- unused variable
266
    //br_uint_32 dummy; // Pierre-Marie Baty -- unused variable
267
    LOG_TRACE("(%p, %p)", world, camera);
268
 
269
    // this is not complete
270
    STUB_ONCE();
271
 
272
    /*
273
     * Collect transforms from camera to root
274
     *
275
     * Make a stack of cumulative transforms for each level between
276
     * the camera and the root - this is so that model->view
277
     * transforms can use the shortest route, rather than via the root
278
     */
279
    for (i = 0; i < BR_ASIZE(v1db.camera_path); i++) {
280
        v1db.camera_path[i].a = NULL;
281
    }
282
 
283
    i = camera->depth;
284
    a = camera;
285
    BrMatrix34Identity(&v1db.camera_path[i].m);
286
    v1db.camera_path[i].transform_type = BR_TRANSFORM_IDENTITY;
287
 
288
    for (; (i > 0) && (a != world); a = a->parent, i--) {
289
        BrTransformToMatrix34(&tfm, &a->t);
290
        BrMatrix34Mul(&v1db.camera_path[i - 1].m, &v1db.camera_path[i].m, &tfm);
291
 
292
        v1db.camera_path[i - 1].transform_type = BrTransformCombineTypes(v1db.camera_path[i].transform_type, a->t.type);
293
 
294
        v1db.camera_path[i].a = a;
295
    }
296
 
297
    if (world != a) {
298
        // BrFailure("camera is not in world hierachy");
299
    }
300
}
301
 
302
// IDA: br_renderbounds_cbfn* __cdecl BrDbSetRenderBoundsCallback(br_renderbounds_cbfn *new_cbfn)
303
br_renderbounds_cbfn* BrDbSetRenderBoundsCallback(br_renderbounds_cbfn* new_cbfn) {
304
    //br_renderbounds_cbfn* old_cbfn; // Pierre-Marie Baty -- unused variable
305
    LOG_TRACE("(%p)", new_cbfn);
306
    NOT_IMPLEMENTED();
307
}
308
 
309
// IDA: void __usercall SetOrigin(br_pixelmap *buffer@<EAX>)
310
void SetOrigin(br_pixelmap* buffer) {
311
    LOG_TRACE("(%p)", buffer);
312
    NOT_IMPLEMENTED();
313
}
314
 
315
// IDA: void __usercall SetViewport(br_pixelmap *buffer@<EAX>)
316
void SetViewport(br_pixelmap* buffer) {
317
    LOG_TRACE("(%p)", buffer);
318
    NOT_IMPLEMENTED();
319
}
320
 
321
// IDA: void __cdecl BrZbSceneRenderBegin(br_actor *world, br_actor *camera, br_pixelmap *colour_buffer, br_pixelmap *depth_buffer)
322
void BrZbSceneRenderBegin(br_actor* world, br_actor* camera, br_pixelmap* colour_buffer, br_pixelmap* depth_buffer) {
323
    // LOG_TRACE("(%p, %p, %p, %p)", world, camera, colour_buffer, depth_buffer);
324
 
325
    BrDbSceneRenderBegin(world, camera);
326
    gHarness_platform.Renderer_BeginScene(camera, colour_buffer, depth_buffer);
327
}
328
 
329
// IDA: void __cdecl BrZbSceneRenderAdd(br_actor *tree)
330
void BrZbSceneRenderAdd(br_actor* tree) {
331
    // LOG_TRACE("(%p)", tree);
332
    sceneRenderAdd(tree);
333
}
334
 
335
// IDA: void __cdecl BrZbSceneRenderEnd()
336
void BrZbSceneRenderEnd(void) {
337
    // LOG_TRACE("()");
338
 
339
    gHarness_platform.Renderer_FlushBuffers();
340
    gHarness_platform.Renderer_EndScene();
341
}
342
 
343
// IDA: void __cdecl BrZbSceneRender(br_actor *world, br_actor *camera, br_pixelmap *colour_buffer, br_pixelmap *depth_buffer)
344
void BrZbSceneRender(br_actor* world, br_actor* camera, br_pixelmap* colour_buffer, br_pixelmap* depth_buffer) {
345
    //br_actor* a; // Pierre-Marie Baty -- unused variable
346
    LOG_TRACE("(%p, %p, %p, %p)", world, camera, colour_buffer, depth_buffer);
347
    NOT_IMPLEMENTED();
348
}
349
 
350
// IDA: void __cdecl BrZsSceneRenderBegin(br_actor *world, br_actor *camera, br_pixelmap *colour_buffer)
351
void BrZsSceneRenderBegin(br_actor* world, br_actor* camera, br_pixelmap* colour_buffer) {
352
    //br_camera* camera_data; // Pierre-Marie Baty -- unused variable
353
    LOG_TRACE("(%p, %p, %p)", world, camera, colour_buffer);
354
    NOT_IMPLEMENTED();
355
}
356
 
357
// IDA: void __cdecl BrZsSceneRenderAdd(br_actor *tree)
358
void BrZsSceneRenderAdd(br_actor* tree) {
359
    LOG_TRACE("(%p)", tree);
360
    NOT_IMPLEMENTED();
361
}
362
 
363
// IDA: void __cdecl BrZsSceneRenderEnd()
364
void BrZsSceneRenderEnd(void) {
365
    LOG_TRACE("()");
366
    NOT_IMPLEMENTED();
367
}
368
 
369
// IDA: void __cdecl BrZsSceneRender(br_actor *world, br_actor *camera, br_pixelmap *colour_buffer)
370
void BrZsSceneRender(br_actor* world, br_actor* camera, br_pixelmap* colour_buffer) {
371
    //br_actor* a; // Pierre-Marie Baty -- unused variable
372
    LOG_TRACE("(%p, %p, %p)", world, camera, colour_buffer);
373
    NOT_IMPLEMENTED();
374
}
375
 
376
// IDA: br_primitive_cbfn* __cdecl BrZsPrimitiveCallbackSet(br_primitive_cbfn *new_cbfn)
377
br_primitive_cbfn* BrZsPrimitiveCallbackSet(br_primitive_cbfn* new_cbfn) {
378
    //br_primitive_cbfn* old_cbfn; // Pierre-Marie Baty -- unused variable
379
    LOG_TRACE("(%p)", new_cbfn);
380
    NOT_IMPLEMENTED();
381
}
382
 
383
// IDA: void __cdecl BrZbModelRender(br_actor *actor, br_model *model, br_material *material, br_uint_8 style, int on_screen, int use_custom)
384
void BrZbModelRender(br_actor* actor, br_model* model, br_material* material, br_uint_8 style, int on_screen, int use_custom) {
385
    LOG_TRACE("(%p, %p, %p, %d, %d, %d)", actor, model, material, style, on_screen, use_custom);
386
 
387
    BrDbModelRender(actor, model, material, 0, style, on_screen, use_custom);
388
}
389
 
390
// 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)
391
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) {
392
    LOG_TRACE("(%p, %p, %p, %p, %d, %d, %d)", actor, model, material, order_table, style, on_screen, use_custom);
393
    NOT_IMPLEMENTED();
394
}
395
 
396
// IDA: br_renderbounds_cbfn* __cdecl BrZbRenderBoundsCallbackSet(br_renderbounds_cbfn *new_cbfn)
397
br_renderbounds_cbfn* BrZbRenderBoundsCallbackSet(br_renderbounds_cbfn* new_cbfn) {
398
    LOG_TRACE("(%p)", new_cbfn);
399
    NOT_IMPLEMENTED();
400
}
401
 
402
// IDA: br_renderbounds_cbfn* __cdecl BrZsRenderBoundsCallbackSet(br_renderbounds_cbfn *new_cbfn)
403
br_renderbounds_cbfn* BrZsRenderBoundsCallbackSet(br_renderbounds_cbfn* new_cbfn) {
404
    LOG_TRACE("(%p)", new_cbfn);
405
    NOT_IMPLEMENTED();
406
}