Subversion Repositories Games.Carmageddon

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. #include "dbsetup.h"
  2.  
  3. #include "CORE/FW/brbegin.h"
  4. #include "CORE/FW/devsetup.h"
  5. #include "CORE/FW/diag.h"
  6. #include "CORE/FW/register.h"
  7. #include "CORE/FW/resource.h"
  8. #include "CORE/FW/resreg.h"
  9. #include "CORE/STD/brstdlib.h"
  10. #include "CORE/V1DB/def_mat.h"
  11. #include "CORE/V1DB/def_mdl.h"
  12. #include "CORE/V1DB/def_otab.h"
  13. #include "CORE/V1DB/prepmap.h"
  14. #include "CORE/V1DB/prepmatl.h"
  15. #include "CORE/V1DB/prepmesh.h"
  16. #include "CORE/V1DB/preptab.h"
  17. #include "CORE/V1DB/regsupt.h"
  18. #include "harness/hooks.h"
  19. #include "harness/trace.h"
  20. #include <stdio.h>
  21. #include <string.h>
  22.  
  23. br_resource_class v1db_resourceClasses[14] = {
  24.     { 0u, "VERTICES", BR_MEMORY_VERTICES, NULL, 0u },
  25.     { 0u, "FACES", BR_MEMORY_FACES, NULL, 0u },
  26.     { 0u, "MODEL", BR_MEMORY_MODEL, NULL, 0u },
  27.     { 0u, "MATERIAL", BR_MEMORY_MATERIAL, NULL, 0u },
  28.     { 0u, "MATERIAL_INDEX", BR_MEMORY_MATERIAL_INDEX, NULL, 0u },
  29.     { 0u, "ACTOR", BR_MEMORY_ACTOR, NULL, 0u },
  30.     { 0u, "LIGHT", BR_MEMORY_LIGHT, NULL, 0u },
  31.     { 0u, "CAMERA", BR_MEMORY_CAMERA, NULL, 0u },
  32.     { 0u, "BOUNDS", BR_MEMORY_BOUNDS, NULL, 0u },
  33.     { 0u, "CLIP_PLANE", BR_MEMORY_CLIP_PLANE, NULL, 0u },
  34.     { 0u, "TRANSFORM", BR_MEMORY_TRANSFORM, NULL, 0u },
  35.     { 0u, "ENABLED_ACTORS", BR_MEMORY_ENABLED_ACTORS, NULL, 0u },
  36.     { 0u, "PREPARED_MODEL", BR_MEMORY_PREPARED_MODEL, NULL, 32u },
  37.     { 0u, "ORDER_TABLE", BR_MEMORY_ORDER_TABLE, NULL, 32u }
  38. };
  39.  
  40. br_v1db_state v1db;
  41.  
  42. // IDA: br_error __cdecl BrV1dbBegin()
  43. br_error BrV1dbBegin(void) {
  44.     //char* devstr; // Pierre-Marie Baty -- unused variable
  45.     //br_size_t s; // Pierre-Marie Baty -- unused variable
  46.     int i;
  47.  
  48.     if (v1db.active) {
  49.         return 4103;
  50.     }
  51.  
  52.     BrMemSet(&v1db, 0, sizeof(br_v1db_state));
  53.     v1db.active = 1;
  54.     BrRegistryNew(&v1db.reg_models);
  55.     BrRegistryNew(&v1db.reg_materials);
  56.     BrRegistryNew(&v1db.reg_textures);
  57.     BrRegistryNew(&v1db.reg_tables);
  58.     v1db.res = BrResAllocate(NULL, 0, BR_MEMORY_ANCHOR);
  59.  
  60.     for (i = 0; i < BR_ASIZE(v1db_resourceClasses); i++) {
  61.         BrResClassAdd(&v1db_resourceClasses[i]);
  62.     }
  63.  
  64.     v1db.default_model = BrResAllocate(v1db.res, sizeof(br_model), BR_MEMORY_MODEL);
  65.     memcpy(v1db.default_model, &_BrDefaultModel, sizeof(br_model));
  66.     v1db.default_material = SetupDefaultMaterial();
  67.     v1db.enabled_lights.max = 16;
  68.     v1db.enabled_lights.type = BR_ACTOR_LIGHT;
  69.     v1db.enabled_lights.name = "light";
  70.     v1db.enabled_clip_planes.max = 6;
  71.     v1db.enabled_clip_planes.type = BR_ACTOR_CLIP_PLANE;
  72.     v1db.enabled_clip_planes.name = "clip plane";
  73.     v1db.enabled_horizon_planes.max = 6;
  74.     v1db.enabled_horizon_planes.type = BR_ACTOR_HORIZONTAL_PLANE;
  75.     v1db.enabled_horizon_planes.name = "horizon plane";
  76.     return 0;
  77. }
  78.  
  79. // IDA: br_error __cdecl BrV1dbEnd()
  80. br_error BrV1dbEnd(void) {
  81.     //br_device* dev; // Pierre-Marie Baty -- unused variable
  82.     LOG_TRACE("()");
  83.  
  84.     if (v1db.active == 0) {
  85.         return 4102;
  86.     }
  87.     v1db.active = 0;
  88.     BrResFree(v1db.res);
  89.     BrMemSet(&v1db, 0, sizeof(v1db));
  90.     return 0;
  91. }
  92.  
  93. // IDA: br_uint_32 __cdecl updateTable(br_pixelmap *item, void *arg)
  94. br_uint_32 updateTable(br_pixelmap* item, void* arg) {
  95.     LOG_TRACE("(%p, %p)", item, arg);
  96.  
  97.     BrTableUpdate(item, BR_TABU_ALL);
  98.     return 0; // Pierre-Marie Baty -- function must return a value
  99. }
  100.  
  101. // IDA: br_uint_32 __cdecl updateMap(br_pixelmap *item, void *arg)
  102. br_uint_32 updateMap(br_pixelmap* item, void* arg) {
  103.     LOG_TRACE("(%p, %p)", item, arg);
  104.  
  105.     BrMapUpdate(item, BR_MAPU_ALL);
  106.     return 0; // Pierre-Marie Baty -- function must return a value
  107. }
  108.  
  109. // IDA: br_uint_32 __cdecl updateMaterial(br_material *item, void *arg)
  110. br_uint_32 updateMaterial(br_material* item, void* arg) {
  111.     LOG_TRACE("(%p, %p)", item, arg);
  112.  
  113.     BrMaterialUpdate(item, BR_MATU_ALL);
  114.     return 0; // Pierre-Marie Baty -- function must return a value
  115. }
  116.  
  117. // IDA: br_uint_32 __cdecl updateModel(br_model *item, void *arg)
  118. br_uint_32 updateModel(br_model* item, void* arg) {
  119.     LOG_TRACE("(%p, %p)", item, arg);
  120.     NOT_IMPLEMENTED();
  121.     return 0; // Pierre-Marie Baty -- function must return a value
  122. }
  123.  
  124. // IDA: br_uint_32 __cdecl clearTable(br_pixelmap *item, void *arg)
  125. br_uint_32 clearTable(br_pixelmap* item, void* arg) {
  126.     LOG_TRACE("(%p, %p)", item, arg);
  127.  
  128.     BrBufferClear(item);
  129.     return 0; // Pierre-Marie Baty -- function must return a value
  130. }
  131.  
  132. // IDA: br_uint_32 __cdecl clearMap(br_pixelmap *item, void *arg)
  133. br_uint_32 clearMap(br_pixelmap* item, void* arg) {
  134.     LOG_TRACE("(%p, %p)", item, arg);
  135.  
  136.     BrBufferClear(item);
  137.     return 0; // Pierre-Marie Baty -- function must return a value
  138. }
  139.  
  140. // IDA: br_uint_32 __cdecl clearMaterial(br_material *item, void *arg)
  141. br_uint_32 clearMaterial(br_material* item, void* arg) {
  142.     LOG_TRACE("(%p, %p)", item, arg);
  143.  
  144.     BrMaterialClear(item);
  145.     return 0; // Pierre-Marie Baty -- function must return a value
  146. }
  147.  
  148. // IDA: br_uint_32 __cdecl clearModel(br_model *item, void *arg)
  149. br_uint_32 clearModel(br_model* item, void* arg) {
  150.     LOG_TRACE("(%p, %p)", item, arg);
  151.  
  152.     BrModelClear(item);
  153.     return 0; // Pierre-Marie Baty -- function must return a value
  154. }
  155.  
  156. // IDA: br_error __cdecl BrV1dbRendererBegin(br_device_pixelmap *destination, br_renderer *renderer)
  157. br_error BrV1dbRendererBegin(br_device_pixelmap* destination, br_renderer* renderer) {
  158.     br_renderer_facility* renderer_facility;
  159.     br_error r;
  160.     br_token_value tv[2];
  161.     LOG_TRACE("(%p, %p)", destination, renderer);
  162.  
  163.     Harness_Hook_BrV1dbRendererBegin(&v1db);
  164.     return 0;
  165.  
  166.     // FIXME: use this logic once the clouds clear up
  167.     renderer_facility = NULL;
  168.     tv[0].t = 0;
  169.     tv[0].v.u32 = 0;
  170.     tv[1].t = 0;
  171.     tv[1].v.u32 = 0;
  172.  
  173.     if (renderer == NULL) {
  174.         r = BrRendererFacilityFind(&renderer_facility, destination, BRT_FLOAT);
  175.         if (r != 0) {
  176.             return r;
  177.         }
  178.         if (destination != NULL) {
  179.             tv[0].t = BRT_DESTINATION_O;
  180.             tv[0].v.o = (br_object*)destination;
  181.         }
  182.         r = (*(br_renderer_facility_dispatch**)renderer_facility)->_rendererNew(renderer_facility, &renderer, tv);
  183.         if (r != 0) {
  184.             return r;
  185.         }
  186.     }
  187.     v1db.renderer = renderer;
  188.     r = BrGeometryFormatFind(&v1db.format_model, renderer, renderer_facility, BRT_FLOAT, BRT_GEOMETRY_V1_MODEL);
  189.     if (r != 0) {
  190.         return r;
  191.     }
  192.     r = BrGeometryFormatFind(&v1db.format_buckets, renderer, renderer_facility, BRT_FLOAT, BRT_GEOMETRY_V1_BUCKETS);
  193.     if (r != 0) {
  194.         return r;
  195.     }
  196.     r = BrGeometryFormatFind((br_geometry**)&v1db.format_lighting, renderer, renderer_facility, BRT_FLOAT, BRT_GEOMETRY_LIGHTING);
  197.     if (r != 0) {
  198.         return r;
  199.     }
  200.     BrModelUpdate(v1db.default_model, BR_MODU_ALL);
  201.     v1db.default_order_table = &_BrDefaultOrderTable;
  202.     v1db.primary_order_table = NULL;
  203.     BrTableEnum(NULL, updateTable, NULL);
  204.     BrMapEnum(NULL, updateMap, NULL);
  205.     BrMaterialEnum(NULL, updateMaterial, NULL);
  206.     BrMaterialUpdate(v1db.default_material, BR_MATU_ALL);
  207.     BrMaterialUpdate(v1db.default_material, BR_MATU_ALL);
  208.     return 0;
  209. }
  210.  
  211. // IDA: br_renderer* __cdecl BrV1dbRendererQuery()
  212. br_renderer* BrV1dbRendererQuery(void) {
  213.     LOG_TRACE("()");
  214.  
  215.     return v1db.renderer;
  216. }
  217.  
  218. // IDA: br_error __cdecl BrV1dbRendererEnd()
  219. br_error BrV1dbRendererEnd(void) {
  220.     LOG_TRACE("()");
  221.  
  222.     BrTableEnum(NULL, clearTable, NULL);
  223.     BrMapEnum(NULL, clearMap, NULL);
  224.     BrMaterialEnum(NULL, clearMaterial, NULL);
  225.     BrModelEnum(NULL, clearModel, NULL);
  226.     BrMaterialClear(v1db.default_material);
  227.     BrModelClear(v1db.default_model);
  228.     v1db.default_order_table = NULL;
  229.     v1db.default_render_data = NULL;
  230.     v1db.primary_order_table = NULL;
  231.     v1db.format_model = NULL;
  232.     v1db.renderer->dispatch->_free((br_object*)v1db.renderer);
  233.     v1db.renderer = NULL;
  234.     return 0; // Pierre-Marie Baty -- function must return a value
  235. }
  236.  
  237. // IDA: void __cdecl BrZbBegin(br_uint_8 colour_type, br_uint_8 depth_type)
  238. void BrZbBegin(br_uint_8 colour_type, br_uint_8 depth_type) {
  239.     LOG_TRACE("(%d, %d)", colour_type, depth_type);
  240.  
  241.     if (v1db.zs_active == 0 && v1db.zb_active == 0) {
  242.         if (BrV1dbRendererBegin((br_device_pixelmap*)BrDevLastBeginQuery(), NULL) != 0) {
  243.             BrFailure("Failed to load renderer\n");
  244.         }
  245.     }
  246.     v1db.zb_active = 1;
  247. }
  248.  
  249. // IDA: void __cdecl BrZsBegin(br_uint_8 colour_type, void *primitive, br_uint_32 size)
  250. void BrZsBegin(br_uint_8 colour_type, void* primitive, br_uint_32 size) {
  251.     LOG_TRACE("(%d, %p, %d)", colour_type, primitive, size);
  252.  
  253.     if (v1db.zs_active == 0 && v1db.zb_active == 0) {
  254.         if (BrV1dbRendererBegin((br_device_pixelmap*)BrDevLastBeginQuery(), NULL) != 0) {
  255.             BrFailure("Failed to load renderer\n");
  256.         }
  257.     }
  258.     v1db.zs_active = 1;
  259.     v1db.heap.base = primitive;
  260.     v1db.heap.size = size;
  261. }
  262.  
  263. // IDA: void __cdecl BrZbEnd()
  264. void BrZbEnd(void) {
  265.     LOG_TRACE("()");
  266.  
  267.     v1db.zb_active = 0;
  268.     if (v1db.zs_active == 0 && v1db.renderer != NULL) {
  269.         BrV1dbRendererEnd();
  270.     }
  271. }
  272.  
  273. // IDA: void __cdecl BrZsEnd()
  274. void BrZsEnd(void) {
  275.     LOG_TRACE("()");
  276.  
  277.     v1db.zs_active = 0;
  278.     if (v1db.zb_active == 0 && v1db.renderer != NULL) {
  279.         BrV1dbRendererEnd();
  280.     }
  281. }
  282.  
  283. // IDA: void __cdecl BrV1dbBeginWrapper_Float()
  284. void BrV1dbBeginWrapper_Float(void) {
  285.     BrBegin();
  286.     BrV1dbBegin();
  287. }
  288.  
  289. // IDA: void __cdecl BrV1dbEndWrapper()
  290. void BrV1dbEndWrapper(void) {
  291.     LOG_TRACE("()");
  292.     NOT_IMPLEMENTED();
  293. }
  294.