#include "renderer_impl.h"
 
#include "include/harness/trace.h"
 
#include <stddef.h>
 
 
 
// Provides a harness-specific implementation of the Brender br_renderer* interface
 
 
 
extern void* BrResAllocate(void* vparent, br_size_t size, br_uint_8 res_class);
 
extern void BrMatrix34Mul(br_matrix34* A, br_matrix34* B, br_matrix34* C);
 
 
 
struct state_all default_state = {
 
    NULL,
 
    { { { BR_VECTOR3(1, 0, 0), /* model_to_view */
 
          BR_VECTOR3(0, 1, 0),
 
          BR_VECTOR3(0, 0, 1),
 
          BR_VECTOR3(0, 0, 0) } },
 
 
 
        { { BR_VECTOR4(1, 0, 0, 0), /* view_to_screen */
 
            BR_VECTOR4(0, 1, 0, 0),
 
            BR_VECTOR4(0, 0, 1, 0),
 
            BR_VECTOR4(0, 0, 0, 1) } },
 
 
 
        { { BR_VECTOR3(1, 0, 0), /* view_to_environment */
 
            BR_VECTOR3(0, 1, 0),
 
            BR_VECTOR3(0, 0, 1),
 
            BR_VECTOR3(0, 0, 0) } },
 
        0,
 
        0 },
 
};
 
 
 
static struct br_renderer_dispatch dispatch_table;
 
 
 
br_error StateCopy(struct state_all* dest, struct state_all* src, br_uint_32 copy_mask, void* res) {
 
    if (copy_mask & BR_STATE_MATRIX) {
 
        dest->matrix = src->matrix;
 
    }
 
    return 0;
 
}
 
 
 
br_error modelMulF(struct br_renderer* r, br_matrix34_f* m) {
 
    harness_br_renderer* self = (harness_br_renderer*)r;
 
    br_matrix34 om = self->state.matrix.model_to_view;
 
 
 
    BrMatrix34Mul(&self->state.matrix.model_to_view, (br_matrix34*)m, &om);
 
 
 
    // TouchModelToView(self);
 
    return 0;
 
}
 
 
 
br_error statePush(struct br_renderer* r, br_uint_32 mask) {
 
    harness_br_renderer* self = (harness_br_renderer*)r;
 
    struct state_all* sp;
 
 
 
    if (self->stack_top >= MAX_STATE_STACK) {
 
        LOG_PANIC("state stack overflow!");
 
    }
 
 
 
    sp = self->state_stack + self->stack_top;
 
    self->stack_top++;
 
    return StateCopy(sp, &self->state, mask, self);
 
}
 
 
 
br_error statePop(struct br_renderer* r, br_uint_32 mask) {
 
    harness_br_renderer* self = (harness_br_renderer*)r;
 
    br_error result;
 
    struct state_all* sp;
 
 
 
    if (self->stack_top <= 0) {
 
        LOG_PANIC("state stack underflow!");
 
    }
 
 
 
    self->stack_top--;
 
    sp = self->state_stack + self->stack_top;
 
    result = StateCopy(&self->state, sp, mask, self);
 
    return result;
 
}
 
 
 
br_error stateDefault(struct br_renderer* r, br_uint_32 mask) {
 
    harness_br_renderer* self = (harness_br_renderer*)r;
 
    return StateCopy(&self->state, self->default_state, mask, self);
 
}
 
 
 
harness_br_renderer* NewHarnessBrRenderer(void) {
 
 
 
    harness_br_renderer* self;
 
 
 
    self = BrResAllocate(NULL, sizeof(*self), BR_MEMORY_OBJECT);
 
 
 
    if (self == NULL) {
 
        return NULL;
 
    }
 
 
 
    dispatch_table._modelMulF = &modelMulF;
 
    dispatch_table._statePush = &statePush;
 
    dispatch_table._statePop = &statePop;
 
 
 
    self->default_state = &default_state;
 
    stateDefault((br_renderer*)self, BR_STATE_ALL);
 
 
 
    self->dispatch = &dispatch_table;
 
    self->identifier = "harness_renderer_state";
 
    return self;
 
    // self->device = device;
 
    // self->renderer_facility = facility;
 
}