[Scummvm-git-logs] scummvm master -> 41cc63588d512a0c72695cf1d8dc6ed92235c3ee
aquadran
aquadran at gmail.com
Tue Nov 9 07:04:15 UTC 2021
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
41cc63588d TINYGL: Fixed vertex arrays
Commit: 41cc63588d512a0c72695cf1d8dc6ed92235c3ee
https://github.com/scummvm/scummvm/commit/41cc63588d512a0c72695cf1d8dc6ed92235c3ee
Author: PaweÅ KoÅodziejski (aquadran at gmail.com)
Date: 2021-11-09T08:04:08+01:00
Commit Message:
TINYGL: Fixed vertex arrays
Changed paths:
graphics/tinygl/arrays.cpp
graphics/tinygl/zgl.h
diff --git a/graphics/tinygl/arrays.cpp b/graphics/tinygl/arrays.cpp
index e852505491..b4b2a590ab 100644
--- a/graphics/tinygl/arrays.cpp
+++ b/graphics/tinygl/arrays.cpp
@@ -36,114 +36,177 @@
namespace TinyGL {
void glopArrayElement(GLContext *c, GLParam *param) {
- int i;
+ int offset;
int states = c->client_states;
int idx = param[1].i;
if (states & COLOR_ARRAY) {
GLParam p[5];
int size = c->color_array_size;
- i = idx * size;
- if (c->color_array_short) {
- p[1].f = c->color_array_short[i];
- p[2].f = c->color_array_short[i + 1];
- p[3].f = c->color_array_short[i + 2];
- p[4].f = size > 3 ? c->color_array_short[i + 3] : 1.0f;
- } else if (c->color_array_int) {
- p[1].f = c->color_array_int[i];
- p[2].f = c->color_array_int[i + 1];
- p[3].f = c->color_array_int[i + 2];
- p[4].f = size > 3 ? c->color_array_int[i + 3] : 1.0f;
- } else if (c->color_array_float) {
- p[1].f = c->color_array_float[i];
- p[2].f = c->color_array_float[i + 1];
- p[3].f = c->color_array_float[i + 2];
- p[4].f = size > 3 ? c->color_array_float[i + 3] : 1.0f;
- } else if (c->color_array_double) {
- p[1].f = (float)c->color_array_double[i];
- p[2].f = (float)c->color_array_double[i + 1];
- p[3].f = (float)c->color_array_double[i + 2];
- p[4].f = size > 3 ? (float)c->color_array_double[i + 3] : 1.0f;
- } else {
+ offset = idx * c->color_array_stride;
+ switch (c->color_array_type) {
+ case TGL_UNSIGNED_BYTE:
+ case TGL_BYTE: {
+ TGLbyte *array = (TGLbyte *)c->color_array + offset;
+ p[1].f = array[0];
+ p[2].f = array[1];
+ p[3].f = array[2];
+ p[4].f = size > 3 ? array[3] : 1.0f;
+ break;
+ }
+ case TGL_UNSIGNED_INT:
+ case TGL_INT: {
+ TGLint *array = (TGLint *)((TGLbyte *)c->color_array + offset);
+ p[1].f = array[0];
+ p[2].f = array[1];
+ p[3].f = array[2];
+ p[4].f = size > 3 ? array[3] : 1.0f;
+ break;
+ }
+ case TGL_UNSIGNED_SHORT:
+ case TGL_SHORT: {
+ TGLshort *array = (TGLshort *)((TGLbyte *)c->color_array + offset);
+ p[1].f = array[0];
+ p[2].f = array[1];
+ p[3].f = array[2];
+ p[4].f = size > 3 ? array[3] : 1.0f;
+ break;
+ }
+ case TGL_FLOAT: {
+ TGLfloat *array = (TGLfloat *)((TGLbyte *)c->color_array + offset);
+ p[1].f = array[0];
+ p[2].f = array[1];
+ p[3].f = array[2];
+ p[4].f = size > 3 ? array[3] : 1.0f;
+ break;
+ }
+ case TGL_DOUBLE: {
+ TGLdouble *array = (TGLdouble *)((TGLbyte *)c->color_array + offset);
+ p[1].f = array[0];
+ p[2].f = array[1];
+ p[3].f = array[2];
+ p[4].f = size > 3 ? array[3] : 1.0f;
+ break;
+ }
+ default:
assert(0);
}
glopColor(c, p);
}
if (states & NORMAL_ARRAY) {
- i = idx * 3;
+ offset = idx * c->normal_array_stride;
c->current_normal.W = 0.0f;
- if (c->normal_array_short) {
- c->current_normal.X = c->normal_array_short[i];
- c->current_normal.Y = c->normal_array_short[i + 1];
- c->current_normal.Z = c->normal_array_short[i + 2];
- } else if (c->normal_array_int) {
- c->current_normal.X = c->normal_array_int[i];
- c->current_normal.Y = c->normal_array_int[i + 1];
- c->current_normal.Z = c->normal_array_int[i + 2];
- } else if (c->normal_array_float) {
- c->current_normal.X = c->normal_array_float[i];
- c->current_normal.Y = c->normal_array_float[i + 1];
- c->current_normal.Z = c->normal_array_float[i + 2];
- } else if (c->normal_array_double) {
- c->current_normal.X = c->normal_array_double[i];
- c->current_normal.Y = c->normal_array_double[i + 1];
- c->current_normal.Z = c->normal_array_double[i + 2];
- } else {
+ switch (c->normal_array_type) {
+ case TGL_FLOAT: {
+ TGLfloat *array = (TGLfloat *)((TGLbyte *)c->normal_array + offset);
+ c->current_normal.X = array[0];
+ c->current_normal.Y = array[1];
+ c->current_normal.Z = array[3];
+ break;
+ }
+ case TGL_DOUBLE: {
+ TGLdouble *array = (TGLdouble *)((TGLbyte *)c->normal_array + offset);
+ c->current_normal.X = array[0];
+ c->current_normal.Y = array[1];
+ c->current_normal.Z = array[3];
+ break;
+ }
+ case TGL_INT: {
+ TGLint *array = (TGLint *)((TGLbyte *)c->normal_array + offset);
+ c->current_normal.X = array[0];
+ c->current_normal.Y = array[1];
+ c->current_normal.Z = array[3];
+ break;
+ }
+ case TGL_SHORT: {
+ TGLshort *array = (TGLshort *)((TGLbyte *)c->normal_array + offset);
+ c->current_normal.X = array[0];
+ c->current_normal.Y = array[1];
+ c->current_normal.Z = array[3];
+ break;
+ }
+ default:
assert(0);
}
}
if (states & TEXCOORD_ARRAY) {
int size = c->texcoord_array_size;
- i = idx * size;
- if (c->texcoord_array_short) {
- c->current_tex_coord.X = c->texcoord_array_short[i];
- c->current_tex_coord.Y = c->texcoord_array_short[i + 1];
- c->current_tex_coord.Z = size > 2 ? c->texcoord_array_short[i + 2] : 0.0f;
- c->current_tex_coord.W = size > 3 ? c->texcoord_array_short[i + 3] : 1.0f;
- } else if (c->texcoord_array_int) {
- c->current_tex_coord.X = c->texcoord_array_int[i];
- c->current_tex_coord.Y = c->texcoord_array_int[i + 1];
- c->current_tex_coord.Z = size > 2 ? c->texcoord_array_int[i + 2] : 0.0f;
- c->current_tex_coord.W = size > 3 ? c->texcoord_array_int[i + 3] : 1.0f;
- } else if (c->texcoord_array_float) {
- c->current_tex_coord.X = c->texcoord_array_float[i];
- c->current_tex_coord.Y = c->texcoord_array_float[i + 1];
- c->current_tex_coord.Z = size > 2 ? c->texcoord_array_float[i + 2] : 0.0f;
- c->current_tex_coord.W = size > 3 ? c->texcoord_array_float[i + 3] : 1.0f;
- } else if (c->texcoord_array_double) {
- c->current_tex_coord.X = c->texcoord_array_double[i];
- c->current_tex_coord.Y = c->texcoord_array_double[i + 1];
- c->current_tex_coord.Z = size > 2 ? c->texcoord_array_double[i + 2] : 0.0f;
- c->current_tex_coord.W = size > 3 ? c->texcoord_array_double[i + 3] : 1.0f;
- } else {
+ offset = idx * c->texcoord_array_stride;
+ switch (c->texcoord_array_type) {
+ case TGL_FLOAT: {
+ TGLfloat *array = (TGLfloat *)((TGLbyte *)c->texcoord_array + offset);
+ c->current_tex_coord.X = array[0];
+ c->current_tex_coord.Y = array[1];
+ c->current_tex_coord.Z = size > 2 ? array[2] : 0.0f;
+ c->current_tex_coord.W = size > 3 ? array[3] : 1.0f;
+ break;
+ }
+ case TGL_DOUBLE: {
+ TGLdouble *array = (TGLdouble *)((TGLbyte *)c->texcoord_array + offset);
+ c->current_tex_coord.X = array[0];
+ c->current_tex_coord.Y = array[1];
+ c->current_tex_coord.Z = size > 2 ? array[2] : 0.0f;
+ c->current_tex_coord.W = size > 3 ? array[3] : 1.0f;
+ break;
+ }
+ case TGL_INT: {
+ TGLint *array = (TGLint *)((TGLbyte *)c->texcoord_array + offset);
+ c->current_tex_coord.X = array[0];
+ c->current_tex_coord.Y = array[1];
+ c->current_tex_coord.Z = size > 2 ? array[2] : 0.0f;
+ c->current_tex_coord.W = size > 3 ? array[3] : 1.0f;
+ break;
+ }
+ case TGL_SHORT: {
+ TGLshort *array = (TGLshort *)((TGLbyte *)c->texcoord_array + offset);
+ c->current_tex_coord.X = array[0];
+ c->current_tex_coord.Y = array[1];
+ c->current_tex_coord.Z = size > 2 ? array[2] : 0.0f;
+ c->current_tex_coord.W = size > 3 ? array[3] : 1.0f;
+ break;
+ }
+ default:
assert(0);
}
}
if (states & VERTEX_ARRAY) {
GLParam p[5];
int size = c->vertex_array_size;
- i = idx * size;
- if (c->vertex_array_short) {
- p[1].f = c->vertex_array_short[i];
- p[2].f = c->vertex_array_short[i + 1];
- p[3].f = size > 2 ? c->vertex_array_short[i + 2] : 0.0f;
- p[4].f = size > 3 ? c->vertex_array_short[i + 3] : 1.0f;
- } else if (c->vertex_array_int) {
- p[1].f = c->vertex_array_int[i];
- p[2].f = c->vertex_array_int[i + 1];
- p[3].f = size > 2 ? c->vertex_array_int[i + 2] : 0.0f;
- p[4].f = size > 3 ? c->vertex_array_int[i + 3] : 1.0f;
- } else if (c->vertex_array_float) {
- p[1].f = c->vertex_array_float[i];
- p[2].f = c->vertex_array_float[i + 1];
- p[3].f = size > 2 ? c->vertex_array_float[i + 2] : 0.0f;
- p[4].f = size > 3 ? c->vertex_array_float[i + 3] : 1.0f;
- } else if (c->vertex_array_double) {
- p[1].f = c->vertex_array_double[i];
- p[2].f = c->vertex_array_double[i + 1];
- p[3].f = size > 2 ? c->vertex_array_double[i + 2] : 0.0f;
- p[4].f = size > 3 ? c->vertex_array_double[i + 3] : 1.0f;
- } else {
+ offset = idx * c->vertex_array_stride;
+ switch (c->vertex_array_type) {
+ case TGL_FLOAT: {
+ TGLfloat *array = (TGLfloat *)((TGLbyte *)c->vertex_array + offset);
+ p[1].f = array[0];
+ p[2].f = array[1];
+ p[3].f = size > 2 ? array[2] : 0.0f;
+ p[4].f = size > 3 ? array[3] : 1.0f;
+ break;
+ }
+ case TGL_DOUBLE: {
+ TGLdouble *array = (TGLdouble *)((TGLbyte *)c->vertex_array + offset);
+ p[1].f = array[0];
+ p[2].f = array[1];
+ p[3].f = size > 2 ? array[2] : 0.0f;
+ p[4].f = size > 3 ? array[3] : 1.0f;
+ break;
+ }
+ case TGL_INT: {
+ TGLint *array = (TGLint *)((TGLbyte *)c->vertex_array + offset);
+ p[1].f = array[0];
+ p[2].f = array[1];
+ p[3].f = size > 2 ? array[2] : 0.0f;
+ p[4].f = size > 3 ? array[3] : 1.0f;
+ break;
+ }
+ case TGL_SHORT: {
+ TGLshort *array = (TGLshort *)((TGLbyte *)c->vertex_array + offset);
+ p[1].f = array[0];
+ p[2].f = array[1];
+ p[3].f = size > 2 ? array[2] : 0.0f;
+ p[4].f = size > 3 ? array[3] : 1.0f;
+ break;
+ }
+ default:
assert(0);
}
glopVertex(c, p);
@@ -165,7 +228,7 @@ void glopDrawArrays(GLContext *c, GLParam *p) {
void glopDrawElements(GLContext *c, GLParam *p) {
GLParam array_element[2];
- char *indices;
+ void *indices;
GLParam begin[2];
indices = (char *)p[4].p;
@@ -175,13 +238,13 @@ void glopDrawElements(GLContext *c, GLParam *p) {
for (int i = 0; i < p[2].i; i++) {
switch (p[3].i) {
case TGL_UNSIGNED_BYTE:
- array_element[1].i = *(TGLbyte *)(indices + i * sizeof(TGLbyte));
+ array_element[1].i = ((TGLbyte *)indices)[i];
break;
case TGL_UNSIGNED_SHORT:
- array_element[1].i = *(TGLshort *)(indices + i * sizeof(TGLshort));
+ array_element[1].i = ((TGLshort *)indices)[i];
break;
case TGL_UNSIGNED_INT:
- array_element[1].i = *(TGLint *)(indices + i * sizeof(TGLint));
+ array_element[1].i = ((TGLint *)indices)[i];
break;
default:
assert(0);
@@ -202,23 +265,20 @@ void glopDisableClientState(GLContext *c, GLParam *p) {
void glopVertexPointer(GLContext *c, GLParam *p) {
c->vertex_array_size = p[1].i;
- c->vertex_array_stride = p[3].i;
- c->vertex_array_int = nullptr;
- c->vertex_array_short = nullptr;
- c->vertex_array_float = nullptr;
- c->vertex_array_double = nullptr;
- switch (p[2].i) {
- case TGL_SHORT:
- c->vertex_array_short = (TGLshort *)p[4].p;
- break;
- case TGL_INT:
- c->vertex_array_int = (TGLint *)p[4].p;
- break;
+ c->vertex_array_type = p[2].i;
+ c->vertex_array = p[4].p;
+ switch (c->vertex_array_type) {
case TGL_FLOAT:
- c->vertex_array_float = (TGLfloat *)p[4].p;
+ c->vertex_array_stride = p[3].i != 0 ? p[3].i : c->vertex_array_size * sizeof(TGLfloat);
break;
case TGL_DOUBLE:
- c->vertex_array_double = (TGLdouble *)p[4].p;
+ c->vertex_array_stride = p[3].i != 0 ? p[3].i : c->vertex_array_size * sizeof(TGLdouble);
+ break;
+ case TGL_INT:
+ c->vertex_array_stride = p[3].i != 0 ? p[3].i : c->vertex_array_size * sizeof(TGLint);
+ break;
+ case TGL_SHORT:
+ c->vertex_array_stride = p[3].i != 0 ? p[3].i : c->vertex_array_size * sizeof(TGLshort);
break;
default:
assert(0);
@@ -228,23 +288,26 @@ void glopVertexPointer(GLContext *c, GLParam *p) {
void glopColorPointer(GLContext *c, GLParam *p) {
c->color_array_size = p[1].i;
- c->color_array_stride = p[3].i;
- c->color_array_int = nullptr;
- c->color_array_short = nullptr;
- c->color_array_float = nullptr;
- c->color_array_double = nullptr;
+ c->color_array_type = p[2].i;
+ c->color_array = p[4].p;
switch (p[2].i) {
+ case TGL_BYTE:
+ case TGL_UNSIGNED_BYTE:
+ c->color_array_stride = p[3].i != 0 ? p[3].i : c->color_array_stride * sizeof(TGLbyte);
+ break;
case TGL_SHORT:
- c->color_array_short = (TGLshort *)p[4].p;
+ case TGL_UNSIGNED_SHORT:
+ c->color_array_stride = p[3].i != 0 ? p[3].i : c->color_array_stride * sizeof(TGLshort);
break;
case TGL_INT:
- c->color_array_int = (TGLint *)p[4].p;
+ case TGL_UNSIGNED_INT:
+ c->color_array_stride = p[3].i != 0 ? p[3].i : c->color_array_stride * sizeof(TGLint);
break;
case TGL_FLOAT:
- c->color_array_float = (TGLfloat *)p[4].p;
+ c->color_array_stride = p[3].i != 0 ? p[3].i : c->color_array_stride * sizeof(TGLfloat);
break;
case TGL_DOUBLE:
- c->color_array_double = (TGLdouble *)p[4].p;
+ c->color_array_stride = p[3].i != 0 ? p[3].i : c->color_array_stride * sizeof(TGLdouble);
break;
default:
assert(0);
@@ -253,23 +316,20 @@ void glopColorPointer(GLContext *c, GLParam *p) {
}
void glopNormalPointer(GLContext *c, GLParam *p) {
- c->normal_array_stride = p[2].i;
- c->normal_array_int = nullptr;
- c->normal_array_short = nullptr;
- c->normal_array_float = nullptr;
- c->normal_array_double = nullptr;
+ c->normal_array_type = p[1].i;
+ c->normal_array = p[3].p;
switch (p[1].i) {
- case TGL_SHORT:
- c->normal_array_short = (TGLshort *)p[3].p;
- break;
- case TGL_INT:
- c->normal_array_int = (TGLint *)p[3].p;
- break;
case TGL_FLOAT:
- c->normal_array_float = (TGLfloat *)p[3].p;
+ c->normal_array_stride = p[2].i != 0 ? p[2].i : 3 * sizeof(TGLfloat);
break;
case TGL_DOUBLE:
- c->normal_array_double = (TGLdouble *)p[3].p;
+ c->normal_array_stride = p[2].i != 0 ? p[2].i : 3 * sizeof(TGLdouble);
+ break;
+ case TGL_INT:
+ c->normal_array_stride = p[2].i != 0 ? p[2].i : 3 * sizeof(TGLint);
+ break;
+ case TGL_SHORT:
+ c->normal_array_stride = p[2].i != 0 ? p[2].i : 3 * sizeof(TGLshort);
break;
default:
assert(0);
@@ -279,23 +339,20 @@ void glopNormalPointer(GLContext *c, GLParam *p) {
void glopTexCoordPointer(GLContext *c, GLParam *p) {
c->texcoord_array_size = p[1].i;
- c->texcoord_array_stride = p[3].i;
- c->texcoord_array_int = nullptr;
- c->texcoord_array_short = nullptr;
- c->texcoord_array_float = nullptr;
- c->texcoord_array_double = nullptr;
- switch (p[2].i) {
- case TGL_SHORT:
- c->texcoord_array_short = (TGLshort *)p[4].p;
- break;
- case TGL_INT:
- c->texcoord_array_int = (TGLint *)p[4].p;
- break;
+ c->texcoord_array_type = p[2].i;
+ c->texcoord_array = p[4].p;
+ switch (c->texcoord_array_type) {
case TGL_FLOAT:
- c->texcoord_array_float = (TGLfloat *)p[4].p;
+ c->texcoord_array_stride = p[3].i != 0 ? p[3].i : c->texcoord_array_size * sizeof(TGLfloat);
break;
case TGL_DOUBLE:
- c->texcoord_array_double = (TGLdouble *)p[4].p;
+ c->texcoord_array_stride = p[3].i != 0 ? p[3].i : c->texcoord_array_size * sizeof(TGLdouble);
+ break;
+ case TGL_INT:
+ c->texcoord_array_stride = p[3].i != 0 ? p[3].i : c->texcoord_array_size * sizeof(TGLint);
+ break;
+ case TGL_SHORT:
+ c->texcoord_array_stride = p[3].i != 0 ? p[3].i : c->texcoord_array_size * sizeof(TGLshort);
break;
default:
assert(0);
diff --git a/graphics/tinygl/zgl.h b/graphics/tinygl/zgl.h
index c956c0f5a9..551ef1e4a6 100644
--- a/graphics/tinygl/zgl.h
+++ b/graphics/tinygl/zgl.h
@@ -349,29 +349,21 @@ struct GLContext {
GLVertex *vertex;
// opengl 1.1 arrays
- TGLshort *vertex_array_short;
- TGLint *vertex_array_int;
- TGLfloat *vertex_array_float;
- TGLdouble *vertex_array_double;
+ TGLvoid *vertex_array;
int vertex_array_size;
int vertex_array_stride;
- TGLshort *normal_array_short;
- TGLint *normal_array_int;
- TGLfloat *normal_array_float;
- TGLdouble *normal_array_double;
+ int vertex_array_type;
+ TGLvoid *normal_array;
int normal_array_stride;
- TGLshort *color_array_short;
- TGLint *color_array_int;
- TGLfloat *color_array_float;
- TGLdouble *color_array_double;
+ int normal_array_type;
+ TGLvoid *color_array;
int color_array_size;
int color_array_stride;
- TGLshort *texcoord_array_short;
- TGLint *texcoord_array_int;
- TGLfloat *texcoord_array_float;
- TGLdouble *texcoord_array_double;
+ int color_array_type;
+ TGLvoid *texcoord_array;
int texcoord_array_size;
int texcoord_array_stride;
+ int texcoord_array_type;
int client_states;
// opengl 1.1 polygon offset
More information about the Scummvm-git-logs
mailing list