object loading finished also you can see things now
This commit is contained in:
parent
db6b4ae12b
commit
020dacba24
15 changed files with 430 additions and 132 deletions
|
@ -28,8 +28,12 @@ target_link_libraries(ogl_test
|
|||
${GLEW_LIBRARIES}
|
||||
)
|
||||
|
||||
if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
|
||||
target_link_libraries(ogl_test m)
|
||||
endif()
|
||||
|
||||
#TODO replace this with something that runs on build
|
||||
file(COPY src/data DESTINATION ./)
|
||||
file(COPY src/shaders DESTINATION ./)
|
||||
#file(COPY src/data DESTINATION ./)
|
||||
#file(COPY src/shaders DESTINATION ./)
|
||||
|
||||
add_executable(rbm_gen rbm/main.c)
|
|
@ -206,6 +206,11 @@ int main(int argc, char* argv[]) {
|
|||
|
||||
fclose(fpi);
|
||||
|
||||
if(face_cnt == 0) {
|
||||
printf("OBJ file must have faces!");
|
||||
return -1;
|
||||
}
|
||||
|
||||
uint8_t magic[] = {0xDE, 0xAF, 0xB0, 0x0B};
|
||||
fwrite(magic, 1, 4, fpo);
|
||||
|
||||
|
|
|
@ -1,95 +0,0 @@
|
|||
ply
|
||||
format ascii 1.0
|
||||
comment Created by Blender 2.79 (sub 0) - www.blender.org, source file: ''
|
||||
element vertex 60
|
||||
property float x
|
||||
property float y
|
||||
property float z
|
||||
property float nx
|
||||
property float ny
|
||||
property float nz
|
||||
property float s
|
||||
property float t
|
||||
element face 20
|
||||
property list uchar uint vertex_indices
|
||||
end_header
|
||||
0.000000 0.000000 -1.000000 0.187597 -0.577354 -0.794651 0.818181 0.000000
|
||||
0.723600 -0.525720 -0.447215 0.187597 -0.577354 -0.794651 0.727272 0.157461
|
||||
-0.276385 -0.850640 -0.447215 0.187597 -0.577354 -0.794651 0.909090 0.157461
|
||||
0.723600 -0.525720 -0.447215 0.607065 0.000000 -0.794652 0.727272 0.157461
|
||||
0.000000 0.000000 -1.000000 0.607065 0.000000 -0.794652 0.636363 0.000000
|
||||
0.723600 0.525720 -0.447215 0.607065 0.000000 -0.794652 0.545454 0.157461
|
||||
0.000000 0.000000 -1.000000 -0.491122 -0.356829 -0.794652 0.090909 0.000000
|
||||
-0.276385 -0.850640 -0.447215 -0.491122 -0.356829 -0.794652 0.000000 0.157461
|
||||
-0.894425 0.000000 -0.447215 -0.491122 -0.356829 -0.794652 0.181818 0.157461
|
||||
0.000000 0.000000 -1.000000 -0.491122 0.356829 -0.794652 0.272727 0.000000
|
||||
-0.894425 0.000000 -0.447215 -0.491122 0.356829 -0.794652 0.181818 0.157461
|
||||
-0.276385 0.850640 -0.447215 -0.491122 0.356829 -0.794652 0.363636 0.157461
|
||||
0.000000 0.000000 -1.000000 0.187597 0.577354 -0.794651 0.454545 0.000000
|
||||
-0.276385 0.850640 -0.447215 0.187597 0.577354 -0.794651 0.363636 0.157461
|
||||
0.723600 0.525720 -0.447215 0.187597 0.577354 -0.794651 0.545454 0.157461
|
||||
0.723600 -0.525720 -0.447215 0.982246 0.000000 -0.187597 0.727272 0.157461
|
||||
0.723600 0.525720 -0.447215 0.982246 0.000000 -0.187597 0.545454 0.157461
|
||||
0.894425 0.000000 0.447215 0.982246 0.000000 -0.187597 0.636363 0.314921
|
||||
-0.276385 -0.850640 -0.447215 0.303536 -0.934171 -0.187589 0.909090 0.157461
|
||||
0.723600 -0.525720 -0.447215 0.303536 -0.934171 -0.187589 0.727272 0.157461
|
||||
0.276385 -0.850640 0.447215 0.303536 -0.934171 -0.187589 0.818181 0.314921
|
||||
-0.894425 0.000000 -0.447215 -0.794649 -0.577359 -0.187587 0.181818 0.157461
|
||||
-0.276385 -0.850640 -0.447215 -0.794649 -0.577359 -0.187587 0.000000 0.157461
|
||||
-0.723600 -0.525720 0.447215 -0.794649 -0.577359 -0.187587 0.090909 0.314921
|
||||
-0.276385 0.850640 -0.447215 -0.794649 0.577359 -0.187587 0.363636 0.157461
|
||||
-0.894425 0.000000 -0.447215 -0.794649 0.577359 -0.187587 0.181818 0.157461
|
||||
-0.723600 0.525720 0.447215 -0.794649 0.577359 -0.187587 0.272727 0.314921
|
||||
0.723600 0.525720 -0.447215 0.303536 0.934171 -0.187589 0.545454 0.157461
|
||||
-0.276385 0.850640 -0.447215 0.303536 0.934171 -0.187589 0.363636 0.157461
|
||||
0.276385 0.850640 0.447215 0.303536 0.934171 -0.187589 0.454545 0.314921
|
||||
0.723600 -0.525720 -0.447215 0.794649 -0.577359 0.187587 0.727272 0.157461
|
||||
0.894425 0.000000 0.447215 0.794649 -0.577359 0.187587 0.636363 0.314921
|
||||
0.276385 -0.850640 0.447215 0.794649 -0.577359 0.187587 0.818181 0.314921
|
||||
-0.276385 -0.850640 -0.447215 -0.303536 -0.934171 0.187589 0.909090 0.157461
|
||||
0.276385 -0.850640 0.447215 -0.303536 -0.934171 0.187589 0.818181 0.314921
|
||||
-0.723600 -0.525720 0.447215 -0.303536 -0.934171 0.187589 1.000000 0.314921
|
||||
-0.894425 0.000000 -0.447215 -0.982246 0.000000 0.187597 0.181818 0.157461
|
||||
-0.723600 -0.525720 0.447215 -0.982246 0.000000 0.187597 0.090909 0.314921
|
||||
-0.723600 0.525720 0.447215 -0.982246 0.000000 0.187597 0.272727 0.314921
|
||||
-0.276385 0.850640 -0.447215 -0.303536 0.934171 0.187589 0.363636 0.157461
|
||||
-0.723600 0.525720 0.447215 -0.303536 0.934171 0.187589 0.272727 0.314921
|
||||
0.276385 0.850640 0.447215 -0.303536 0.934171 0.187589 0.454545 0.314921
|
||||
0.723600 0.525720 -0.447215 0.794649 0.577359 0.187587 0.545454 0.157461
|
||||
0.276385 0.850640 0.447215 0.794649 0.577359 0.187587 0.454545 0.314921
|
||||
0.894425 0.000000 0.447215 0.794649 0.577359 0.187587 0.636363 0.314921
|
||||
0.276385 -0.850640 0.447215 0.491122 -0.356829 0.794652 0.818181 0.314921
|
||||
0.894425 0.000000 0.447215 0.491122 -0.356829 0.794652 0.636363 0.314921
|
||||
0.000000 0.000000 1.000000 0.491122 -0.356829 0.794652 0.727272 0.472382
|
||||
-0.723600 -0.525720 0.447215 -0.187597 -0.577354 0.794651 1.000000 0.314921
|
||||
0.276385 -0.850640 0.447215 -0.187597 -0.577354 0.794651 0.818181 0.314921
|
||||
0.000000 0.000000 1.000000 -0.187597 -0.577354 0.794651 0.909090 0.472382
|
||||
-0.723600 0.525720 0.447215 -0.607065 0.000000 0.794652 0.272727 0.314921
|
||||
-0.723600 -0.525720 0.447215 -0.607065 0.000000 0.794652 0.090909 0.314921
|
||||
0.000000 0.000000 1.000000 -0.607065 0.000000 0.794652 0.181818 0.472382
|
||||
0.276385 0.850640 0.447215 -0.187597 0.577354 0.794651 0.454545 0.314921
|
||||
-0.723600 0.525720 0.447215 -0.187597 0.577354 0.794651 0.272727 0.314921
|
||||
0.000000 0.000000 1.000000 -0.187597 0.577354 0.794651 0.363636 0.472382
|
||||
0.894425 0.000000 0.447215 0.491122 0.356829 0.794652 0.636363 0.314921
|
||||
0.276385 0.850640 0.447215 0.491122 0.356829 0.794652 0.454545 0.314921
|
||||
0.000000 0.000000 1.000000 0.491122 0.356829 0.794652 0.545454 0.472382
|
||||
3 0 1 2
|
||||
3 3 4 5
|
||||
3 6 7 8
|
||||
3 9 10 11
|
||||
3 12 13 14
|
||||
3 15 16 17
|
||||
3 18 19 20
|
||||
3 21 22 23
|
||||
3 24 25 26
|
||||
3 27 28 29
|
||||
3 30 31 32
|
||||
3 33 34 35
|
||||
3 36 37 38
|
||||
3 39 40 41
|
||||
3 42 43 44
|
||||
3 45 46 47
|
||||
3 48 49 50
|
||||
3 51 52 53
|
||||
3 54 55 56
|
||||
3 57 58 59
|
|
@ -1 +1 @@
|
|||
majorpos borpo the best game that has ever been made ever !!
|
||||
boo
|
22
src/koa/etc.c
Normal file
22
src/koa/etc.c
Normal file
|
@ -0,0 +1,22 @@
|
|||
#include "etc.h"
|
||||
|
||||
void mfree(int n, ...) {
|
||||
va_list args;
|
||||
va_start(args, n);
|
||||
|
||||
if(n > 0)
|
||||
for(int i = 0; i < n; ++i)
|
||||
free(va_arg(args, void*));
|
||||
else {
|
||||
void* ptr = NULL;
|
||||
for(;;) {
|
||||
ptr = va_arg(args, void*);
|
||||
if(ptr == NULL)
|
||||
break;
|
||||
|
||||
free(ptr);
|
||||
}
|
||||
}
|
||||
|
||||
va_end(args);
|
||||
}
|
9
src/koa/etc.h
Normal file
9
src/koa/etc.h
Normal file
|
@ -0,0 +1,9 @@
|
|||
#ifndef KOA_ETC_H
|
||||
#define KOA_ETC_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
void mfree(int n, ...);
|
||||
|
||||
#endif
|
|
@ -50,10 +50,11 @@ char* file_read(const char* file) {
|
|||
size = ftell(fp);
|
||||
rewind(fp);
|
||||
|
||||
content = malloc(sizeof(char) * size);
|
||||
content = malloc(sizeof(char) * size + 1);
|
||||
if(content == NULL)
|
||||
return NULL;
|
||||
|
||||
content[size] = '\0';
|
||||
fread(content, 1, size, fp);
|
||||
fclose(fp);
|
||||
|
||||
|
|
|
@ -8,7 +8,8 @@
|
|||
#include "koa/thread.h"
|
||||
#include "koa/time.h"
|
||||
|
||||
#define __STDERR err_ptr()
|
||||
//#define __STDERR err_ptr()
|
||||
#define __STDERR stdout
|
||||
|
||||
FILE* err_ptr(void);
|
||||
void err_out(const char*);
|
||||
|
|
118
src/main.c
118
src/main.c
|
@ -5,9 +5,11 @@
|
|||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <unistd.h>
|
||||
#include <cglm/cglm.h>
|
||||
|
||||
#include "koa/file.h"
|
||||
#include "okuu/mesh.h"
|
||||
#include "okuu/shader.h"
|
||||
|
||||
#define WINDOW_WIDTH 640
|
||||
#define WINDOW_HEIGHT 480
|
||||
|
@ -16,12 +18,99 @@ struct {
|
|||
SDL_Window* window;
|
||||
SDL_GLContext ctx;
|
||||
int mode, running;
|
||||
|
||||
mesh_t* monkey;
|
||||
} _g;
|
||||
|
||||
struct {
|
||||
shader_t* shader;
|
||||
|
||||
enum {
|
||||
DEF_MODEL,
|
||||
DEF_VIEW,
|
||||
DEF_PROJ
|
||||
};
|
||||
} _s_def;
|
||||
|
||||
int init();
|
||||
void deinit();
|
||||
void run();
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
if(init() < 0)
|
||||
return -1;
|
||||
|
||||
_g.monkey = mesh_load("data/monkey.rbm");
|
||||
|
||||
_s_def.shader = shader_create("default");
|
||||
shader_source(_s_def.shader, 2,
|
||||
"shaders/test.vert", GL_VERTEX_SHADER,
|
||||
"shaders/test.frag", GL_FRAGMENT_SHADER
|
||||
);
|
||||
shader_attribs(_s_def.shader, 3,
|
||||
"model", "view", "projection"
|
||||
);
|
||||
|
||||
_g.running = 1;
|
||||
while(_g.running)
|
||||
run();
|
||||
|
||||
deinit();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void run() {
|
||||
static mat4 model, view, projection;
|
||||
|
||||
static int init = 1;
|
||||
if(init) {
|
||||
//glm_translate_make(model, (vec3){ 0.0f, 0.f, -3.f });
|
||||
//glm_rotate(model, glm_rad(180), (vec3){0.f, 1.f, 0.f});
|
||||
glm_rotate_make(model, glm_rad(180), (vec3){ 0.f, 1.f, 0.f });
|
||||
//glm_mat4_identity(model);
|
||||
|
||||
//glm_mat4_identity(view);
|
||||
|
||||
glm_lookat(
|
||||
(vec3){3.f, 3.f, 3.f},
|
||||
(vec3){0.f, 0.f, 0.f},
|
||||
(vec3){0.f, 1.f, 0.f},
|
||||
view
|
||||
);
|
||||
|
||||
glm_perspective(
|
||||
glm_rad(45),
|
||||
(float)WINDOW_WIDTH/(float)WINDOW_HEIGHT,
|
||||
0.1f, 10.f,
|
||||
projection
|
||||
);
|
||||
|
||||
/*glm_perspective_default(
|
||||
(float)WINDOW_WIDTH/(float)WINDOW_HEIGHT,
|
||||
projection
|
||||
);*/
|
||||
|
||||
shader_start(_s_def.shader); {
|
||||
glUniformMatrix4fv(_ATTR(DEF_MODEL), 1, GL_FALSE, (float*)model);
|
||||
glUniformMatrix4fv(_ATTR(DEF_VIEW), 1, GL_FALSE, (float*)view);
|
||||
glUniformMatrix4fv(_ATTR(DEF_PROJ), 1, GL_FALSE, (float*)projection);
|
||||
} shader_stop();
|
||||
|
||||
init = 0;
|
||||
}
|
||||
|
||||
glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
|
||||
glClearColor(0.f, 0.f, 0.5f, 0.f);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
shader_start(_s_def.shader); {
|
||||
mesh_bind(_g.monkey);
|
||||
mesh_render(_g.monkey);
|
||||
mesh_unbind();
|
||||
} shader_stop();
|
||||
|
||||
SDL_GL_SwapWindow(_g.window);
|
||||
|
||||
SDL_Event ev;
|
||||
while(SDL_PollEvent(&ev)) {
|
||||
if(ev.type == SDL_KEYDOWN) {
|
||||
|
@ -34,8 +123,8 @@ void run() {
|
|||
SDL_SetWindowFullscreen(
|
||||
_g.window,
|
||||
_g.mode == 0
|
||||
? 0
|
||||
: SDL_WINDOW_FULLSCREEN
|
||||
? 0
|
||||
: SDL_WINDOW_FULLSCREEN
|
||||
);
|
||||
break;
|
||||
}
|
||||
|
@ -43,24 +132,6 @@ void run() {
|
|||
_g.running = 0;
|
||||
}
|
||||
}
|
||||
|
||||
glViewport(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT);
|
||||
glClearColor(0.f, 0.f, 0.f, 0.f);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
|
||||
SDL_GL_SwapWindow(_g.window);
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
if(init() < 0)
|
||||
return -1;
|
||||
|
||||
_g.running = 1;
|
||||
while(_g.running)
|
||||
run();
|
||||
|
||||
deinit();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int init() {
|
||||
|
@ -89,6 +160,11 @@ int init() {
|
|||
return -4;
|
||||
|
||||
SDL_GL_SetSwapInterval(1);
|
||||
|
||||
glEnable(GL_CULL_FACE);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthFunc(GL_LESS);
|
||||
|
||||
_g.mode = 0;
|
||||
return 0;
|
||||
}
|
||||
|
|
247
src/okuu/mesh.c
247
src/okuu/mesh.c
|
@ -1,15 +1,252 @@
|
|||
#include "mesh.h"
|
||||
|
||||
typedef struct {
|
||||
float data[3];
|
||||
} _pt_t;
|
||||
|
||||
typedef struct {
|
||||
uint32_t data[3][3];
|
||||
} _tri_t;
|
||||
|
||||
uint8_t* _ord(uint8_t* buf, int length) {
|
||||
static int end_chk = -1;
|
||||
if(end_chk == -1) {
|
||||
uint16_t chk = 0xB00B;
|
||||
end_chk = ((uint8_t*)&chk)[0] == 0x0B;
|
||||
}
|
||||
|
||||
if(end_chk)
|
||||
return buf;
|
||||
|
||||
uint8_t tmp[8] = { 0 };
|
||||
for(int i = 0; i < length; ++i)
|
||||
tmp[i] = buf[length - i - 1];
|
||||
memcpy(buf, tmp, length);
|
||||
|
||||
return buf;
|
||||
}
|
||||
|
||||
int _populate_pts
|
||||
(_pt_t* data, FILE* fp, uint32_t length, int width)
|
||||
{
|
||||
uint8_t buffer[4];
|
||||
int chk;
|
||||
|
||||
for(uint32_t i = 0; i < length; ++i) {
|
||||
for(int j = 0; j < width; ++j) {
|
||||
chk = fread(buffer, 1, 4, fp);
|
||||
if(chk != 4)
|
||||
return 0;
|
||||
|
||||
data[i].data[j] = *(float*)_ord(buffer, 4);
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int _populate_faces
|
||||
(_tri_t* data, FILE* fp, uint32_t at, int length, int flags)
|
||||
{
|
||||
uint8_t buffer[4] = { 0 };
|
||||
int chk;
|
||||
|
||||
for(int i = 0; i < 3; ++i) {
|
||||
for(int j = 0; j < 3; ++j) {
|
||||
if((flags & (1 << j)) == 0)
|
||||
continue;
|
||||
|
||||
chk = fread(buffer, 1, length, fp);
|
||||
if(chk != length)
|
||||
return 0;
|
||||
|
||||
data[at].data[i][j] = *(uint32_t *) _ord(buffer, 4);
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
mesh_t* mesh_load(const char* file) {
|
||||
FILE* fp = fopen(file, "rb");
|
||||
if(fp == NULL)
|
||||
return NULL;
|
||||
|
||||
enum { VERTEX_CNT = 0, NORMAL_CNT, TEX_CNT, FACE_CNT };
|
||||
int counts[4] = {0, 0, 0, 0};
|
||||
char line[1024];
|
||||
enum { VERT_CNT = 0, TEX_CNT, NORM_CNT, FACE_CNT };
|
||||
uint32_t counts[4] = { 0 };
|
||||
|
||||
for(;;) {
|
||||
fgets(line, 1024, fp);
|
||||
const uint8_t magic[] = {0xDE, 0xAF, 0xB0, 0x0B};
|
||||
uint8_t buffer[4] = { 0 };
|
||||
fread(buffer, 1, 4, fp);
|
||||
|
||||
if(memcmp(buffer, magic, 4) != 0) {
|
||||
fclose(fp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
for(int i = 0; i < 4; ++i) {
|
||||
fread(buffer, 1, 4, fp);
|
||||
counts[i] = *(uint32_t*)_ord(buffer, 4);
|
||||
}
|
||||
|
||||
if(feof(fp) || counts[VERT_CNT] == 0 || counts[FACE_CNT] == 0) {
|
||||
fclose(fp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
_pt_t *verts = malloc(sizeof(_pt_t) * counts[VERT_CNT]),
|
||||
*texs = malloc(sizeof(_pt_t) * counts[TEX_CNT]),
|
||||
*norms = malloc(sizeof(_pt_t) * counts[NORM_CNT]);
|
||||
_tri_t *faces = malloc(sizeof(_tri_t) * counts[FACE_CNT]);
|
||||
|
||||
int chk = 1;
|
||||
|
||||
chk &= _populate_pts(verts, fp, counts[VERT_CNT], 3);
|
||||
if(counts[TEX_CNT] > 0)
|
||||
chk &= _populate_pts(texs, fp, counts[TEX_CNT], 2);
|
||||
if(counts[NORM_CNT] > 0)
|
||||
chk &= _populate_pts(norms, fp, counts[NORM_CNT], 3);
|
||||
|
||||
int index_length = counts[FACE_CNT] <= 0xFFFF ? 2 : 4;
|
||||
for(uint32_t i = 0; i < counts[FACE_CNT]; ++i) {
|
||||
if(counts[TEX_CNT] > 0 && counts[NORM_CNT] > 0)
|
||||
chk &= _populate_faces(faces, fp, i, index_length, 0b111);
|
||||
else if(counts[TEX_CNT] > 0 && counts[NORM_CNT] == 0)
|
||||
chk &= _populate_faces(faces, fp, i, index_length, 0b110);
|
||||
else if(counts[TEX_CNT] == 0 && counts[NORM_CNT] > 0)
|
||||
chk &= _populate_faces(faces, fp, i, index_length, 0b101);
|
||||
else
|
||||
chk &= _populate_faces(faces, fp, i, index_length, 0b100);
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
if(!chk) {
|
||||
mfree(0, verts, texs, norms, faces, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
float *verts_asm = malloc(sizeof(float) * counts[FACE_CNT] * 3 * 3),
|
||||
*texs_asm = malloc(sizeof(float) * counts[FACE_CNT] * 3 * 2),
|
||||
*norms_asm = malloc(sizeof(float) * counts[FACE_CNT] * 3 * 3);
|
||||
mesh_t* mesh = malloc(sizeof(mesh_t));
|
||||
|
||||
for(uint32_t i = 0; i < counts[FACE_CNT]; ++i) {
|
||||
for(int j = 0; j < 3; ++j) {
|
||||
if(faces[i].data[j][0] > counts[VERT_CNT] ||
|
||||
faces[i].data[j][1] > counts[TEX_CNT] ||
|
||||
faces[i].data[j][2] > counts[NORM_CNT])
|
||||
{
|
||||
mfree(0,
|
||||
verts_asm, texs_asm, norms_asm,
|
||||
verts, texs, norms, faces, NULL
|
||||
);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
memcpy(
|
||||
&verts_asm[i*3*3 + 3*j],
|
||||
verts[faces[i].data[j][0] - 1].data,
|
||||
3 * sizeof(float)
|
||||
);
|
||||
|
||||
if(counts[TEX_CNT] > 0 && faces[i].data[j][1] != 0) {
|
||||
memcpy(
|
||||
&texs_asm[i * 3 * 2 + 2 * j],
|
||||
texs[faces[i].data[j][1] - 1].data,
|
||||
2 * sizeof(float)
|
||||
);
|
||||
}
|
||||
|
||||
if(counts[NORM_CNT] > 0 && faces[i].data[j][2] != 0) {
|
||||
memcpy(
|
||||
&norms_asm[i * 3 * 3 + 3 * j],
|
||||
norms[faces[i].data[j][2] - 1].data,
|
||||
3 * sizeof(float)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
glGenBuffers(3, mesh->buffers);
|
||||
glGenVertexArrays(1, &mesh->vao);
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, mesh->buffers[0]);
|
||||
glBufferData(
|
||||
GL_ARRAY_BUFFER,
|
||||
counts[FACE_CNT] * 3 * 3 * sizeof(float),
|
||||
verts_asm,
|
||||
GL_STATIC_DRAW
|
||||
);
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, mesh->buffers[1]);
|
||||
glBufferData(
|
||||
GL_ARRAY_BUFFER,
|
||||
counts[FACE_CNT] * 3 * 2 * sizeof(float),
|
||||
texs_asm,
|
||||
GL_STATIC_DRAW
|
||||
);
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, mesh->buffers[2]);
|
||||
glBufferData(
|
||||
GL_ARRAY_BUFFER,
|
||||
counts[FACE_CNT] * 3 * 3 * sizeof(float),
|
||||
norms_asm,
|
||||
GL_STATIC_DRAW
|
||||
);
|
||||
|
||||
mfree(0,
|
||||
verts_asm, texs_asm, norms_asm,
|
||||
verts, texs, norms, faces, NULL
|
||||
);
|
||||
|
||||
glBindVertexArray(mesh->vao); {
|
||||
glEnableVertexAttribArray(0);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, mesh->buffers[0]);
|
||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
|
||||
|
||||
glEnableVertexAttribArray(1);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, mesh->buffers[1]);
|
||||
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
|
||||
|
||||
glEnableVertexAttribArray(2);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, mesh->buffers[2]);
|
||||
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
|
||||
} glBindVertexArray(0);
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
|
||||
mesh->tri_cnt = counts[FACE_CNT];
|
||||
return mesh;
|
||||
}
|
||||
|
||||
void mesh_bind(mesh_t* mesh) {
|
||||
glBindVertexArray(mesh->vao);
|
||||
}
|
||||
|
||||
void mesh_render(mesh_t* mesh) {
|
||||
glDrawArrays(GL_TRIANGLES, 0, mesh->tri_cnt * 3);
|
||||
}
|
||||
|
||||
void mesh_unbind() {
|
||||
glBindVertexArray(0);
|
||||
}
|
||||
|
||||
void mesh_unload(mesh_t* mesh) {
|
||||
glDeleteVertexArrays(1, &mesh->vao);
|
||||
glDeleteBuffers(3, mesh->buffers);
|
||||
free(mesh);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,14 +1,29 @@
|
|||
#ifndef OKUU_MESH_H
|
||||
#define OKUU_MESH_H
|
||||
|
||||
#include <SDL.h>
|
||||
#include <GL/glew.h>
|
||||
#include <SDL_opengl.h>
|
||||
#include <GL/glu.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "koa/etc.h"
|
||||
|
||||
typedef struct {
|
||||
|
||||
GLuint buffers[3], vao;
|
||||
uint32_t tri_cnt;
|
||||
} mesh_t;
|
||||
|
||||
mesh_t* mesh_load(const char*);
|
||||
|
||||
void mesh_bind(mesh_t*);
|
||||
void mesh_render(mesh_t*);
|
||||
void mesh_unbind();
|
||||
|
||||
void mesh_unload(mesh_t*);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -128,7 +128,7 @@ void shader_start(shader_t* shader) {
|
|||
_active = shader;
|
||||
}
|
||||
|
||||
void shader_stop(shader_t* shader) {
|
||||
void shader_stop() {
|
||||
glUseProgram(0);
|
||||
_active = NULL;
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@ GLint shader_attr(const shader_t*, int);
|
|||
|
||||
shader_t* shader_active();
|
||||
void shader_start(shader_t*);
|
||||
void shader_stop(shader_t*);
|
||||
void shader_stop();
|
||||
|
||||
void shader_destroy(shader_t*);
|
||||
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
#version 100
|
||||
precision mediump float;
|
||||
|
||||
//varying vec3 coord;
|
||||
|
||||
void main() {
|
||||
//gl_FragColor = vec4(coord.z, coord.z, coord.z, 1.0);
|
||||
|
||||
float xval = gl_FragCoord.x / 640.0;
|
||||
float yval = gl_FragCoord.y / 480.0;
|
||||
gl_FragColor = vec4(xval, yval, 1.0, 1.0);
|
||||
}
|
|
@ -1,5 +1,16 @@
|
|||
#version 120
|
||||
#version 100
|
||||
precision highp float;
|
||||
|
||||
attribute vec3 vertex;
|
||||
attribute vec2 texuv;
|
||||
attribute vec3 normal;
|
||||
|
||||
uniform mat4 model;
|
||||
uniform mat4 view;
|
||||
uniform mat4 projection;
|
||||
|
||||
void main() {
|
||||
gl_Position = vec4(vec3(0.0), 1.0);
|
||||
gl_Position =
|
||||
projection * view * model *
|
||||
vec4(vertex, 1.0);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue