mirror of
https://github.com/aap/librw.git
synced 2025-12-19 17:09:51 +00:00
added some very basic im2d stuff to gl3
This commit is contained in:
@@ -12,6 +12,7 @@
|
||||
#include <GL/glew.h>
|
||||
#include "rwgl3.h"
|
||||
#include "rwgl3shader.h"
|
||||
#include "rwgl3impl.h"
|
||||
|
||||
namespace rw {
|
||||
namespace gl3 {
|
||||
@@ -417,6 +418,7 @@ initializeRender(void)
|
||||
engine->clearCamera = clearCamera;
|
||||
engine->setRenderState = setRenderState;
|
||||
engine->getRenderState = getRenderState;
|
||||
engine->im2DRenderIndexedPrimitive = im2DRenderIndexedPrimitive;
|
||||
engine->zNear = -1.0f;
|
||||
engine->zFar = 1.0f;
|
||||
|
||||
@@ -461,6 +463,8 @@ initializeRender(void)
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1,
|
||||
0, GL_RGBA, GL_UNSIGNED_BYTE, &whitepixel);
|
||||
|
||||
im2DInit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
90
src/gl/gl3im2d.cpp
Normal file
90
src/gl/gl3im2d.cpp
Normal file
@@ -0,0 +1,90 @@
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
|
||||
#include "../rwbase.h"
|
||||
#include "../rwerror.h"
|
||||
#include "../rwplg.h"
|
||||
#include "../rwpipeline.h"
|
||||
#include "../rwobjects.h"
|
||||
#include "../rwengine.h"
|
||||
#ifdef RW_OPENGL
|
||||
#include <GL/glew.h>
|
||||
#include "rwgl3.h"
|
||||
#include "rwgl3shader.h"
|
||||
|
||||
namespace rw {
|
||||
namespace gl3 {
|
||||
|
||||
uint32 im2DVbo, im2DIbo;
|
||||
|
||||
#define STARTINDICES 1024
|
||||
#define STARTVERTICES 1024
|
||||
|
||||
static Shader *im2dShader;
|
||||
static AttribDesc attribDesc[3] = {
|
||||
{ ATTRIB_POS, GL_FLOAT, GL_FALSE, 3,
|
||||
sizeof(Im2DVertex), 0 },
|
||||
{ ATTRIB_COLOR, GL_UNSIGNED_BYTE, GL_TRUE, 4,
|
||||
sizeof(Im2DVertex), offsetof(Im2DVertex, r) },
|
||||
{ ATTRIB_TEXCOORDS0, GL_FLOAT, GL_FALSE, 2,
|
||||
sizeof(Im2DVertex), offsetof(Im2DVertex, r) },
|
||||
};
|
||||
|
||||
static int primTypeMap[] = {
|
||||
GL_POINTS, // invalid
|
||||
GL_LINES,
|
||||
GL_LINE_STRIP,
|
||||
GL_TRIANGLES,
|
||||
GL_TRIANGLE_STRIP,
|
||||
GL_TRIANGLE_FAN,
|
||||
GL_POINTS
|
||||
};
|
||||
|
||||
void
|
||||
im2DInit(void)
|
||||
{
|
||||
#include "shaders/im2d_gl3.inc"
|
||||
im2dShader = Shader::fromStrings(im2d_vert_src, im2d_frag_src);
|
||||
|
||||
glGenBuffers(1, &im2DIbo);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im2DIbo);
|
||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, STARTINDICES*2,
|
||||
nil, GL_DYNAMIC_DRAW);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||
|
||||
glGenBuffers(1, &im2DVbo);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, im2DVbo);
|
||||
glBufferData(GL_ARRAY_BUFFER, STARTVERTICES*sizeof(Im2DVertex),
|
||||
nil, GL_DYNAMIC_DRAW);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
}
|
||||
|
||||
void
|
||||
im2DRenderIndexedPrimitive(PrimitiveType primType,
|
||||
void *vertices, int32 numVertices,
|
||||
void *indices, int32 numIndices)
|
||||
{
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im2DIbo);
|
||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, numIndices*2,
|
||||
indices, GL_DYNAMIC_DRAW);
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, im2DVbo);
|
||||
glBufferData(GL_ARRAY_BUFFER, numVertices*sizeof(Im2DVertex),
|
||||
vertices, GL_DYNAMIC_DRAW);
|
||||
|
||||
setAttribPointers(attribDesc, 3);
|
||||
im2dShader->use();
|
||||
|
||||
setTexture(0, engine->imtexture);
|
||||
|
||||
flushCache();
|
||||
glDrawElements(primTypeMap[primType], numIndices,
|
||||
GL_UNSIGNED_SHORT, nil);
|
||||
disableAttribPointers(attribDesc, 3);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -68,10 +68,10 @@ instance(rw::ObjPipeline *rwpipe, Atomic *atomic)
|
||||
header->vbo = 0;
|
||||
|
||||
glGenBuffers(1, &header->ibo);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, header->ibo);
|
||||
glBufferData(GL_ARRAY_BUFFER, header->totalNumIndex*2,
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo);
|
||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, header->totalNumIndex*2,
|
||||
header->indexBuffer, GL_STATIC_DRAW);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||
|
||||
pipe->instanceCB(geo, header);
|
||||
}
|
||||
|
||||
@@ -195,7 +195,7 @@ matfxRenderCB(Atomic *atomic, InstanceDataHeader *header)
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, header->vbo);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo);
|
||||
setAttribPointers(header);
|
||||
setAttribPointers(header->attribDesc, header->numAttribs);
|
||||
|
||||
InstanceData *inst = header->inst;
|
||||
int32 n = header->numMeshes;
|
||||
@@ -215,6 +215,7 @@ matfxRenderCB(Atomic *atomic, InstanceDataHeader *header)
|
||||
}
|
||||
inst++;
|
||||
}
|
||||
disableAttribPointers(header->attribDesc, header->numAttribs);
|
||||
}
|
||||
|
||||
ObjPipeline*
|
||||
@@ -454,7 +455,7 @@ skinRenderCB(Atomic *atomic, InstanceDataHeader *header)
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, header->vbo);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo);
|
||||
setAttribPointers(header);
|
||||
setAttribPointers(header->attribDesc, header->numAttribs);
|
||||
|
||||
InstanceData *inst = header->inst;
|
||||
int32 n = header->numMeshes;
|
||||
@@ -489,6 +490,7 @@ skinRenderCB(Atomic *atomic, InstanceDataHeader *header)
|
||||
GL_UNSIGNED_SHORT, (void*)(uintptr)inst->offset);
|
||||
inst++;
|
||||
}
|
||||
disableAttribPointers(header->attribDesc, header->numAttribs);
|
||||
}
|
||||
|
||||
ObjPipeline*
|
||||
|
||||
@@ -21,18 +21,24 @@ namespace gl3 {
|
||||
#define MAX_LIGHTS 8
|
||||
|
||||
void
|
||||
setAttribPointers(InstanceDataHeader *header)
|
||||
setAttribPointers(AttribDesc *attribDescs, int32 numAttribs)
|
||||
{
|
||||
AttribDesc *a;
|
||||
for(a = header->attribDesc;
|
||||
a != &header->attribDesc[header->numAttribs];
|
||||
a++){
|
||||
for(a = attribDescs; a != &attribDescs[numAttribs]; a++){
|
||||
glEnableVertexAttribArray(a->index);
|
||||
glVertexAttribPointer(a->index, a->size, a->type, a->normalized,
|
||||
a->stride, (void*)(uint64)a->offset);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
disableAttribPointers(AttribDesc *attribDescs, int32 numAttribs)
|
||||
{
|
||||
AttribDesc *a;
|
||||
for(a = attribDescs; a != &attribDescs[numAttribs]; a++)
|
||||
glDisableVertexAttribArray(a->index);
|
||||
}
|
||||
|
||||
void
|
||||
lightingCB(void)
|
||||
{
|
||||
@@ -73,7 +79,7 @@ defaultRenderCB(Atomic *atomic, InstanceDataHeader *header)
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, header->vbo);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, header->ibo);
|
||||
setAttribPointers(header);
|
||||
setAttribPointers(header->attribDesc, header->numAttribs);
|
||||
|
||||
InstanceData *inst = header->inst;
|
||||
int32 n = header->numMeshes;
|
||||
@@ -104,6 +110,7 @@ defaultRenderCB(Atomic *atomic, InstanceDataHeader *header)
|
||||
GL_UNSIGNED_SHORT, (void*)(uintptr)inst->offset);
|
||||
inst++;
|
||||
}
|
||||
disableAttribPointers(header->attribDesc, header->numAttribs);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -58,7 +58,15 @@ struct InstanceDataHeader : rw::InstanceDataHeader
|
||||
InstanceData *inst;
|
||||
};
|
||||
|
||||
void setAttribPointers(InstanceDataHeader *header);
|
||||
struct Im2DVertex
|
||||
{
|
||||
float32 x, y, z;
|
||||
uint8 r, g, b, a;
|
||||
float32 u, v;
|
||||
};
|
||||
|
||||
void setAttribPointers(AttribDesc *attribDescs, int32 numAttribs);
|
||||
void disableAttribPointers(AttribDesc *attribDescs, int32 numAttribs);
|
||||
|
||||
// Render state
|
||||
|
||||
|
||||
@@ -4,6 +4,10 @@ namespace gl3 {
|
||||
#ifdef RW_OPENGL
|
||||
|
||||
extern Shader *simpleShader;
|
||||
extern uint32 im2DVbo, im2DIbo;
|
||||
void im2DInit(void);
|
||||
void im2DRenderIndexedPrimitive(PrimitiveType primType,
|
||||
void *vertices, int32 numVertices, void *indices, int32 numIndices);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,4 +1,12 @@
|
||||
all: simple_gl3.inc matfx_gl3.inc skin_gl3.inc
|
||||
all: im2d_gl3.inc simple_gl3.inc matfx_gl3.inc skin_gl3.inc
|
||||
|
||||
im2d_gl3.inc: im2d.frag im2d.vert
|
||||
(echo 'const char *im2d_vert_src =';\
|
||||
sed 's/..*/"&\\n"/' im2d.vert;\
|
||||
echo ';';\
|
||||
echo 'const char *im2d_frag_src =';\
|
||||
sed 's/..*/"&\\n"/' im2d.frag;\
|
||||
echo ';') >im2d_gl3.inc
|
||||
|
||||
simple_gl3.inc: simple.frag simple.vert
|
||||
(echo 'const char *simple_vert_src =';\
|
||||
|
||||
15
src/gl/shaders/im2d.frag
Normal file
15
src/gl/shaders/im2d.frag
Normal file
@@ -0,0 +1,15 @@
|
||||
#version 330
|
||||
|
||||
uniform sampler2D tex;
|
||||
|
||||
in vec4 v_color;
|
||||
in vec2 v_tex0;
|
||||
|
||||
out vec4 color;
|
||||
|
||||
void
|
||||
main(void)
|
||||
{
|
||||
color = v_color*texture2D(tex, vec2(v_tex0.x, v_tex0.y));
|
||||
}
|
||||
|
||||
23
src/gl/shaders/im2d.vert
Normal file
23
src/gl/shaders/im2d.vert
Normal file
@@ -0,0 +1,23 @@
|
||||
#version 330
|
||||
|
||||
layout(std140) uniform Im2DState
|
||||
{
|
||||
int u_alphaTest;
|
||||
float u_alphaRef;
|
||||
mat4 u_xform;
|
||||
};
|
||||
|
||||
layout(location = 0) in vec3 in_pos;
|
||||
layout(location = 2) in vec4 in_color;
|
||||
layout(location = 3) in vec2 in_tex0;
|
||||
|
||||
out vec4 v_color;
|
||||
out vec2 v_tex0;
|
||||
|
||||
void
|
||||
main(void)
|
||||
{
|
||||
gl_Position = vec4(in_pos, 1.0);
|
||||
v_color = in_color;
|
||||
v_tex0 = in_tex0;
|
||||
}
|
||||
42
src/gl/shaders/im2d_gl3.inc
Normal file
42
src/gl/shaders/im2d_gl3.inc
Normal file
@@ -0,0 +1,42 @@
|
||||
const char *im2d_vert_src =
|
||||
"#version 330\n"
|
||||
|
||||
"layout(std140) uniform Im2DState\n"
|
||||
"{\n"
|
||||
" int u_alphaTest;\n"
|
||||
" float u_alphaRef;\n"
|
||||
" mat4 u_xform;\n"
|
||||
"};\n"
|
||||
|
||||
"layout(location = 0) in vec3 in_pos;\n"
|
||||
"layout(location = 2) in vec4 in_color;\n"
|
||||
"layout(location = 3) in vec2 in_tex0;\n"
|
||||
|
||||
"out vec4 v_color;\n"
|
||||
"out vec2 v_tex0;\n"
|
||||
|
||||
"void\n"
|
||||
"main(void)\n"
|
||||
"{\n"
|
||||
" gl_Position = vec4(in_pos, 1.0);\n"
|
||||
" v_color = in_color;\n"
|
||||
" v_tex0 = in_tex0;\n"
|
||||
"}\n"
|
||||
;
|
||||
const char *im2d_frag_src =
|
||||
"#version 330\n"
|
||||
|
||||
"uniform sampler2D tex;\n"
|
||||
|
||||
"in vec4 v_color;\n"
|
||||
"in vec2 v_tex0;\n"
|
||||
|
||||
"out vec4 color;\n"
|
||||
|
||||
"void\n"
|
||||
"main(void)\n"
|
||||
"{\n"
|
||||
" color = v_color*texture2D(tex, vec2(v_tex0.x, v_tex0.y));\n"
|
||||
"}\n"
|
||||
|
||||
;
|
||||
Reference in New Issue
Block a user