From: mittorn Date: Wed, 10 Aug 2016 15:39:19 +0000 (+0700) Subject: Merge pull request #4 from FWGS/xashxt X-Git-Url: http://deadsoftware.ru/gitweb?p=nanogl.git;a=commitdiff_plain;h=536202427f3391d23f28e6a81443523da0ac1051;hp=3bfb0b2c9c04f5463e75b604fd11c042eb3b3ff1 Merge pull request #4 from FWGS/xashxt Xashxt --- diff --git a/Android.mk b/Android.mk index 70c5634..7cba042 100644 --- a/Android.mk +++ b/Android.mk @@ -20,7 +20,7 @@ LOCAL_MODULE := NanoGL include $(XASH3D_CONFIG) -LOCAL_CFLAGS += +LOCAL_CFLAGS += -D__MULTITEXTURE_SUPPORT__ LOCAL_C_INCLUDES := $(LOCAL_PATH)/GL diff --git a/GL/gl.h b/GL/gl.h index 5bdc472..605864b 100644 --- a/GL/gl.h +++ b/GL/gl.h @@ -691,6 +691,39 @@ void glTexGeni( GLenum coord, GLenum pname, GLint param ); void glTexGenfv( GLenum coord, GLenum pname, const GLfloat *params ); void glColor4ub( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha); +// for XashXT + +void glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); + +void glTexEnvi(GLenum target, GLenum pname, GLint param); + +void glBindFramebuffer(GLenum target, GLuint framebuffer); +void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers); +void glGenFramebuffers (GLsizei n, GLuint *framebuffers); +GLenum glCheckFramebufferStatus(GLenum target); + +//GLboolean glIsRenderbuffer (GLuint renderbuffer); +void glBindRenderbuffer (GLenum target, GLuint renderbuffer); +void glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); +void glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); + + +void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); + + +void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + +void glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); + + +void glNormalPointer(GLenum type, GLsizei stride, const void *ptr); + +void glMultiTexCoord3f(GLenum, GLfloat, GLfloat, GLfloat); +void glMultiTexCoord3fARB(GLenum, GLfloat, GLfloat, GLfloat); + +void glMultiTexCoord2f(GLenum, GLfloat, GLfloat); + +void glDrawArrays( GLenum mode, GLint first, GLsizei count ); #ifdef __cplusplus } diff --git a/GL/gl_entries.in b/GL/gl_entries.in index 57d7a87..19220c2 100644 --- a/GL/gl_entries.in +++ b/GL/gl_entries.in @@ -37,7 +37,7 @@ GL_ENTRY(void,glClearColor,float red, float green, float blue, float alpha) GL_ENTRY(void,glClearColorx,int red, int green, int blue, int alpha) GL_ENTRY(void,glClearDepthf,float depth) - GL_ENTRY(void,glClearDepthx,int depth) + GL_ENTRY(void,glClearDepthx,int depth) GL_ENTRY(void,glClearStencil,int s) GL_ENTRY(void,glClientActiveTexture,unsigned int texture) GL_ENTRY(void,glColor4f,float red, float green, float blue, float alpha) @@ -185,3 +185,14 @@ GL_ENTRY(void,glOrtho,double left, double right, double bottom, double top, double zNear, double zFar) GL_ENTRY(void,glDepthRange,double zNear, double zFar) #endif + +// fbo +GL_ENTRY(void,glGenFramebuffersOES, GLsizei n, GLuint* framebuffers) +GL_ENTRY(void,glGenRenderbuffersOES, GLsizei n, GLuint* renderbuffers) +GL_ENTRY(void,glRenderbufferStorageOES, GLenum target, GLenum internalformat, GLsizei width, GLsizei height) +GL_ENTRY(void,glBindFramebufferOES, GLenum target, GLuint framebuffer) +GL_ENTRY(void,glBindRenderbufferOES, GLenum target, GLuint renderbuffer) +GL_ENTRY(void,glFramebufferTexture2DOES, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) +GL_ENTRY(void,glDeleteRenderbuffersOES, GLsizei n, const GLuint* renderbuffers) +GL_ENTRY(void,glDeleteFramebuffersOES, GLsizei n, const GLuint* framebuffers) +GL_ENTRY(void,glFramebufferRenderbufferOES, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) diff --git a/GL/glesinterface.h b/GL/glesinterface.h index 47fd584..0003ef6 100644 --- a/GL/glesinterface.h +++ b/GL/glesinterface.h @@ -229,9 +229,18 @@ struct GlESInterface #ifdef USE_CORE_PROFILE void ( APIENTRY *glOrtho) (double left, double right, double bottom, double top, double zNear, double zFar) S; void ( APIENTRY *glDepthRange) (double zNear, double zFar) S; -#endif - - }; +#endif + void ( APIENTRY *glGenFramebuffers) (unsigned int n, unsigned int* framebuffers) S; + void ( APIENTRY *glGenRenderbuffers) (unsigned int n, unsigned int* renderbuffers) S; + void ( APIENTRY *glRenderbufferStorage) (unsigned int target, unsigned int internalformat, unsigned int width, unsigned int height) S; + void ( APIENTRY *glBindFramebuffer) (unsigned int target, unsigned int framebuffer) S; + void ( APIENTRY *glBindRenderbuffer) (unsigned int target, unsigned int renderbuffer) S; + void ( APIENTRY *glFramebufferTexture2D) (unsigned int target, unsigned int attachment, unsigned int textarget, unsigned int texture, int level) S; + void ( APIENTRY *glDeleteRenderbuffers) (unsigned int n, const unsigned int* renderbuffers) S; + void ( APIENTRY *glDeleteFramebuffers) (unsigned int n, const unsigned int* framebuffers) S; + void ( APIENTRY *glFramebufferRenderbuffer) (unsigned int target, unsigned int attachment, unsigned int renderbuffertarget, unsigned int renderbuffer) S; + +}; #if !defined (__WINS__) #if defined(__TARGET_FPU_VFP) #pragma no_softfp_linkage diff --git a/nanoWrap.cpp b/nanoWrap.cpp index c13aea3..cdb9313 100644 --- a/nanoWrap.cpp +++ b/nanoWrap.cpp @@ -146,6 +146,8 @@ struct nanotmuState struct ptrstate vertex_array; struct ptrstate color_array; struct ptrstate texture_coord_array; + struct ptrstate normal_array; + }; static struct nanotmuState tmuState0; @@ -159,6 +161,7 @@ static struct nanotmuState tmuInitState = {4,GL_FLOAT,0, NULL, GL_FALSE, GL_FALSE}, {4,GL_FLOAT,0, NULL, GL_FALSE, GL_FALSE}, {4,GL_FLOAT,0, NULL, GL_FALSE, GL_FALSE}, + {3,GL_FLOAT,0, NULL, GL_FALSE, GL_FALSE}, }; static struct nanotmuState* activetmuState = &tmuState0; @@ -206,9 +209,9 @@ struct VertexAttrib #endif }; -static VertexAttrib vertexattribs[40000]; +static VertexAttrib vertexattribs[60000]; -static GLushort indexArray[30000]; +static GLushort indexArray[50000]; static GLuint vertexCount = 0; static GLuint indexCount = 0; @@ -289,6 +292,15 @@ void ResetNanoState() { glEsImpl->glDisableClientState(GL_TEXTURE_COORD_ARRAY); } + + if (tmuState0.normal_array.enabled) + { + glEsImpl->glEnableClientState(GL_NORMAL_ARRAY); + } + else + { + glEsImpl->glDisableClientState(GL_NORMAL_ARRAY); + } glEsImpl->glVertexPointer(tmuState0.vertex_array.size, tmuState0.vertex_array.type, tmuState0.vertex_array.stride, @@ -304,6 +316,11 @@ void ResetNanoState() tmuState0.color_array.stride, tmuState0.color_array.ptr); + glEsImpl->glNormalPointer( + tmuState0.normal_array.type, + tmuState0.normal_array.stride, + tmuState0.normal_array.ptr); + glEsImpl->glMatrixMode(nanoglState.matrixmode); @@ -494,6 +511,9 @@ void glEnd(void) default: break; } + if( ptrVertexAttribArray - vertexattribs > 20000 * sizeof(VertexAttrib) || + ptrIndexArray - indexArray > 15000 * sizeof(GLushort) ) + FlushOnStateChange(); } void glEnable (GLenum cap) @@ -1524,7 +1544,7 @@ void glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *indi if (arraysValid || tmuState0.vertex_array.changed || tmuState0.color_array.changed || - tmuState0.texture_coord_array.changed) + tmuState0.texture_coord_array.changed || tmuState0.normal_array.changed) { glEsImpl->glClientActiveTexture(GL_TEXTURE0); } @@ -1560,6 +1580,21 @@ void glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *indi tmuState0.color_array.ptr); tmuState0.color_array.changed = GL_FALSE; } + if (arraysValid || tmuState0.normal_array.changed) + { + if (tmuState0.normal_array.enabled) + { + glEsImpl->glEnableClientState(GL_NORMAL_ARRAY); + } + else + { + glEsImpl->glDisableClientState(GL_NORMAL_ARRAY); + } + glEsImpl->glNormalPointer(tmuState0.normal_array.type, + tmuState0.normal_array.stride, + tmuState0.normal_array.ptr); + tmuState0.normal_array.changed = GL_FALSE; + } if (arraysValid || tmuState0.texture_coord_array.changed) { tmuState0.texture_coord_array.changed = GL_FALSE; @@ -1632,6 +1667,15 @@ void glEnableClientState(GLenum array) clientstate->color_array.enabled = GL_TRUE; clientstate->color_array.changed = GL_TRUE; + break; + case GL_NORMAL_ARRAY: + if (clientstate->normal_array.enabled) + { + return; + } + clientstate->normal_array.enabled = GL_TRUE; + clientstate->normal_array.changed = GL_TRUE; + break; case GL_TEXTURE_COORD_ARRAY: if (clientstate->texture_coord_array.enabled) @@ -1678,6 +1722,15 @@ void glDisableClientState(GLenum array) clientstate->color_array.enabled = GL_FALSE; clientstate->color_array.changed = GL_TRUE; + break; + case GL_NORMAL_ARRAY: + if (!clientstate->normal_array.enabled) + { + return; + } + clientstate->normal_array.enabled = GL_FALSE; + clientstate->normal_array.changed = GL_TRUE; + break; case GL_TEXTURE_COORD_ARRAY: if (!clientstate->texture_coord_array.enabled) @@ -1745,6 +1798,23 @@ void glColorPointer( GLint size, GLenum type, GLsizei stride, const GLvoid *p tmuState0.color_array.ptr = (GLvoid*)pointer; tmuState0.color_array.changed = GL_TRUE; } + +void glNormalPointer( GLenum type, GLsizei stride, const GLvoid *pointer ) + { + int size = 0; + if (tmuState0.normal_array.size == size && + tmuState0.normal_array.stride == stride && + tmuState0.normal_array.type == type && + tmuState0.normal_array.ptr == pointer) + { + return; + } + tmuState0.normal_array.size = size; + tmuState0.normal_array.stride = stride; + tmuState0.normal_array.type = type; + tmuState0.normal_array.ptr = (GLvoid*)pointer; + tmuState0.normal_array.changed = GL_TRUE; + } void glPolygonOffset( GLfloat factor, GLfloat units ) { FlushOnStateChange(); @@ -1772,11 +1842,11 @@ void glMultiTexCoord2fARB( GLenum target, GLfloat s, GLfloat t ) #endif /* Vladimir */ -void glDrawArrays( GLenum mode, int first, int count) +/*void glDrawArrays( GLenum mode, int first, int count) { FlushOnStateChange(); glEsImpl->glDrawArrays(mode, first , count); -} +}*/ void glMultMatrixf (const GLfloat *m) { FlushOnStateChange(); @@ -1850,10 +1920,201 @@ void glFrontFace (GLenum mode) FlushOnStateChange(); glEsImpl->glFrontFace(mode); } +// End Vladimir + +void glTexEnvi (GLenum target, GLenum pname, GLint param) + { + if (target == GL_TEXTURE_ENV) + { + if (pname == GL_TEXTURE_ENV_MODE) + { + if (param == activetmuState->texture_env_mode.value) + { + return; + } + else + { + FlushOnStateChange(); + glEsImpl->glTexEnvi(target, pname, param); + activetmuState->texture_env_mode.value = param; + return; + } + } + } + FlushOnStateChange(); + glEsImpl->glTexEnvi(target, pname, param); + } + +void glMultiTexCoord3fARB(GLenum a, GLfloat b, GLfloat c, GLfloat) +{ + return glMultiTexCoord2fARB(a, b, c); +} +void glMultiTexCoord2f(GLenum, GLfloat, GLfloat) +{ +} +void glDrawArrays( GLenum mode, GLint first, GLsizei count ) + { + // ensure that all primitives specified between glBegin/glEnd pairs + // are rendered first, and that we have correct tmu in use.. + if( mode == GL_QUADS ) mode = GL_TRIANGLE_FAN; + FlushOnStateChange(); + // setup correct vertex/color/texcoord pointers + if (arraysValid || + tmuState0.vertex_array.changed || + tmuState0.color_array.changed || + tmuState0.texture_coord_array.changed || tmuState0.normal_array.changed) + { + glEsImpl->glClientActiveTexture(GL_TEXTURE0); + } + if (arraysValid || tmuState0.vertex_array.changed) + { + if (tmuState0.vertex_array.enabled) + { + glEsImpl->glEnableClientState(GL_VERTEX_ARRAY); + } + else + { + glEsImpl->glDisableClientState(GL_VERTEX_ARRAY); + } + glEsImpl->glVertexPointer(tmuState0.vertex_array.size, + tmuState0.vertex_array.type, + tmuState0.vertex_array.stride, + tmuState0.vertex_array.ptr); + tmuState0.vertex_array.changed = GL_FALSE; + } + if (arraysValid || tmuState0.color_array.changed) + { + if (tmuState0.color_array.enabled) + { + glEsImpl->glEnableClientState(GL_COLOR_ARRAY); + } + else + { + glEsImpl->glDisableClientState(GL_COLOR_ARRAY); + } + glEsImpl->glColorPointer(tmuState0.color_array.size, + tmuState0.color_array.type, + tmuState0.color_array.stride, + tmuState0.color_array.ptr); + tmuState0.color_array.changed = GL_FALSE; + } + if (arraysValid || tmuState0.normal_array.changed) + { + if (tmuState0.normal_array.enabled) + { + glEsImpl->glEnableClientState(GL_NORMAL_ARRAY); + } + else + { + glEsImpl->glDisableClientState(GL_NORMAL_ARRAY); + } + glEsImpl->glNormalPointer(tmuState0.normal_array.type, + tmuState0.normal_array.stride, + tmuState0.normal_array.ptr); + tmuState0.normal_array.changed = GL_FALSE; + } + if (arraysValid || tmuState0.texture_coord_array.changed) + { + tmuState0.texture_coord_array.changed = GL_FALSE; + if (tmuState0.texture_coord_array.enabled) + { + glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY); + } + else + { + glEsImpl->glDisableClientState(GL_TEXTURE_COORD_ARRAY); + } + glEsImpl->glTexCoordPointer(tmuState0.texture_coord_array.size, + tmuState0.texture_coord_array.type, + tmuState0.texture_coord_array.stride, + tmuState0.texture_coord_array.ptr); + } + + if (arraysValid || tmuState1.texture_coord_array.changed) + { + tmuState1.texture_coord_array.changed = GL_FALSE; + glEsImpl->glClientActiveTexture(GL_TEXTURE1); + if (tmuState1.texture_coord_array.enabled) + { + glEsImpl->glEnableClientState(GL_TEXTURE_COORD_ARRAY); + } + else + { + glEsImpl->glDisableClientState(GL_TEXTURE_COORD_ARRAY); + } + glEsImpl->glTexCoordPointer(tmuState1.texture_coord_array.size, + tmuState1.texture_coord_array.type, + tmuState1.texture_coord_array.stride, + tmuState1.texture_coord_array.ptr); + } -// End Vladimir + arraysValid = GL_FALSE; + glEsImpl->glDrawArrays(mode, first, count); + } +/*void glNormalPointer(GLenum type, GLsizei stride, const void *ptr) +{ + glEsImpl->glNormalPointer( type, stride, ptr ); +}*/ +void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) +{ + FlushOnStateChange(); + glEsImpl->glCopyTexSubImage2D( target, level, xoffset, yoffset, x, y, width, height ); +} + +void glGenFramebuffers (GLsizei n, GLuint* framebuffers) +{ + FlushOnStateChange(); + glEsImpl->glGenFramebuffers( n, framebuffers ); +} +void glGenRenderbuffers( GLsizei n, GLuint* renderbuffers ) +{ + FlushOnStateChange(); + glEsImpl->glGenRenderbuffers( n, renderbuffers ); +} + +void glBindRenderbuffer(GLenum target, GLuint renderbuffer) +{ + FlushOnStateChange(); + glEsImpl->glBindRenderbuffer( target, renderbuffer ); +} + +void glBindFramebuffer(GLenum target, GLuint framebuffer)\ +{ + FlushOnStateChange(); + glEsImpl->glBindFramebuffer( target, framebuffer ); +} + +void glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) +{ + FlushOnStateChange(); + glEsImpl->glFramebufferRenderbuffer( target, attachment, renderbuffertarget, renderbuffer ); +} + +void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers) +{ + FlushOnStateChange(); + glEsImpl->glDeleteFramebuffers(n, framebuffers); +} + +void glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers) +{ + FlushOnStateChange(); + glEsImpl->glDeleteRenderbuffers( n, renderbuffers ); +} +void glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) +{ + FlushOnStateChange(); + glEsImpl->glFramebufferTexture2D(target, attachment,textarget,texture,level); +} + +void glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) +{ + FlushOnStateChange(); + glEsImpl->glRenderbufferStorage(target, internalformat, width, height ); +} + diff --git a/nanogl.cpp b/nanogl.cpp index 0f4bc6a..c8454b0 100644 --- a/nanogl.cpp +++ b/nanogl.cpp @@ -143,7 +143,11 @@ static int CreateGlEsInterface( const char * name, void * lib, void * lib1, void if ( f == NULL ) { LOGE ( "<%s> not found in libEGL.so", *api); - f = default_func; //(void*)gl_unimplemented; + if( glEsImpl->eglGetProcAddress && ( (void*)glEsImpl->eglGetProcAddress != (void*)gl_unimplemented ) ) + f = (void*)glEsImpl->eglGetProcAddress( *api ); + if(f == NULL) + f = (void*)default_func; //(void*)gl_unimplemented; + } else { LOGD ("<%s> @ 0x%p\n", *api, f); @@ -152,7 +156,10 @@ static int CreateGlEsInterface( const char * name, void * lib, void * lib1, void else { LOGE ( "libEGL.so not loaded!"); - f = default_func; + if( glEsImpl->eglGetProcAddress && ( (void*)glEsImpl->eglGetProcAddress != (void*)gl_unimplemented ) ) + f = (void*)glEsImpl->eglGetProcAddress( *api ); + if( !f ) + f = (void*)default_func; } } else { @@ -278,6 +285,19 @@ int nanoGL_Init() return 0; } +#ifdef __ANDROID__ + // somewhy it does not initialize correctly + *((void**)&glEsImpl->glGenFramebuffers) = (void*)glEsImpl->eglGetProcAddress( "glGenFramebuffersOES" ); + *((void**)&glEsImpl->glGenRenderbuffers) = (void*)glEsImpl->eglGetProcAddress( "glGenRenderbuffersOES" ); + *((void**)&glEsImpl->glRenderbufferStorage) = (void*)glEsImpl->eglGetProcAddress( "glRenderbufferStorageOES" ); + *((void**)&glEsImpl->glBindFramebuffer) = (void*)glEsImpl->eglGetProcAddress( "glBindFramebufferOES" ); + *((void**)&glEsImpl->glBindRenderbuffer) = (void*)glEsImpl->eglGetProcAddress( "glBindRenderbufferOES" ); + *((void**)&glEsImpl->glFramebufferTexture2D) = (void*)glEsImpl->eglGetProcAddress( "glFramebufferTexture2DOES" ); + *((void**)&glEsImpl->glDeleteRenderbuffers) = (void*)glEsImpl->eglGetProcAddress( "glDeleteRenderbuffersOES" ); + *((void**)&glEsImpl->glDeleteFramebuffers) = (void*)glEsImpl->eglGetProcAddress( "glDeleteFramebuffersOES" ); + *((void**)&glEsImpl->glFramebufferRenderbuffer) = (void*)glEsImpl->eglGetProcAddress( "glFramebufferRenderbufferOES" ); +#endif + // Init nanoGL InitGLStructs(); return 1;