Subversion Repositories Games.Carmageddon

Rev

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

  1. #include "renderer_impl.h"
  2. #include "include/harness/trace.h"
  3. #include <stddef.h>
  4.  
  5. // Provides a harness-specific implementation of the Brender br_renderer* interface
  6.  
  7. extern void* BrResAllocate(void* vparent, br_size_t size, br_uint_8 res_class);
  8. extern void BrMatrix34Mul(br_matrix34* A, br_matrix34* B, br_matrix34* C);
  9.  
  10. struct state_all default_state = {
  11.     NULL,
  12.     { { { BR_VECTOR3(1, 0, 0), /* model_to_view */
  13.           BR_VECTOR3(0, 1, 0),
  14.           BR_VECTOR3(0, 0, 1),
  15.           BR_VECTOR3(0, 0, 0) } },
  16.  
  17.         { { BR_VECTOR4(1, 0, 0, 0), /* view_to_screen */
  18.             BR_VECTOR4(0, 1, 0, 0),
  19.             BR_VECTOR4(0, 0, 1, 0),
  20.             BR_VECTOR4(0, 0, 0, 1) } },
  21.  
  22.         { { BR_VECTOR3(1, 0, 0), /* view_to_environment */
  23.             BR_VECTOR3(0, 1, 0),
  24.             BR_VECTOR3(0, 0, 1),
  25.             BR_VECTOR3(0, 0, 0) } },
  26.         0,
  27.         0 },
  28. };
  29.  
  30. static struct br_renderer_dispatch dispatch_table;
  31.  
  32. br_error StateCopy(struct state_all* dest, struct state_all* src, br_uint_32 copy_mask, void* res) {
  33.     if (copy_mask & BR_STATE_MATRIX) {
  34.         dest->matrix = src->matrix;
  35.     }
  36.     return 0;
  37. }
  38.  
  39. br_error modelMulF(struct br_renderer* r, br_matrix34_f* m) {
  40.     harness_br_renderer* self = (harness_br_renderer*)r;
  41.     br_matrix34 om = self->state.matrix.model_to_view;
  42.  
  43.     BrMatrix34Mul(&self->state.matrix.model_to_view, (br_matrix34*)m, &om);
  44.  
  45.     // TouchModelToView(self);
  46.     return 0;
  47. }
  48.  
  49. br_error statePush(struct br_renderer* r, br_uint_32 mask) {
  50.     harness_br_renderer* self = (harness_br_renderer*)r;
  51.     struct state_all* sp;
  52.  
  53.     if (self->stack_top >= MAX_STATE_STACK) {
  54.         LOG_PANIC("state stack overflow!");
  55.     }
  56.  
  57.     sp = self->state_stack + self->stack_top;
  58.     self->stack_top++;
  59.     return StateCopy(sp, &self->state, mask, self);
  60. }
  61.  
  62. br_error statePop(struct br_renderer* r, br_uint_32 mask) {
  63.     harness_br_renderer* self = (harness_br_renderer*)r;
  64.     br_error result;
  65.     struct state_all* sp;
  66.  
  67.     if (self->stack_top <= 0) {
  68.         LOG_PANIC("state stack underflow!");
  69.     }
  70.  
  71.     self->stack_top--;
  72.     sp = self->state_stack + self->stack_top;
  73.     result = StateCopy(&self->state, sp, mask, self);
  74.     return result;
  75. }
  76.  
  77. br_error stateDefault(struct br_renderer* r, br_uint_32 mask) {
  78.     harness_br_renderer* self = (harness_br_renderer*)r;
  79.     return StateCopy(&self->state, self->default_state, mask, self);
  80. }
  81.  
  82. harness_br_renderer* NewHarnessBrRenderer(void) {
  83.  
  84.     harness_br_renderer* self;
  85.  
  86.     self = BrResAllocate(NULL, sizeof(*self), BR_MEMORY_OBJECT);
  87.  
  88.     if (self == NULL) {
  89.         return NULL;
  90.     }
  91.  
  92.     dispatch_table._modelMulF = &modelMulF;
  93.     dispatch_table._statePush = &statePush;
  94.     dispatch_table._statePop = &statePop;
  95.  
  96.     self->default_state = &default_state;
  97.     stateDefault((br_renderer*)self, BR_STATE_ALL);
  98.  
  99.     self->dispatch = &dispatch_table;
  100.     self->identifier = "harness_renderer_state";
  101.     return self;
  102.     // self->device = device;
  103.     // self->renderer_facility = facility;
  104. }
  105.