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}
|
${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
|
#TODO replace this with something that runs on build
|
||||||
file(COPY src/data DESTINATION ./)
|
#file(COPY src/data DESTINATION ./)
|
||||||
file(COPY src/shaders DESTINATION ./)
|
#file(COPY src/shaders DESTINATION ./)
|
||||||
|
|
||||||
add_executable(rbm_gen rbm/main.c)
|
add_executable(rbm_gen rbm/main.c)
|
|
@ -206,6 +206,11 @@ int main(int argc, char* argv[]) {
|
||||||
|
|
||||||
fclose(fpi);
|
fclose(fpi);
|
||||||
|
|
||||||
|
if(face_cnt == 0) {
|
||||||
|
printf("OBJ file must have faces!");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
uint8_t magic[] = {0xDE, 0xAF, 0xB0, 0x0B};
|
uint8_t magic[] = {0xDE, 0xAF, 0xB0, 0x0B};
|
||||||
fwrite(magic, 1, 4, fpo);
|
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);
|
size = ftell(fp);
|
||||||
rewind(fp);
|
rewind(fp);
|
||||||
|
|
||||||
content = malloc(sizeof(char) * size);
|
content = malloc(sizeof(char) * size + 1);
|
||||||
if(content == NULL)
|
if(content == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
content[size] = '\0';
|
||||||
fread(content, 1, size, fp);
|
fread(content, 1, size, fp);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,8 @@
|
||||||
#include "koa/thread.h"
|
#include "koa/thread.h"
|
||||||
#include "koa/time.h"
|
#include "koa/time.h"
|
||||||
|
|
||||||
#define __STDERR err_ptr()
|
//#define __STDERR err_ptr()
|
||||||
|
#define __STDERR stdout
|
||||||
|
|
||||||
FILE* err_ptr(void);
|
FILE* err_ptr(void);
|
||||||
void err_out(const char*);
|
void err_out(const char*);
|
||||||
|
|
118
src/main.c
118
src/main.c
|
@ -5,9 +5,11 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <cglm/cglm.h>
|
||||||
|
|
||||||
#include "koa/file.h"
|
#include "koa/file.h"
|
||||||
|
#include "okuu/mesh.h"
|
||||||
|
#include "okuu/shader.h"
|
||||||
|
|
||||||
#define WINDOW_WIDTH 640
|
#define WINDOW_WIDTH 640
|
||||||
#define WINDOW_HEIGHT 480
|
#define WINDOW_HEIGHT 480
|
||||||
|
@ -16,12 +18,99 @@ struct {
|
||||||
SDL_Window* window;
|
SDL_Window* window;
|
||||||
SDL_GLContext ctx;
|
SDL_GLContext ctx;
|
||||||
int mode, running;
|
int mode, running;
|
||||||
|
|
||||||
|
mesh_t* monkey;
|
||||||
} _g;
|
} _g;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
shader_t* shader;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
DEF_MODEL,
|
||||||
|
DEF_VIEW,
|
||||||
|
DEF_PROJ
|
||||||
|
};
|
||||||
|
} _s_def;
|
||||||
|
|
||||||
int init();
|
int init();
|
||||||
void deinit();
|
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() {
|
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;
|
SDL_Event ev;
|
||||||
while(SDL_PollEvent(&ev)) {
|
while(SDL_PollEvent(&ev)) {
|
||||||
if(ev.type == SDL_KEYDOWN) {
|
if(ev.type == SDL_KEYDOWN) {
|
||||||
|
@ -34,8 +123,8 @@ void run() {
|
||||||
SDL_SetWindowFullscreen(
|
SDL_SetWindowFullscreen(
|
||||||
_g.window,
|
_g.window,
|
||||||
_g.mode == 0
|
_g.mode == 0
|
||||||
? 0
|
? 0
|
||||||
: SDL_WINDOW_FULLSCREEN
|
: SDL_WINDOW_FULLSCREEN
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -43,24 +132,6 @@ void run() {
|
||||||
_g.running = 0;
|
_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() {
|
int init() {
|
||||||
|
@ -89,6 +160,11 @@ int init() {
|
||||||
return -4;
|
return -4;
|
||||||
|
|
||||||
SDL_GL_SetSwapInterval(1);
|
SDL_GL_SetSwapInterval(1);
|
||||||
|
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
glDepthFunc(GL_LESS);
|
||||||
|
|
||||||
_g.mode = 0;
|
_g.mode = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
247
src/okuu/mesh.c
247
src/okuu/mesh.c
|
@ -1,15 +1,252 @@
|
||||||
#include "mesh.h"
|
#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) {
|
mesh_t* mesh_load(const char* file) {
|
||||||
FILE* fp = fopen(file, "rb");
|
FILE* fp = fopen(file, "rb");
|
||||||
if(fp == NULL)
|
if(fp == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
enum { VERTEX_CNT = 0, NORMAL_CNT, TEX_CNT, FACE_CNT };
|
enum { VERT_CNT = 0, TEX_CNT, NORM_CNT, FACE_CNT };
|
||||||
int counts[4] = {0, 0, 0, 0};
|
uint32_t counts[4] = { 0 };
|
||||||
char line[1024];
|
|
||||||
|
|
||||||
for(;;) {
|
const uint8_t magic[] = {0xDE, 0xAF, 0xB0, 0x0B};
|
||||||
fgets(line, 1024, fp);
|
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
|
#ifndef OKUU_MESH_H
|
||||||
#define 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 <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "koa/etc.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
GLuint buffers[3], vao;
|
||||||
|
uint32_t tri_cnt;
|
||||||
} mesh_t;
|
} mesh_t;
|
||||||
|
|
||||||
mesh_t* mesh_load(const char*);
|
mesh_t* mesh_load(const char*);
|
||||||
|
|
||||||
|
void mesh_bind(mesh_t*);
|
||||||
|
void mesh_render(mesh_t*);
|
||||||
|
void mesh_unbind();
|
||||||
|
|
||||||
void mesh_unload(mesh_t*);
|
void mesh_unload(mesh_t*);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -128,7 +128,7 @@ void shader_start(shader_t* shader) {
|
||||||
_active = shader;
|
_active = shader;
|
||||||
}
|
}
|
||||||
|
|
||||||
void shader_stop(shader_t* shader) {
|
void shader_stop() {
|
||||||
glUseProgram(0);
|
glUseProgram(0);
|
||||||
_active = NULL;
|
_active = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ GLint shader_attr(const shader_t*, int);
|
||||||
|
|
||||||
shader_t* shader_active();
|
shader_t* shader_active();
|
||||||
void shader_start(shader_t*);
|
void shader_start(shader_t*);
|
||||||
void shader_stop(shader_t*);
|
void shader_stop();
|
||||||
|
|
||||||
void shader_destroy(shader_t*);
|
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() {
|
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