Skip to content

Commit

Permalink
Fix GL1 and fixes/optimizations for GL3
Browse files Browse the repository at this point in the history
-GL1 now has all the same changes in matrix functions so it would
compile. The same bug fixes apply too.
-d3d_projection_stack_clear didn't clear the view_matrix stack.
-d3d_model_get_stride returns pre-calculated stride instead of
recalculation. This should be a lot faster in many cases, as this is
called every time a texture batch check happens. Basically every time a
draw function is used.
-Fixed surface error in debug mode.
-get_texture in GL3textures is now a macro and shows an error in debug
mode.
-Fixed a tile bug in GL3 that meant the wrong texture is used. Screwed
up rendering with tiles. Thanks to rcobra's example for finding this
bug.
-Changed the order of Authors in OpenGL3 about section, so people know
who to contact first in case of a bug.
  • Loading branch information
TheExDeus committed Nov 17, 2015
1 parent 26a436f commit 4eddce1
Show file tree
Hide file tree
Showing 9 changed files with 86 additions and 65 deletions.
108 changes: 58 additions & 50 deletions ENIGMAsystem/SHELL/Graphics_Systems/OpenGL1/GLmatrix.cpp
Expand Up @@ -30,6 +30,8 @@

namespace enigma
{
#define degtorad(x) x*(M_PI/180.0)

//These are going to be modified by the user via functions
enigma::Matrix4 projection_matrix(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1), view_matrix(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1), model_matrix(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);

Expand All @@ -39,10 +41,10 @@ namespace enigma

//NOTE: THIS IS STILL FFP
#ifdef GS_SCALAR_64
#define glLoadMatrix(m) glLoadMatrixd((gs_scalar*)m.Transpose());
#define glLoadMatrix(m) glLoadMatrixd((gs_scalar*)m.transpose());
#define glGet(m,n) glGetDoublev(m,(gs_scalar*)n); //For debug
#else
#define glLoadMatrix(m) glLoadMatrixf((gs_scalar*)m.Transpose());
#define glLoadMatrix(m) glLoadMatrixf((gs_scalar*)m.transpose());
#define glGet(m,n) glGetFloatv(m,(gs_scalar*)n); //For debug
#endif

Expand All @@ -54,9 +56,9 @@ namespace enigma_user
void d3d_set_perspective(bool enable)
{
if (enable) {
enigma::projection_matrix.InitPersProjTransform(45, -view_wview[view_current] / (gs_scalar)view_hview[view_current], 1, 32000);
enigma::projection_matrix.init_perspective_proj_transform(45, -view_wview[view_current] / (gs_scalar)view_hview[view_current], 1, 32000);
} else {
//projection_matrix.InitPersProjTransform(0, 1, 0, 1); //they cannot be zeroes!
//projection_matrix.init_perspective_proj_transform(0, 1, 0, 1); //they cannot be zeroes!
}
glMatrixMode(GL_PROJECTION);
glLoadMatrix(enigma::projection_matrix);
Expand All @@ -69,8 +71,8 @@ void d3d_set_perspective(bool enable)
void d3d_set_projection(gs_scalar xfrom, gs_scalar yfrom, gs_scalar zfrom, gs_scalar xto, gs_scalar yto, gs_scalar zto, gs_scalar xup, gs_scalar yup, gs_scalar zup)
{
(enigma::d3dHidden?glEnable:glDisable)(GL_DEPTH_TEST);
enigma::projection_matrix.InitPersProjTransform(45, -view_wview[view_current] / (gs_scalar)view_hview[view_current], 1, 32000);
enigma::view_matrix.InitCameraTransform(enigma::Vector3(xfrom,yfrom,zfrom),enigma::Vector3(xto,yto,zto),enigma::Vector3(xup,yup,zup));
enigma::projection_matrix.init_perspective_proj_transform(45, -view_wview[view_current] / (gs_scalar)view_hview[view_current], 1, 32000);
enigma::view_matrix.init_camera_transform(enigma::Vector3(xfrom,yfrom,zfrom),enigma::Vector3(xto,yto,zto),enigma::Vector3(xup,yup,zup));

enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;

Expand All @@ -88,9 +90,9 @@ void d3d_set_projection_ext(gs_scalar xfrom, gs_scalar yfrom, gs_scalar zfrom, g
if (angle == 0 || znear == 0) return; //THEY CANNOT BE 0!!!
(enigma::d3dHidden?glEnable:glDisable)(GL_DEPTH_TEST);

enigma::projection_matrix.InitPersProjTransform(angle, -aspect, znear, zfar);
enigma::projection_matrix.init_perspective_proj_transform(angle, -aspect, znear, zfar);

enigma::view_matrix.InitCameraTransform(enigma::Vector3(xfrom,yfrom,zfrom),enigma::Vector3(xto,yto,zto),enigma::Vector3(xup,yup,zup));
enigma::view_matrix.init_camera_transform(enigma::Vector3(xfrom,yfrom,zfrom),enigma::Vector3(xto,yto,zto),enigma::Vector3(xup,yup,zup));

enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;

Expand All @@ -111,18 +113,18 @@ void d3d_set_projection_ortho(gs_scalar x, gs_scalar y, gs_scalar width, gs_scal
// and fractional coordinates.
x = round(x) + 0.01f; y = round(y) + 0.01f;
if (angle!=0){
enigma::projection_matrix.InitTranslationTransform(-x-width/2.0, -y-height/2.0, 0);
enigma::projection_matrix.rotateZ(-angle);
enigma::projection_matrix.init_translation_transform(-x-width/2.0, -y-height/2.0, 0);
enigma::projection_matrix.rotate_z(degtorad(-angle));
enigma::projection_matrix.translate(x+width/2.0, y+height/2.0, 0);
}else{
enigma::projection_matrix.InitIdentity();
enigma::projection_matrix.init_identity();
}

enigma::Matrix4 ortho;
ortho.InitOrthoProjTransform(x,x + width,y + height,y,32000,-32000);
ortho.init_ortho_proj_transform(x,x + width,y + height,y,32000,-32000);

enigma::projection_matrix = ortho * enigma::projection_matrix;
enigma::view_matrix.InitIdentity();
enigma::view_matrix.init_identity();

enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;

Expand All @@ -137,11 +139,11 @@ void d3d_set_projection_ortho(gs_scalar x, gs_scalar y, gs_scalar width, gs_scal

void d3d_set_projection_perspective(gs_scalar x, gs_scalar y, gs_scalar width, gs_scalar height, gs_scalar angle)
{
enigma::projection_matrix.InitRotateZTransform(angle);
enigma::projection_matrix.init_rotate_z_transform(angle);

enigma::Matrix4 persp, ortho;
persp.InitPersProjTransform(60, 1, 0.1,32000);
ortho.InitOrthoProjTransform(x,x + width,y,y + height,0.1,32000);
persp.init_perspective_proj_transform(60, 1, 0.1,32000);
ortho.init_ortho_proj_transform(x,x + width,y,y + height,0.1,32000);

enigma::projection_matrix = enigma::projection_matrix * persp * ortho;

Expand All @@ -155,7 +157,7 @@ void d3d_set_projection_perspective(gs_scalar x, gs_scalar y, gs_scalar width, g

void d3d_transform_set_identity()
{
enigma::model_matrix.InitIdentity();
enigma::model_matrix.init_identity();
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
glLoadMatrix(enigma::mv_matrix);
}
Expand All @@ -174,19 +176,19 @@ void d3d_transform_add_scaling(gs_scalar xs, gs_scalar ys, gs_scalar zs)
}
void d3d_transform_add_rotation_x(gs_scalar angle)
{
enigma::model_matrix.rotateX(-angle);
enigma::model_matrix.rotate_x(-angle);
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
glLoadMatrix(enigma::mv_matrix);
}
void d3d_transform_add_rotation_y(gs_scalar angle)
{
enigma::model_matrix.rotateY(-angle);
enigma::model_matrix.rotate_y(-angle);
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
glLoadMatrix(enigma::mv_matrix);
}
void d3d_transform_add_rotation_z(gs_scalar angle)
{
enigma::model_matrix.rotateZ(-angle);
enigma::model_matrix.rotate_z(-angle);
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
glLoadMatrix(enigma::mv_matrix);
}
Expand All @@ -200,49 +202,48 @@ void d3d_transform_add_rotation(gs_scalar x, gs_scalar y, gs_scalar z)
{
enigma::model_matrix.rotate(x,y,z);
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
enigma::transform_needs_update = true;
glLoadMatrix(enigma::mv_matrix);
}
void d3d_transform_set_translation(gs_scalar xt, gs_scalar yt, gs_scalar zt)
{
enigma::model_matrix.InitTranslationTransform(xt, yt, zt);
enigma::model_matrix.init_translation_transform(xt, yt, zt);
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
glLoadMatrix(enigma::mv_matrix);
}
void d3d_transform_set_scaling(gs_scalar xs, gs_scalar ys, gs_scalar zs)
{
enigma::model_matrix.InitScaleTransform(xs, ys, zs);
enigma::model_matrix.init_scale_transform(xs, ys, zs);
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
glLoadMatrix(enigma::mv_matrix);
}
void d3d_transform_set_rotation_x(gs_scalar angle)
{
enigma::model_matrix.InitRotateXTransform(-angle);
enigma::model_matrix.init_rotate_x_transform(degtorad(-angle));
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
glLoadMatrix(enigma::mv_matrix);
}
void d3d_transform_set_rotation_y(gs_scalar angle)
{
enigma::model_matrix.InitRotateYTransform(-angle);
enigma::model_matrix.init_rotate_y_transform(degtorad(-angle));
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
glLoadMatrix(enigma::mv_matrix);
}
void d3d_transform_set_rotation_z(gs_scalar angle)
{
enigma::model_matrix.InitRotateZTransform(-angle);
enigma::model_matrix.init_rotate_z_transform(degtorad(-angle));
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
glLoadMatrix(enigma::mv_matrix);
}
void d3d_transform_set_rotation_axis(gs_scalar x, gs_scalar y, gs_scalar z, gs_scalar angle)
{
enigma::model_matrix.InitIdentity();
enigma::model_matrix.init_identity();
enigma::model_matrix.rotate(-angle, x, y, z);
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
glLoadMatrix(enigma::mv_matrix);
}
void d3d_transform_set_rotation(gs_scalar x, gs_scalar y, gs_scalar z)
{
enigma::model_matrix.InitIdentity();
enigma::model_matrix.init_identity();
enigma::model_matrix.rotate(x,y,z);
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
glLoadMatrix(enigma::mv_matrix);
Expand All @@ -267,26 +268,23 @@ gs_scalar * d3d_transform_get_array(){
#include <stack>
std::stack<enigma::Matrix4> trans_stack;
std::stack<enigma::Matrix4> proj_stack;
int trans_stack_size = 0;
int proj_stack_size = 0;
std::stack<enigma::Matrix4> view_stack;

namespace enigma_user
{

bool d3d_transform_stack_push()
{
//if (trans_stack_size == 31) return false; //This limit no longer applies
//if (trans_stack.size() == 31) return false; //This is a GM limitation that ENIGMA doesn't have
trans_stack.push(enigma::model_matrix);
trans_stack_size++;
return true;
}

bool d3d_transform_stack_pop()
{
if (trans_stack_size == 0) return false;
if (trans_stack.size() == 0) return false;
enigma::model_matrix = trans_stack.top();
trans_stack.pop();
if (trans_stack_size > 0) trans_stack_size--;
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
glLoadMatrix(enigma::mv_matrix);
return true;
Expand All @@ -295,20 +293,19 @@ bool d3d_transform_stack_pop()
void d3d_transform_stack_clear()
{
trans_stack = std::stack<enigma::Matrix4>();
trans_stack_size = 0;
enigma::model_matrix.InitIdentity();
enigma::model_matrix.init_identity();
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
glLoadMatrix(enigma::mv_matrix);
}

bool d3d_transform_stack_empty()
{
return (trans_stack_size == 0);
return (trans_stack.size() == 0);
}

bool d3d_transform_stack_top()
{
if (trans_stack_size == 0) return false;
if (trans_stack.size() == 0) return false;
enigma::model_matrix = trans_stack.top();
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
glLoadMatrix(enigma::mv_matrix);
Expand All @@ -317,71 +314,81 @@ bool d3d_transform_stack_top()

bool d3d_transform_stack_discard()
{
if (trans_stack_size == 0) return false;
if (trans_stack.size() == 0) return false;
trans_stack.pop();
trans_stack_size--;
return true;
}

bool d3d_projection_stack_push()
{
//if (proj_stack_size == 31) return false; //This limit no longer applies
//if (proj_stack.size() == 31) return false; //This is a GM limitation that ENIGMA doesn't have
proj_stack.push(enigma::projection_matrix);
proj_stack_size++;
view_stack.push(enigma::view_matrix);
return true;
}

bool d3d_projection_stack_pop()
{
if (proj_stack_size == 0) return false;
if (proj_stack.size() == 0) return false;
enigma::projection_matrix = proj_stack.top();
enigma::view_matrix = view_stack.top();
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
proj_stack.pop();
if (proj_stack_size > 0) proj_stack_size--;
view_stack.pop();
glMatrixMode(GL_PROJECTION);
glLoadMatrix(enigma::projection_matrix);
glMatrixMode(GL_MODELVIEW);
glLoadMatrix(enigma::mv_matrix);
return true;
}

void d3d_projection_stack_clear()
{
proj_stack = std::stack<enigma::Matrix4>();
proj_stack_size = 0;
enigma::projection_matrix.InitIdentity();
view_stack = std::stack<enigma::Matrix4>();
enigma::projection_matrix.init_identity();
enigma::view_matrix.init_identity();
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
glMatrixMode(GL_PROJECTION);
glLoadMatrix(enigma::projection_matrix);
glMatrixMode(GL_MODELVIEW);
glLoadMatrix(enigma::mv_matrix);
}

bool d3d_projection_stack_empty()
{
return (proj_stack_size == 0);
return (proj_stack.size() == 0);
}

bool d3d_projection_stack_top()
{
if (proj_stack_size == 0) return false;
if (proj_stack.size() == 0) return false;
enigma::projection_matrix = proj_stack.top();
enigma::view_matrix = view_stack.top();
enigma::mv_matrix = enigma::view_matrix * enigma::model_matrix;
glMatrixMode(GL_PROJECTION);
glLoadMatrix(enigma::projection_matrix);
glMatrixMode(GL_MODELVIEW);
glLoadMatrix(enigma::mv_matrix);
return true;
}

bool d3d_projection_stack_discard()
{
if (proj_stack_size == 0) return false;
if (proj_stack.size() == 0) return false;
proj_stack.pop();
proj_stack_size--;
view_stack.pop();
return true;
}

void d3d_projection_set_array(const gs_scalar *matrix)
{
enigma::projection_matrix = enigma::Matrix4(matrix);
glMatrixMode(GL_PROJECTION);
glLoadMatrix(enigma::projection_matrix);
glMatrixMode(GL_MODELVIEW);
}

void d3d_projection_add_array(const gs_scalar *matrix)
{
enigma::Matrix4 m(matrix);
Expand All @@ -390,6 +397,7 @@ void d3d_projection_add_array(const gs_scalar *matrix)
glLoadMatrix(enigma::projection_matrix);
glMatrixMode(GL_MODELVIEW);
}

gs_scalar * d3d_projection_get_array(){
return enigma::projection_matrix;
}
Expand Down
2 changes: 1 addition & 1 deletion ENIGMAsystem/SHELL/Graphics_Systems/OpenGL1/GLmodel.cpp
Expand Up @@ -359,7 +359,7 @@ void d3d_model_draw(int id, gs_scalar x, gs_scalar y, gs_scalar z, int texId)
d3d_transform_add_translation(-x, -y, -z);
}

void d3d_model_primitive_begin(int id, int kind)
void d3d_model_primitive_begin(int id, int kind, int format)
{
meshes[id]->Begin(kind);
}
Expand Down
Expand Up @@ -34,6 +34,4 @@ struct TextureStruct {
};
extern vector<TextureStruct*> textureStructs;

unsigned get_texture(int texid);

#endif // ENIGMA_GL3_TEXTURESTRUCT__H

0 comments on commit 4eddce1

Please sign in to comment.