OpenCores
URL https://opencores.org/ocsvn/wf3d/wf3d/trunk

Subversion Repositories wf3d

[/] [wf3d/] [trunk/] [clib/] [mp_lib.c] - Diff between revs 4 and 9

Only display areas with differences | Details | Blame | View Log

Rev 4 Rev 9
//=======================================================================
//=======================================================================
// Project Monophony
// Project Monophony
//   Wire-Frame 3D Graphics Accelerator IP Core
//   Wire-Frame 3D Graphics Accelerator IP Core
//
//
// File:
// File:
//   mp_lib.c
//   mp_lib.c
//
//
// Abstract:
// Abstract:
//   C library implementation
//   C library implementation
//
//
// Author:
// Author:
//   Kenji Ishimaru (info.wf3d@gmail.com)
//   Kenji Ishimaru (info.info.wf3d@gmail.com)
//
//
//======================================================================
//======================================================================
//
//
// Copyright (c) 2015, Kenji Ishimaru
// Copyright (c) 2015, Kenji Ishimaru
// All rights reserved.
// All rights reserved.
//
//
// Redistribution and use in source and binary forms, with or without
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
// modification, are permitted provided that the following conditions are met:
//
//
//  -Redistributions of source code must retain the above copyright notice,
//  -Redistributions of source code must retain the above copyright notice,
//   this list of conditions and the following disclaimer.
//   this list of conditions and the following disclaimer.
//  -Redistributions in binary form must reproduce the above copyright notice,
//  -Redistributions in binary form must reproduce the above copyright notice,
//   this list of conditions and the following disclaimer in the documentation
//   this list of conditions and the following disclaimer in the documentation
//   and/or other materials provided with the distribution.
//   and/or other materials provided with the distribution.
//
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//
// Revision History
// Revision History
 
 
#include <math.h>
#include <math.h>
#include "mp_lib.h"
#include "mp_lib.h"
#include "mp_vector4.h"
#include "mp_vector4.h"
#include "mp_matrix3.h"
#include "mp_matrix3.h"
#include "mp_matrix4.h"
#include "mp_matrix4.h"
 
 
extern volatile int fb_front;
extern volatile int fb_front;
 
 
#define MP_CONFIG_MAX_MSTACK 8
#define MP_CONFIG_MAX_MSTACK 8
 
 
// static objects
// static objects
mp_matrix4                    cur_pm;    // current projection matrix
mp_matrix4                    cur_pm;    // current projection matrix
mp_matrix4                    cur_mm;    // current model matrix
mp_matrix4                    cur_mm;    // current model matrix
mp_matrix4                    cur_vm;    // current view matrix
mp_matrix4                    cur_vm;    // current view matrix
 
 
mp_matrix4*                   cur_matrix;  // current matrix stack
mp_matrix4*                   cur_matrix;  // current matrix stack
mp_matrix4                    matrix_stack[MP_CONFIG_MAX_MSTACK];
mp_matrix4                    matrix_stack[MP_CONFIG_MAX_MSTACK];
int                           matrix_stack_ptr;
int                           matrix_stack_ptr;
 
 
int m_vertex_array_en;
int m_vertex_array_en;
 
 
float*  p_vertex_array;
float*  p_vertex_array;
 
 
// clear
// clear
unsigned char clear_color[3];
unsigned char clear_color[3];
unsigned char render_color;
unsigned char render_color;
// conversion function
// conversion function
unsigned int wb[16];
unsigned int wb[16];
 
 
t_fui u_fui;
t_fui u_fui;
 
 
void ftoui(int n, float bi[]) {
void ftoui(int n, float bi[]) {
    int i;
    int i;
    for (i = 0; i < n; i++) {
    for (i = 0; i < n; i++) {
        u_fui.f = bi[i];
        u_fui.f = bi[i];
        wb[i] = u_fui.ui;
        wb[i] = u_fui.ui;
    }
    }
    if (n <4) {
    if (n <4) {
        u_fui.f = 1.0;
        u_fui.f = 1.0;
        wb[i] = u_fui.ui;
        wb[i] = u_fui.ui;
    }
    }
}
}
 
 
 
 
void mpInit() {
void mpInit() {
  hw_init();
  hw_init();
  video_init();
  video_init();
  mp_matrix4_identity(&cur_pm);
  mp_matrix4_identity(&cur_pm);
  mp_matrix4_identity(&cur_mm);
  mp_matrix4_identity(&cur_mm);
  mp_matrix4_identity(&cur_vm);
  mp_matrix4_identity(&cur_vm);
  matrix_stack_ptr = 0;
  matrix_stack_ptr = 0;
  cur_matrix = &cur_mm;  // initial matrix mode is model-view
  cur_matrix = &cur_mm;  // initial matrix mode is model-view
 
 
  // vertex processor state init
  // vertex processor state init
  m_vertex_array_en = 1;
  m_vertex_array_en = 1;
  p_vertex_array = 0;
  p_vertex_array = 0;
  render_color = 0xff;
  render_color = 0xff;
}
}
 
 
 
 
void mpViewport(int width, int height ) {
void mpViewport(int width, int height ) {
  // screen width/height
  // screen width/height
  u_fui.f = (float)width;
  u_fui.f = (float)width;
  D3D_FSCR_W = u_fui.ui;
  D3D_FSCR_W = u_fui.ui;
  u_fui.f = (float)height;
  u_fui.f = (float)height;
  D3D_FSCR_H = u_fui.ui;
  D3D_FSCR_H = u_fui.ui;
  D3D_ISCR_W_M1 = (width-1);
  D3D_ISCR_W_M1 = (width-1);
  D3D_ISCR_H_M1 = (height-1);
  D3D_ISCR_H_M1 = (height-1);
  D3D_ISCR_W    = (width);
  D3D_ISCR_W    = (width);
}
}
 
 
void mpFrustum ( float left, float right, float bottom, float top, float near_val, float far_val ) {
void mpFrustum ( float left, float right, float bottom, float top, float near_val, float far_val ) {
  // | a[0]  a[1]  a[2]  a[3] |
  // | a[0]  a[1]  a[2]  a[3] |
  // | a[4]  a[5]  a[6]  a[7] |
  // | a[4]  a[5]  a[6]  a[7] |
  // | a[8]  a[9]  a[10] a[11]|
  // | a[8]  a[9]  a[10] a[11]|
  // | a[12] a[13] a[14] a[15]|
  // | a[12] a[13] a[14] a[15]|
  mp_matrix4 m;
  mp_matrix4 m;
  float a[16];
  float a[16];
  int i;
  int i;
  for (i=0; i<16; i++)
  for (i=0; i<16; i++)
     a[i] = 0.0;
     a[i] = 0.0;
  a[0]  = 2.0F*near_val/(right - left);
  a[0]  = 2.0F*near_val/(right - left);
  a[2]  = (right + left)/(right - left);
  a[2]  = (right + left)/(right - left);
  a[5]  = 2.0F*near_val/(top -bottom);
  a[5]  = 2.0F*near_val/(top -bottom);
  a[6]  = (top + bottom)/(top - bottom);
  a[6]  = (top + bottom)/(top - bottom);
  a[10] = -(far_val + near_val)/(far_val - near_val);
  a[10] = -(far_val + near_val)/(far_val - near_val);
  a[11] = -2.0F*near_val*far_val/(far_val - near_val);
  a[11] = -2.0F*near_val*far_val/(far_val - near_val);
  a[14] = -1.0F;
  a[14] = -1.0F;
 
 
  mp_matrix4_set0(&m, a);
  mp_matrix4_set0(&m, a);
  mp_matrix4_multiply_matrix4i(cur_matrix, cur_matrix, &m);
  mp_matrix4_multiply_matrix4i(cur_matrix, cur_matrix, &m);
}
}
 
 
 
 
void mpOrtho( float left, float right, float bottom, float top, float near_val, float far_val ) {
void mpOrtho( float left, float right, float bottom, float top, float near_val, float far_val ) {
  // | a[0]  a[1]  a[2]  a[3] |
  // | a[0]  a[1]  a[2]  a[3] |
  // | a[4]  a[5]  a[6]  a[7] |
  // | a[4]  a[5]  a[6]  a[7] |
  // | a[8]  a[9]  a[10] a[11]|
  // | a[8]  a[9]  a[10] a[11]|
  // | a[12] a[13] a[14] a[15]|
  // | a[12] a[13] a[14] a[15]|
  mp_matrix4 m;
  mp_matrix4 m;
  float a[16];
  float a[16];
  int i;
  int i;
  for (i=0; i<16; i++)
  for (i=0; i<16; i++)
      a[i] = 0.0;
      a[i] = 0.0;
  a[0]  = 2.0F/(right - left);
  a[0]  = 2.0F/(right - left);
  a[3]  = -(right + left)/(right - left);
  a[3]  = -(right + left)/(right - left);
  a[5]  = 2.0F/(top -bottom);
  a[5]  = 2.0F/(top -bottom);
  a[7]  = -(top + bottom)/(top - bottom);
  a[7]  = -(top + bottom)/(top - bottom);
  a[10] = -2.0F/(far_val - near_val);
  a[10] = -2.0F/(far_val - near_val);
  a[11] = -(near_val+far_val)/(far_val - near_val);
  a[11] = -(near_val+far_val)/(far_val - near_val);
  a[15] = 1.0F;
  a[15] = 1.0F;
 
 
  mp_matrix4_set0(&m, a);
  mp_matrix4_set0(&m, a);
  mp_matrix4_multiply_matrix4i(cur_matrix, cur_matrix, &m);
  mp_matrix4_multiply_matrix4i(cur_matrix, cur_matrix, &m);
}
}
 
 
void mpMatrixMode( int mode ) {
void mpMatrixMode( int mode ) {
  switch (mode) {
  switch (mode) {
    case MP_MODELVIEW:
    case MP_MODELVIEW:
      cur_matrix = &cur_mm;
      cur_matrix = &cur_mm;
      break;
      break;
    case MP_PROJECTION:
    case MP_PROJECTION:
      cur_matrix = &cur_pm;
      cur_matrix = &cur_pm;
      break;
      break;
    default:
    default:
      break;
      break;
  }
  }
}
}
 
 
void mpLoadIdentity( void ) {
void mpLoadIdentity( void ) {
  mp_matrix4_identity(cur_matrix);
  mp_matrix4_identity(cur_matrix);
}
}
 
 
void mpTranslate( float x, float y, float z ) {
void mpTranslate( float x, float y, float z ) {
  mp_vector4 v;
  mp_vector4 v;
  v.x = x; v.y = y; v.z = z; v.w = 1.0;
  v.x = x; v.y = y; v.z = z; v.w = 1.0;
  mp_matrix4_multiply_vector4(&v, cur_matrix, &v);
  mp_matrix4_multiply_vector4(&v, cur_matrix, &v);
  cur_matrix->a[3] =  v.x;
  cur_matrix->a[3] =  v.x;
  cur_matrix->a[7] =  v.y;
  cur_matrix->a[7] =  v.y;
  cur_matrix->a[11] = v.z;
  cur_matrix->a[11] = v.z;
}
}
 
 
void mpScale( float x, float y, float z ) {
void mpScale( float x, float y, float z ) {
  // | a[0]  a[1]  a[2]  a[3] |
  // | a[0]  a[1]  a[2]  a[3] |
  // | a[4]  a[5]  a[6]  a[7] |
  // | a[4]  a[5]  a[6]  a[7] |
  // | a[8]  a[9]  a[10] a[11]|
  // | a[8]  a[9]  a[10] a[11]|
  // | a[12] a[13] a[14] a[15]|
  // | a[12] a[13] a[14] a[15]|
  mp_matrix4 m;
  mp_matrix4 m;
  mp_matrix4_identity(&m);
  mp_matrix4_identity(&m);
  m.a[0] = x;
  m.a[0] = x;
  m.a[5] = y;
  m.a[5] = y;
  m.a[10] = z;
  m.a[10] = z;
  mp_matrix4_multiply_matrix4i(cur_matrix, cur_matrix, &m);
  mp_matrix4_multiply_matrix4i(cur_matrix, cur_matrix, &m);
}
}
 
 
void mpRotate( float angle, float x, float y, float z ){
void mpRotate( float angle, float x, float y, float z ){
  float theta = angle /180.0 * M_PI;
  float theta = angle /180.0 * M_PI;
  mp_vector3 v;
  mp_vector3 v;
  mp_vector3_set0(&v, x,y,z);
  mp_vector3_set0(&v, x,y,z);
  mp_matrix4 m2;
  mp_matrix4 m2;
  mp_matrix4_rotate(&m2, &v, theta);
  mp_matrix4_rotate(&m2, &v, theta);
  mp_matrix4_multiply_matrix4i(cur_matrix, cur_matrix, &m2);
  mp_matrix4_multiply_matrix4i(cur_matrix, cur_matrix, &m2);
}
}
 
 
void mpClearColor( float red, float green, float blue) {
void mpClearColor( float red, float green, float blue) {
  clear_color[0] = (int)(red*255.0);
  clear_color[0] = (int)(red*255.0);
  clear_color[1] = (int)(green*255.0);
  clear_color[1] = (int)(green*255.0);
  clear_color[2] = (int)(blue*255.0);
  clear_color[2] = (int)(blue*255.0);
}
}
 
 
void mpRenderColor (float red, float green, float blue) {
void mpRenderColor (float red, float green, float blue) {
  unsigned char r,g,b;
  unsigned char r,g,b;
  r = (int)(red*255.0);
  r = (int)(red*255.0);
  g = (int)(green*255.0);
  g = (int)(green*255.0);
  b = (int)(blue*255.0);
  b = (int)(blue*255.0);
  render_color = ((r & 0x3) << 6) |
  render_color = ((r & 0x3) << 6) |
                 ((g & 0x7) << 3)|
                 ((g & 0x7) << 3)|
                 (b & 0x7);// rgb = 233
                 (b & 0x7);// rgb = 233
}
}
void mpRenderColorU (unsigned char c) {
void mpRenderColorU (unsigned char c) {
  render_color = c;
  render_color = c;
}
}
 
 
void mpClear() {
void mpClear() {
  unsigned char c;
  unsigned char c;
  unsigned int c4;
  unsigned int c4;
  c = ((clear_color[0] & 0x3) << 6) |
  c = ((clear_color[0] & 0x3) << 6) |
      ((clear_color[1] & 0x7) << 3)|
      ((clear_color[1] & 0x7) << 3)|
      (clear_color[2] & 0x7);// rgb = 233
      (clear_color[2] & 0x7);// rgb = 233
  c4 = (c << 24)|(c << 16)|(c << 8)|c;
  c4 = (c << 24)|(c << 16)|(c << 8)|c;
  buffer_clear(c4,fb_front ? 0 : 1);
  buffer_clear(c4,fb_front ? 0 : 1);
}
}
 
 
void mpVertexPointer (const float *pointer) {
void mpVertexPointer (const float *pointer) {
  p_vertex_array = (float*)pointer;
  p_vertex_array = (float*)pointer;
}
}
 
 
void mpDrawArrays(int count) {
void mpDrawArrays(int count) {
  unsigned int d[3];
  unsigned int d[3];
  int i;
  int i;
  unsigned int a;
  unsigned int a;
  static int load = 0;
  static int load = 0;
  mp_matrix4 mv,mvp;
  mp_matrix4 mv,mvp;
  // generate model-view matrix
  // generate model-view matrix
  mp_matrix4_multiply_matrix4(&mv, &cur_mm, &cur_vm);
  mp_matrix4_multiply_matrix4(&mv, &cur_mm, &cur_vm);
  // generate model-view-projection matrix
  // generate model-view-projection matrix
  mp_matrix4_multiply_matrix4(&mvp, &mv, &cur_pm);
  mp_matrix4_multiply_matrix4(&mvp, &mv, &cur_pm);
  ftoui(16, mvp.a);
  ftoui(16, mvp.a);
 
 
  D3D_COL_ADRS  = fb_front ?FRAME_BUFFER_0 : FRAME_BUFFER_1;
  D3D_COL_ADRS  = fb_front ?FRAME_BUFFER_0 : FRAME_BUFFER_1;
  D3D_COL_VAL = render_color | 0x100;  // y flip
  D3D_COL_VAL = render_color | 0x100;  // y flip
  //alt_dcache_flush(a,count*3*4);
  //alt_dcache_flush(a,count*3*4);
  // set matrix
  // set matrix
  D3D_MATRIX_M00 = wb[0];
  D3D_MATRIX_M00 = wb[0];
  D3D_MATRIX_M01 = wb[1];
  D3D_MATRIX_M01 = wb[1];
  D3D_MATRIX_M02 = wb[2];
  D3D_MATRIX_M02 = wb[2];
  D3D_MATRIX_M03 = wb[3];
  D3D_MATRIX_M03 = wb[3];
  D3D_MATRIX_M10 = wb[4];
  D3D_MATRIX_M10 = wb[4];
  D3D_MATRIX_M11 = wb[5];
  D3D_MATRIX_M11 = wb[5];
  D3D_MATRIX_M12 = wb[6];
  D3D_MATRIX_M12 = wb[6];
  D3D_MATRIX_M13 = wb[7];
  D3D_MATRIX_M13 = wb[7];
  D3D_MATRIX_M20 = wb[8];
  D3D_MATRIX_M20 = wb[8];
  D3D_MATRIX_M21 = wb[9];
  D3D_MATRIX_M21 = wb[9];
  D3D_MATRIX_M22 = wb[10];
  D3D_MATRIX_M22 = wb[10];
  D3D_MATRIX_M23 = wb[11];
  D3D_MATRIX_M23 = wb[11];
  D3D_MATRIX_M30 = wb[12];
  D3D_MATRIX_M30 = wb[12];
  D3D_MATRIX_M31 = wb[13];
  D3D_MATRIX_M31 = wb[13];
  D3D_MATRIX_M32 = wb[14];
  D3D_MATRIX_M32 = wb[14];
  D3D_MATRIX_M33 = wb[15];
  D3D_MATRIX_M33 = wb[15];
  D3D_DMA_SIZE = count*3;   // num vertex * x,y,z
  D3D_DMA_SIZE = count*3;   // num vertex * x,y,z
 
 
  if (count*3 > 0xffff) {
  if (count*3 > 0xffff) {
    printf("draw array size over!!\n");
    printf("draw array size over!!\n");
    while(1);
    while(1);
  }
  }
#ifdef __DE0_NANO_SOC__
#ifdef __DE0_NANO_SOC__
  D3D_DMA_ADRS = ((unsigned int)p_vertex_array | 0x80000000);  //ACP offset
  D3D_DMA_ADRS = ((unsigned int)p_vertex_array | 0x80000000);  //ACP offset
  //  D3D_DMA_ADRS = p_vertex_array;
  //  D3D_DMA_ADRS = p_vertex_array;
#else
#else
  D3D_DMA_ADRS = p_vertex_array;
  D3D_DMA_ADRS = p_vertex_array;
#endif
#endif
  D3D_DMA_STATUS  = 0;  // int mask clear
  D3D_DMA_STATUS  = 0;  // int mask clear
  D3D_DMA_START  = 0x00010101;  // default CCW
  D3D_DMA_START  = 0x00010101;  // default CCW
  while(1) {
  while(1) {
    if (D3D_DMA_STATUS & 1) {
    if (D3D_DMA_STATUS & 1) {
      D3D_DMA_STATUS = 0;
      D3D_DMA_STATUS = 0;
      break;
      break;
    }
    }
  }
  }
 
 
}
}
 
 
void mpPopMatrix () {
void mpPopMatrix () {
  if (matrix_stack_ptr == 0) {
  if (matrix_stack_ptr == 0) {
    printf("Empty matrix stack is poped\n");
    printf("Empty matrix stack is poped\n");
  } else {
  } else {
    matrix_stack_ptr--;
    matrix_stack_ptr--;
    *cur_matrix = matrix_stack[matrix_stack_ptr];
    *cur_matrix = matrix_stack[matrix_stack_ptr];
  }
  }
}
}
 
 
void mpPushMatrix () {
void mpPushMatrix () {
  if (matrix_stack_ptr >= MP_CONFIG_MAX_MSTACK-1)
  if (matrix_stack_ptr >= MP_CONFIG_MAX_MSTACK-1)
    printf("Stack over\n");
    printf("Stack over\n");
 
 
  matrix_stack[matrix_stack_ptr] = *cur_matrix;
  matrix_stack[matrix_stack_ptr] = *cur_matrix;
  matrix_stack_ptr++;
  matrix_stack_ptr++;
}
}
 
 
void mpLookAt (float eyeX, float eyeY, float eyeZ,
void mpLookAt (float eyeX, float eyeY, float eyeZ,
                float centerX, float centerY, float centerZ,
                float centerX, float centerY, float centerZ,
                float upX, float upY, float upZ) {
                float upX, float upY, float upZ) {
  // the result is stored in view matrix
  // the result is stored in view matrix
  float a[16];
  float a[16];
  int i;
  int i;
  mp_vector3 forward, side, up;
  mp_vector3 forward, side, up;
  mp_matrix4 m;
  mp_matrix4 m;
 
 
  forward.x = (float)(centerX - eyeX);
  forward.x = (float)(centerX - eyeX);
  forward.y = (float)(centerY - eyeY);
  forward.y = (float)(centerY - eyeY);
  forward.z = (float)(centerZ - eyeZ);
  forward.z = (float)(centerZ - eyeZ);
 
 
  up.x = (float)upX;
  up.x = (float)upX;
  up.y = (float)upY;
  up.y = (float)upY;
  up.z = (float)upZ;
  up.z = (float)upZ;
 
 
  mp_vector3_normalize(&forward);
  mp_vector3_normalize(&forward);
 
 
  mp_vector3_cross_product0(&side, &forward, &up);
  mp_vector3_cross_product0(&side, &forward, &up);
  mp_vector3_normalize(&side);
  mp_vector3_normalize(&side);
 
 
  mp_vector3_cross_product0(&up, &side, &forward);
  mp_vector3_cross_product0(&up, &side, &forward);
 
 
  for (i=0; i<16; i++)
  for (i=0; i<16; i++)
    a[i] = 0.0;
    a[i] = 0.0;
  a[0] /*m[0][0]*/ = side.x;
  a[0] /*m[0][0]*/ = side.x;
  a[4] /*m[1][0]*/ = side.y;
  a[4] /*m[1][0]*/ = side.y;
  a[8] /*m[2][0]*/ = side.z;
  a[8] /*m[2][0]*/ = side.z;
 
 
  a[1] /*m[0][1]*/ = up.x;
  a[1] /*m[0][1]*/ = up.x;
  a[5] /*m[1][1]*/ = up.y;
  a[5] /*m[1][1]*/ = up.y;
  a[9] /*m[2][1]*/ = up.z;
  a[9] /*m[2][1]*/ = up.z;
 
 
  a[2]  /*m[0][2]*/ = -forward.x;
  a[2]  /*m[0][2]*/ = -forward.x;
  a[6]  /*m[1][2]*/ = -forward.y;
  a[6]  /*m[1][2]*/ = -forward.y;
  a[10] /*m[2][2]*/ = -forward.z;
  a[10] /*m[2][2]*/ = -forward.z;
  a[15] = 1.0;
  a[15] = 1.0;
  mp_matrix4_set0(&m, a);
  mp_matrix4_set0(&m, a);
  mp_matrix4_multiply_matrix4i(cur_matrix, cur_matrix, &m);
  mp_matrix4_multiply_matrix4i(cur_matrix, cur_matrix, &m);
  mpTranslate(-eyeX, -eyeY, -eyeZ);
  mpTranslate(-eyeX, -eyeY, -eyeZ);
}
}
 
 
void mpPerspective(float fovy, float aspect, float zNear, float zFar) {
void mpPerspective(float fovy, float aspect, float zNear, float zFar) {
  //    float ymax = zNear * tan( fovy * M_PI / 360.0 );
  //    float ymax = zNear * tan( fovy * M_PI / 360.0 );
  float ymax = zNear * sin(fovy * M_PI / 360.0) / cos(fovy * M_PI / 360.0);
  float ymax = zNear * sin(fovy * M_PI / 360.0) / cos(fovy * M_PI / 360.0);
  float xmax = ymax * aspect;
  float xmax = ymax * aspect;
  mpFrustum(-xmax, xmax, -ymax, ymax, zNear, zFar);
  mpFrustum(-xmax, xmax, -ymax, ymax, zNear, zFar);
}
}
 
 
 
 
void mpMultMatrix (float *m) {
void mpMultMatrix (float *m) {
   // for skinning
   // for skinning
   mp_matrix4 mat;
   mp_matrix4 mat;
   mp_matrix4_set0_t(&mat,m);  // need matrix transpose
   mp_matrix4_set0_t(&mat,m);  // need matrix transpose
   mp_matrix4_multiply_matrix4i(cur_matrix, cur_matrix,&mat);
   mp_matrix4_multiply_matrix4i(cur_matrix, cur_matrix,&mat);
}
}
 
 
void mpSwapBuffers() {
void mpSwapBuffers() {
   video_swap();
   video_swap();
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.