mirror of https://github.com/mode777/rayjs.git
still not working
This commit is contained in:
parent
9b69016ce8
commit
b5c275a9d7
|
@ -11,3 +11,4 @@ controls_test.exe
|
||||||
debug_interpolation.tga
|
debug_interpolation.tga
|
||||||
result.tga
|
result.tga
|
||||||
lightmapper_example
|
lightmapper_example
|
||||||
|
lightmapper_example.exe
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
"embedded_shader.h": "c",
|
"embedded_shader.h": "c",
|
||||||
"common.h": "c",
|
"common.h": "c",
|
||||||
"raylib.h": "c",
|
"raylib.h": "c",
|
||||||
"glad.h": "c"
|
"glad.h": "c",
|
||||||
|
"lightmapper.h": "c"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,757 @@
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "raylib.h"
|
||||||
|
#include "rlgl.h"
|
||||||
|
#define GLAD_MALLOC(sz) malloc(sz)
|
||||||
|
#define GLAD_FREE(sz) free(sz)
|
||||||
|
//#define GLAD_GL_IMPLEMENTATION
|
||||||
|
#include "../thirdparty/raylib/src/external/glad.h"
|
||||||
|
|
||||||
|
#define LIGHTMAPPER_IMPLEMENTATION
|
||||||
|
#define LM_DEBUG_INTERPOLATION
|
||||||
|
#include "lightmapper.h"
|
||||||
|
|
||||||
|
// load shader
|
||||||
|
const char *vp =
|
||||||
|
"#version 150 core\n"
|
||||||
|
"in vec3 a_position;\n"
|
||||||
|
"in vec2 a_texcoord;\n"
|
||||||
|
"uniform mat4 u_view;\n"
|
||||||
|
"uniform mat4 u_projection;\n"
|
||||||
|
"out vec2 v_texcoord;\n"
|
||||||
|
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
"gl_Position = u_projection * (u_view * vec4(a_position, 1.0));\n"
|
||||||
|
"v_texcoord = a_texcoord;\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
const char *fp =
|
||||||
|
"#version 150 core\n"
|
||||||
|
"in vec2 v_texcoord;\n"
|
||||||
|
"uniform sampler2D u_lightmap;\n"
|
||||||
|
"out vec4 o_color;\n"
|
||||||
|
|
||||||
|
"void main()\n"
|
||||||
|
"{\n"
|
||||||
|
"o_color = vec4(texture(u_lightmap, v_texcoord).rgb, gl_FrontFacing ? 1.0 : 0.0);\n"
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
const char *attribs[] =
|
||||||
|
{
|
||||||
|
"a_position",
|
||||||
|
"a_texcoord"
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
// Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
const int screenWidth = 800;
|
||||||
|
const int screenHeight = 450;
|
||||||
|
|
||||||
|
InitWindow(screenWidth, screenHeight, "raylib [models] lightmapping");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Model model = LoadModel("thirdparty/lightmapper/example/gazebo.obj");
|
||||||
|
Shader shader = LoadShaderFromMemory(vp, fp);
|
||||||
|
Texture texture = LoadTextureFromImage(GenImageColor(1,1,BLACK));
|
||||||
|
int u_view = GetShaderLocation(shader, "u_view");
|
||||||
|
int u_projection = GetShaderLocation(shader, "u_projection");
|
||||||
|
int u_lightmap = GetShaderLocation(shader, "u_lightmap");
|
||||||
|
|
||||||
|
|
||||||
|
Vector3 position = { 0.0f, 0.0f, 0.0f };
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
lm_context *ctx = lmCreate(
|
||||||
|
64, // hemisphere resolution (power of two, max=512)
|
||||||
|
0.001f, 100.0f, // zNear, zFar of hemisphere cameras
|
||||||
|
1.0f, 1.0f, 1.0f, // background color (white for ambient occlusion)
|
||||||
|
2, 0.01f, // lightmap interpolation threshold (small differences are interpolated rather than sampled)
|
||||||
|
// check debug_interpolation.tga for an overview of sampled (red) vs interpolated (green) pixels.
|
||||||
|
0.0f); // modifier for camera-to-surface distance for hemisphere rendering.
|
||||||
|
// tweak this to trade-off between interpolated normals quality and other artifacts (see declaration).
|
||||||
|
|
||||||
|
if (!ctx) TraceLog(LOG_ERROR, "Lightmapper not initialized");
|
||||||
|
|
||||||
|
int w = 512;
|
||||||
|
int h = 512;
|
||||||
|
float *data = calloc(w*h*4,sizeof(float));
|
||||||
|
|
||||||
|
lmSetTargetLightmap(ctx, data, w, h, 4);
|
||||||
|
|
||||||
|
Mesh m = model.meshes[0];
|
||||||
|
|
||||||
|
lmSetGeometry(ctx, NULL, // no transformation in this example
|
||||||
|
LM_FLOAT, m.vertices, 0,
|
||||||
|
LM_NONE , NULL, 0,
|
||||||
|
LM_FLOAT, m.texcoords, 0,
|
||||||
|
m.vertexCount, LM_NONE, 0);
|
||||||
|
|
||||||
|
printf("%p\n", m.texcoords);
|
||||||
|
|
||||||
|
int vp[4];
|
||||||
|
Matrix view, projection;
|
||||||
|
double lastUpdateTime = 0.0;
|
||||||
|
|
||||||
|
Mesh mesh = model.meshes[0];
|
||||||
|
//SetTargetFPS(10000);
|
||||||
|
while (lmBegin(ctx, vp, (float*)&view, (float*)&projection))
|
||||||
|
{
|
||||||
|
printf("%d, %d, %d, %d\n", vp[0], vp[1], vp[2], vp[3]);
|
||||||
|
glViewport(vp[0], vp[1], vp[2], vp[3]);
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
|
glUseProgram(shader.id);
|
||||||
|
glUniform1i(u_lightmap, 0);
|
||||||
|
glUniformMatrix4fv(u_projection, 1, GL_FALSE, (float *)&projection);
|
||||||
|
glUniformMatrix4fv(u_view, 1, GL_FALSE, (float *)&view);
|
||||||
|
|
||||||
|
glBindTexture(GL_TEXTURE_2D, texture.id);
|
||||||
|
|
||||||
|
glBindVertexArray(mesh.vaoId);
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, mesh.vertexCount);
|
||||||
|
|
||||||
|
double time = GetTime();
|
||||||
|
if (time - lastUpdateTime > 1.0)
|
||||||
|
{
|
||||||
|
lastUpdateTime = time;
|
||||||
|
printf("\r%6.2f%%", lmProgress(ctx) * 100.0f);
|
||||||
|
fflush(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
lmEnd(ctx);
|
||||||
|
if(WindowShouldClose()) break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// postprocess texture
|
||||||
|
float *temp = calloc(w * h * 4, sizeof(float));
|
||||||
|
for (int i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
lmImageDilate(data, temp, w, h, 4);
|
||||||
|
lmImageDilate(temp, data, w, h, 4);
|
||||||
|
}
|
||||||
|
lmImageSmooth(data, temp, w, h, 4);
|
||||||
|
lmImageDilate(temp, data, w, h, 4);
|
||||||
|
lmImagePower(data, w, h, 4, 1.0f / 2.2f, 0x7); // gamma correct color channels
|
||||||
|
free(temp);
|
||||||
|
|
||||||
|
// save result to a file
|
||||||
|
if (lmImageSaveTGAf("result.tga", data, w, h, 4, 1.0f))
|
||||||
|
printf("Saved result.tga\n");
|
||||||
|
|
||||||
|
rlViewport(0,0, screenWidth, screenHeight);
|
||||||
|
|
||||||
|
|
||||||
|
// Define the camera to look into our 3d world
|
||||||
|
Camera camera = { 0 };
|
||||||
|
camera.position = (Vector3){ 1.0f, 0.5f, 1.0f }; // Camera position
|
||||||
|
camera.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point
|
||||||
|
camera.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
|
||||||
|
camera.fovy = 45.0f; // Camera field-of-view Y
|
||||||
|
camera.projection = CAMERA_PERSPECTIVE; // Camera mode type
|
||||||
|
|
||||||
|
SetTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
|
|
||||||
|
// Main game loop
|
||||||
|
while (!WindowShouldClose()) // Detect window close button or ESC key
|
||||||
|
{
|
||||||
|
// Update
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
//UpdateCamera(&camera, CAMERA_FIRST_PERSON);
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Draw
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
BeginDrawing();
|
||||||
|
|
||||||
|
ClearBackground(RAYWHITE);
|
||||||
|
|
||||||
|
BeginMode3D(camera);
|
||||||
|
|
||||||
|
DrawModel(model, position, 1.0f, WHITE);
|
||||||
|
|
||||||
|
EndMode3D();
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
//----------------------------------------------------------------------------------
|
||||||
|
}
|
||||||
|
|
||||||
|
// De-Initialization
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
//UnloadTexture(texture); // Unload texture
|
||||||
|
UnloadModel(model); // Unload model
|
||||||
|
|
||||||
|
CloseWindow(); // Close window and OpenGL context
|
||||||
|
//--------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
// #define _USE_MATH_DEFINES
|
||||||
|
// #include <stdlib.h>
|
||||||
|
// #include <stdio.h>
|
||||||
|
// #include <math.h>
|
||||||
|
// #include <assert.h>
|
||||||
|
// //#include "glad/glad.h"
|
||||||
|
// #define GLAD_MALLOC(sz) malloc(sz)
|
||||||
|
// #define GLAD_FREE(sz) free(sz)
|
||||||
|
// //#define GLAD_GL_IMPLEMENTATION
|
||||||
|
// #include "../thirdparty/raylib/src/external/glad.h"
|
||||||
|
// #include "GLFW/glfw3.h"
|
||||||
|
// #include "raylib.h"
|
||||||
|
|
||||||
|
// #define LIGHTMAPPER_IMPLEMENTATION
|
||||||
|
// #define LM_DEBUG_INTERPOLATION
|
||||||
|
// #include "lightmapper.h"
|
||||||
|
|
||||||
|
// #ifndef M_PI // even with _USE_MATH_DEFINES not always available
|
||||||
|
// #define M_PI 3.14159265358979323846
|
||||||
|
// #endif
|
||||||
|
|
||||||
|
// typedef struct {
|
||||||
|
// float p[3];
|
||||||
|
// float t[2];
|
||||||
|
// } vertex_t;
|
||||||
|
|
||||||
|
// typedef struct
|
||||||
|
// {
|
||||||
|
// GLuint program;
|
||||||
|
// GLint u_lightmap;
|
||||||
|
// GLint u_projection;
|
||||||
|
// GLint u_view;
|
||||||
|
|
||||||
|
// GLuint lightmap;
|
||||||
|
// int w, h;
|
||||||
|
// Model raylib_model;
|
||||||
|
// GLuint vao, vbo, ibo;
|
||||||
|
// vertex_t *vertices;
|
||||||
|
// unsigned short *indices;
|
||||||
|
// unsigned int vertexCount, indexCount;
|
||||||
|
// } scene_t;
|
||||||
|
|
||||||
|
// static int initScene(scene_t *scene);
|
||||||
|
// static void drawScene(scene_t *scene, float *view, float *projection);
|
||||||
|
// static void destroyScene(scene_t *scene);
|
||||||
|
|
||||||
|
// static int bake(scene_t *scene)
|
||||||
|
// {
|
||||||
|
// lm_context *ctx = lmCreate(
|
||||||
|
// 64, // hemisphere resolution (power of two, max=512)
|
||||||
|
// 0.001f, 100.0f, // zNear, zFar of hemisphere cameras
|
||||||
|
// 1.0f, 1.0f, 1.0f, // background color (white for ambient occlusion)
|
||||||
|
// 2, 0.01f, // lightmap interpolation threshold (small differences are interpolated rather than sampled)
|
||||||
|
// // check debug_interpolation.tga for an overview of sampled (red) vs interpolated (green) pixels.
|
||||||
|
// 0.0f); // modifier for camera-to-surface distance for hemisphere rendering.
|
||||||
|
// // tweak this to trade-off between interpolated normals quality and other artifacts (see declaration).
|
||||||
|
|
||||||
|
// if (!ctx)
|
||||||
|
// {
|
||||||
|
// fprintf(stderr, "Error: Could not initialize lightmapper.\n");
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// int w = scene->w, h = scene->h;
|
||||||
|
// float *data = calloc(w * h * 4, sizeof(float));
|
||||||
|
// lmSetTargetLightmap(ctx, data, w, h, 4);
|
||||||
|
|
||||||
|
// lmSetGeometry(ctx, NULL, // no transformation in this example
|
||||||
|
// LM_FLOAT, (unsigned char*)scene->vertices + offsetof(vertex_t, p), sizeof(vertex_t),
|
||||||
|
// LM_NONE , NULL , 0 , // no interpolated normals in this example
|
||||||
|
// LM_FLOAT, (unsigned char*)scene->vertices + offsetof(vertex_t, t), sizeof(vertex_t),
|
||||||
|
// scene->indexCount, LM_UNSIGNED_SHORT, scene->indices);
|
||||||
|
|
||||||
|
// int vp[4];
|
||||||
|
// float view[16], projection[16];
|
||||||
|
// double lastUpdateTime = 0.0;
|
||||||
|
// while (lmBegin(ctx, vp, view, projection))
|
||||||
|
// {
|
||||||
|
// // render to lightmapper framebuffer
|
||||||
|
// glViewport(vp[0], vp[1], vp[2], vp[3]);
|
||||||
|
// drawScene(scene, view, projection);
|
||||||
|
|
||||||
|
// // display progress every second (printf is expensive)
|
||||||
|
// double time = glfwGetTime();
|
||||||
|
// if (time - lastUpdateTime > 1.0)
|
||||||
|
// {
|
||||||
|
// lastUpdateTime = time;
|
||||||
|
// printf("\r%6.2f%%", lmProgress(ctx) * 100.0f);
|
||||||
|
// fflush(stdout);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// lmEnd(ctx);
|
||||||
|
// }
|
||||||
|
// printf("\rFinished baking %d triangles.\n", scene->indexCount / 3);
|
||||||
|
|
||||||
|
// lmDestroy(ctx);
|
||||||
|
|
||||||
|
// // postprocess texture
|
||||||
|
// float *temp = calloc(w * h * 4, sizeof(float));
|
||||||
|
// for (int i = 0; i < 16; i++)
|
||||||
|
// {
|
||||||
|
// lmImageDilate(data, temp, w, h, 4);
|
||||||
|
// lmImageDilate(temp, data, w, h, 4);
|
||||||
|
// }
|
||||||
|
// lmImageSmooth(data, temp, w, h, 4);
|
||||||
|
// lmImageDilate(temp, data, w, h, 4);
|
||||||
|
// lmImagePower(data, w, h, 4, 1.0f / 2.2f, 0x7); // gamma correct color channels
|
||||||
|
// free(temp);
|
||||||
|
|
||||||
|
// // save result to a file
|
||||||
|
// if (lmImageSaveTGAf("result.tga", data, w, h, 4, 1.0f))
|
||||||
|
// printf("Saved result.tga\n");
|
||||||
|
|
||||||
|
// // upload result
|
||||||
|
// glBindTexture(GL_TEXTURE_2D, scene->lightmap);
|
||||||
|
// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_FLOAT, data);
|
||||||
|
// free(data);
|
||||||
|
|
||||||
|
// return 1;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// static void error_callback(int error, const char *description)
|
||||||
|
// {
|
||||||
|
// fprintf(stderr, "Error: %s\n", description);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// static void fpsCameraViewMatrix(GLFWwindow *window, float *view);
|
||||||
|
// static void perspectiveMatrix(float *out, float fovy, float aspect, float zNear, float zFar);
|
||||||
|
|
||||||
|
// static void mainLoop(GLFWwindow *window, scene_t *scene)
|
||||||
|
// {
|
||||||
|
// glfwPollEvents();
|
||||||
|
// if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS)
|
||||||
|
// bake(scene);
|
||||||
|
|
||||||
|
// int w, h;
|
||||||
|
// glfwGetFramebufferSize(window, &w, &h);
|
||||||
|
// glViewport(0, 0, w, h);
|
||||||
|
|
||||||
|
// // camera for glfw window
|
||||||
|
// float view[16], projection[16];
|
||||||
|
// fpsCameraViewMatrix(window, view);
|
||||||
|
// perspectiveMatrix(projection, 45.0f, (float)w / (float)h, 0.01f, 100.0f);
|
||||||
|
|
||||||
|
// // draw to screen with a blueish sky
|
||||||
|
// glClearColor(0.6f, 0.8f, 1.0f, 1.0f);
|
||||||
|
// glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
// drawScene(scene, view, projection);
|
||||||
|
|
||||||
|
// glfwSwapBuffers(window);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// int main(int argc, char* argv[])
|
||||||
|
// {
|
||||||
|
// glfwSetErrorCallback(error_callback);
|
||||||
|
|
||||||
|
// if (!glfwInit())
|
||||||
|
// {
|
||||||
|
// fprintf(stderr, "Could not initialize GLFW.\n");
|
||||||
|
// return EXIT_FAILURE;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// glfwWindowHint(GLFW_RED_BITS, 8);
|
||||||
|
// glfwWindowHint(GLFW_GREEN_BITS, 8);
|
||||||
|
// glfwWindowHint(GLFW_BLUE_BITS, 8);
|
||||||
|
// glfwWindowHint(GLFW_ALPHA_BITS, 8);
|
||||||
|
// glfwWindowHint(GLFW_DEPTH_BITS, 32);
|
||||||
|
// glfwWindowHint(GLFW_STENCIL_BITS, GLFW_DONT_CARE);
|
||||||
|
// glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||||
|
// glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
|
||||||
|
// glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
||||||
|
// glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||||
|
// glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE);
|
||||||
|
// glfwWindowHint(GLFW_SAMPLES, 4);
|
||||||
|
|
||||||
|
// GLFWwindow *window = glfwCreateWindow(1024, 768, "Lightmapping Example", NULL, NULL);
|
||||||
|
// if (!window)
|
||||||
|
// {
|
||||||
|
// fprintf(stderr, "Could not create window.\n");
|
||||||
|
// glfwTerminate();
|
||||||
|
// return EXIT_FAILURE;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// glfwMakeContextCurrent(window);
|
||||||
|
// gladLoadGL((GLADloadfunc)glfwGetProcAddress);
|
||||||
|
// glfwSwapInterval(1);
|
||||||
|
|
||||||
|
// scene_t scene = {0};
|
||||||
|
// if (!initScene(&scene))
|
||||||
|
// {
|
||||||
|
// fprintf(stderr, "Could not initialize scene.\n");
|
||||||
|
// glfwDestroyWindow(window);
|
||||||
|
// glfwTerminate();
|
||||||
|
// return EXIT_FAILURE;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// printf("Ambient Occlusion Baking Example.\n");
|
||||||
|
// printf("Use your mouse and the W, A, S, D, E, Q keys to navigate.\n");
|
||||||
|
// printf("Press SPACE to start baking one light bounce!\n");
|
||||||
|
// printf("This will take a few seconds and bake a lightmap illuminated by:\n");
|
||||||
|
// printf("1. The mesh itself (initially black)\n");
|
||||||
|
// printf("2. A white sky (1.0f, 1.0f, 1.0f)\n");
|
||||||
|
|
||||||
|
// while (!glfwWindowShouldClose(window))
|
||||||
|
// {
|
||||||
|
// mainLoop(window, &scene);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// destroyScene(&scene);
|
||||||
|
// glfwDestroyWindow(window);
|
||||||
|
// glfwTerminate();
|
||||||
|
// return EXIT_SUCCESS;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // helpers ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// static int loadSimpleObjFile(const char *filename, vertex_t **vertices, unsigned int *vertexCount, unsigned short **indices, unsigned int *indexCount);
|
||||||
|
// static GLuint loadProgram(const char *vp, const char *fp, const char **attributes, int attributeCount);
|
||||||
|
|
||||||
|
// static int initScene(scene_t *scene)
|
||||||
|
// {
|
||||||
|
// // load mesh
|
||||||
|
// scene->raylib_model = LoadModel("thirdparty/lightmapper/example/gazebo.obj");
|
||||||
|
// //scene->vertices = myModel.meshes[0].
|
||||||
|
// if (!loadSimpleObjFile("thirdparty/lightmapper/example/gazebo.obj", &scene->vertices, &scene->vertexCount, &scene->indices, &scene->indexCount))
|
||||||
|
// {
|
||||||
|
// fprintf(stderr, "Error loading obj file\n");
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// glGenVertexArrays(1, &scene->vao);
|
||||||
|
// glBindVertexArray(scene->vao);
|
||||||
|
|
||||||
|
// glGenBuffers(1, &scene->vbo);
|
||||||
|
// glBindBuffer(GL_ARRAY_BUFFER, scene->vbo);
|
||||||
|
// glBufferData(GL_ARRAY_BUFFER, scene->vertexCount * sizeof(vertex_t), scene->vertices, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
// glGenBuffers(1, &scene->ibo);
|
||||||
|
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, scene->ibo);
|
||||||
|
// glBufferData(GL_ELEMENT_ARRAY_BUFFER, scene->indexCount * sizeof(unsigned short), scene->indices, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
// glEnableVertexAttribArray(0);
|
||||||
|
// glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (void*)offsetof(vertex_t, p));
|
||||||
|
// glEnableVertexAttribArray(1);
|
||||||
|
// glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(vertex_t), (void*)offsetof(vertex_t, t));
|
||||||
|
|
||||||
|
// // create lightmap texture
|
||||||
|
// scene->w = 654;
|
||||||
|
// scene->h = 654;
|
||||||
|
// glGenTextures(1, &scene->lightmap);
|
||||||
|
// glBindTexture(GL_TEXTURE_2D, scene->lightmap);
|
||||||
|
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
// unsigned char emissive[] = { 0, 0, 0, 255 };
|
||||||
|
// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, emissive);
|
||||||
|
|
||||||
|
// // load shader
|
||||||
|
// const char *vp =
|
||||||
|
// "#version 150 core\n"
|
||||||
|
// "in vec3 a_position;\n"
|
||||||
|
// "in vec2 a_texcoord;\n"
|
||||||
|
// "uniform mat4 u_view;\n"
|
||||||
|
// "uniform mat4 u_projection;\n"
|
||||||
|
// "out vec2 v_texcoord;\n"
|
||||||
|
|
||||||
|
// "void main()\n"
|
||||||
|
// "{\n"
|
||||||
|
// "gl_Position = u_projection * (u_view * vec4(a_position, 1.0));\n"
|
||||||
|
// "v_texcoord = a_texcoord;\n"
|
||||||
|
// "}\n";
|
||||||
|
|
||||||
|
// const char *fp =
|
||||||
|
// "#version 150 core\n"
|
||||||
|
// "in vec2 v_texcoord;\n"
|
||||||
|
// "uniform sampler2D u_lightmap;\n"
|
||||||
|
// "out vec4 o_color;\n"
|
||||||
|
|
||||||
|
// "void main()\n"
|
||||||
|
// "{\n"
|
||||||
|
// "o_color = vec4(texture(u_lightmap, v_texcoord).rgb, gl_FrontFacing ? 1.0 : 0.0);\n"
|
||||||
|
// "}\n";
|
||||||
|
|
||||||
|
// const char *attribs[] =
|
||||||
|
// {
|
||||||
|
// "a_position",
|
||||||
|
// "a_texcoord"
|
||||||
|
// };
|
||||||
|
|
||||||
|
// scene->program = loadProgram(vp, fp, attribs, 2);
|
||||||
|
// if (!scene->program)
|
||||||
|
// {
|
||||||
|
// fprintf(stderr, "Error loading shader\n");
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
// scene->u_view = glGetUniformLocation(scene->program, "u_view");
|
||||||
|
// scene->u_projection = glGetUniformLocation(scene->program, "u_projection");
|
||||||
|
// scene->u_lightmap = glGetUniformLocation(scene->program, "u_lightmap");
|
||||||
|
|
||||||
|
// return 1;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// static void drawScene(scene_t *scene, float *view, float *projection)
|
||||||
|
// {
|
||||||
|
// glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
|
// glUseProgram(scene->program);
|
||||||
|
// glUniform1i(scene->u_lightmap, 0);
|
||||||
|
// glUniformMatrix4fv(scene->u_projection, 1, GL_FALSE, projection);
|
||||||
|
// glUniformMatrix4fv(scene->u_view, 1, GL_FALSE, view);
|
||||||
|
|
||||||
|
// glBindTexture(GL_TEXTURE_2D, scene->lightmap);
|
||||||
|
|
||||||
|
// glBindVertexArray(scene->vao);
|
||||||
|
// glDrawElements(GL_TRIANGLES, scene->indexCount, GL_UNSIGNED_SHORT, 0);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// static void destroyScene(scene_t *scene)
|
||||||
|
// {
|
||||||
|
// free(scene->vertices);
|
||||||
|
// free(scene->indices);
|
||||||
|
// glDeleteVertexArrays(1, &scene->vao);
|
||||||
|
// glDeleteBuffers(1, &scene->vbo);
|
||||||
|
// glDeleteBuffers(1, &scene->ibo);
|
||||||
|
// glDeleteTextures(1, &scene->lightmap);
|
||||||
|
// glDeleteProgram(scene->program);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// static int loadSimpleObjFile(const char *filename, vertex_t **vertices, unsigned int *vertexCount, unsigned short **indices, unsigned int *indexCount)
|
||||||
|
// {
|
||||||
|
// FILE *file = fopen(filename, "rt");
|
||||||
|
// if (!file)
|
||||||
|
// return 0;
|
||||||
|
// char line[1024];
|
||||||
|
|
||||||
|
// // first pass
|
||||||
|
// unsigned int np = 0, nn = 0, nt = 0, nf = 0;
|
||||||
|
// while (!feof(file))
|
||||||
|
// {
|
||||||
|
// fgets(line, 1024, file);
|
||||||
|
// if (line[0] == '#') continue;
|
||||||
|
// if (line[0] == 'v')
|
||||||
|
// {
|
||||||
|
// if (line[1] == ' ') { np++; continue; }
|
||||||
|
// if (line[1] == 'n') { nn++; continue; }
|
||||||
|
// if (line[1] == 't') { nt++; continue; }
|
||||||
|
// assert(!"unknown vertex attribute");
|
||||||
|
// }
|
||||||
|
// if (line[0] == 'f') { nf++; continue; }
|
||||||
|
// assert(!"unknown identifier");
|
||||||
|
// }
|
||||||
|
// assert(np && np == nn && np == nt && nf); // only supports obj files without separately indexed vertex attributes
|
||||||
|
|
||||||
|
// // allocate memory
|
||||||
|
// *vertexCount = np;
|
||||||
|
// *vertices = calloc(np, sizeof(vertex_t));
|
||||||
|
// *indexCount = nf * 3;
|
||||||
|
// *indices = calloc(nf * 3, sizeof(unsigned short));
|
||||||
|
|
||||||
|
// // second pass
|
||||||
|
// fseek(file, 0, SEEK_SET);
|
||||||
|
// unsigned int cp = 0, cn = 0, ct = 0, cf = 0;
|
||||||
|
// while (!feof(file))
|
||||||
|
// {
|
||||||
|
// fgets(line, 1024, file);
|
||||||
|
// if (line[0] == '#') continue;
|
||||||
|
// if (line[0] == 'v')
|
||||||
|
// {
|
||||||
|
// if (line[1] == ' ') { float *p = (*vertices)[cp++].p; char *e1, *e2; p[0] = (float)strtod(line + 2, &e1); p[1] = (float)strtod(e1, &e2); p[2] = (float)strtod(e2, 0); continue; }
|
||||||
|
// if (line[1] == 'n') { /*float *n = (*vertices)[cn++].n; char *e1, *e2; n[0] = (float)strtod(line + 3, &e1); n[1] = (float)strtod(e1, &e2); n[2] = (float)strtod(e2, 0);*/ continue; } // no normals needed
|
||||||
|
// if (line[1] == 't') { float *t = (*vertices)[ct++].t; char *e1; t[0] = (float)strtod(line + 3, &e1); t[1] = (float)strtod(e1, 0); continue; }
|
||||||
|
// assert(!"unknown vertex attribute");
|
||||||
|
// }
|
||||||
|
// if (line[0] == 'f')
|
||||||
|
// {
|
||||||
|
// unsigned short *tri = (*indices) + cf;
|
||||||
|
// cf += 3;
|
||||||
|
// char *e1, *e2, *e3 = line + 1;
|
||||||
|
// for (int i = 0; i < 3; i++)
|
||||||
|
// {
|
||||||
|
// unsigned long pi = strtoul(e3 + 1, &e1, 10);
|
||||||
|
// assert(e1[0] == '/');
|
||||||
|
// unsigned long ti = strtoul(e1 + 1, &e2, 10);
|
||||||
|
// assert(e2[0] == '/');
|
||||||
|
// unsigned long ni = strtoul(e2 + 1, &e3, 10);
|
||||||
|
// assert(pi == ti && pi == ni);
|
||||||
|
// tri[i] = (unsigned short)(pi - 1);
|
||||||
|
// }
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
// assert(!"unknown identifier");
|
||||||
|
// }
|
||||||
|
|
||||||
|
// fclose(file);
|
||||||
|
// return 1;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// static GLuint loadShader(GLenum type, const char *source)
|
||||||
|
// {
|
||||||
|
// GLuint shader = glCreateShader(type);
|
||||||
|
// if (shader == 0)
|
||||||
|
// {
|
||||||
|
// fprintf(stderr, "Could not create shader!\n");
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
// glShaderSource(shader, 1, &source, NULL);
|
||||||
|
// glCompileShader(shader);
|
||||||
|
// GLint compiled;
|
||||||
|
// glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
|
||||||
|
// if (!compiled)
|
||||||
|
// {
|
||||||
|
// fprintf(stderr, "Could not compile shader!\n");
|
||||||
|
// GLint infoLen = 0;
|
||||||
|
// glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen);
|
||||||
|
// if (infoLen)
|
||||||
|
// {
|
||||||
|
// char* infoLog = (char*)malloc(infoLen);
|
||||||
|
// glGetShaderInfoLog(shader, infoLen, NULL, infoLog);
|
||||||
|
// fprintf(stderr, "%s\n", infoLog);
|
||||||
|
// free(infoLog);
|
||||||
|
// }
|
||||||
|
// glDeleteShader(shader);
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
// return shader;
|
||||||
|
// }
|
||||||
|
// static GLuint loadProgram(const char *vp, const char *fp, const char **attributes, int attributeCount)
|
||||||
|
// {
|
||||||
|
// GLuint vertexShader = loadShader(GL_VERTEX_SHADER, vp);
|
||||||
|
// if (!vertexShader)
|
||||||
|
// return 0;
|
||||||
|
// GLuint fragmentShader = loadShader(GL_FRAGMENT_SHADER, fp);
|
||||||
|
// if (!fragmentShader)
|
||||||
|
// {
|
||||||
|
// glDeleteShader(vertexShader);
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// GLuint program = glCreateProgram();
|
||||||
|
// if (program == 0)
|
||||||
|
// {
|
||||||
|
// fprintf(stderr, "Could not create program!\n");
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
// glAttachShader(program, vertexShader);
|
||||||
|
// glAttachShader(program, fragmentShader);
|
||||||
|
|
||||||
|
// for (int i = 0; i < attributeCount; i++)
|
||||||
|
// glBindAttribLocation(program, i, attributes[i]);
|
||||||
|
|
||||||
|
// glLinkProgram(program);
|
||||||
|
// glDeleteShader(vertexShader);
|
||||||
|
// glDeleteShader(fragmentShader);
|
||||||
|
// GLint linked;
|
||||||
|
// glGetProgramiv(program, GL_LINK_STATUS, &linked);
|
||||||
|
// if (!linked)
|
||||||
|
// {
|
||||||
|
// fprintf(stderr, "Could not link program!\n");
|
||||||
|
// GLint infoLen = 0;
|
||||||
|
// glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLen);
|
||||||
|
// if (infoLen)
|
||||||
|
// {
|
||||||
|
// char* infoLog = (char*)malloc(sizeof(char) * infoLen);
|
||||||
|
// glGetProgramInfoLog(program, infoLen, NULL, infoLog);
|
||||||
|
// fprintf(stderr, "%s\n", infoLog);
|
||||||
|
// free(infoLog);
|
||||||
|
// }
|
||||||
|
// glDeleteProgram(program);
|
||||||
|
// return 0;
|
||||||
|
// }
|
||||||
|
// return program;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// static void multiplyMatrices(float *out, float *a, float *b)
|
||||||
|
// {
|
||||||
|
// for (int y = 0; y < 4; y++)
|
||||||
|
// for (int x = 0; x < 4; x++)
|
||||||
|
// out[y * 4 + x] = a[x] * b[y * 4] + a[4 + x] * b[y * 4 + 1] + a[8 + x] * b[y * 4 + 2] + a[12 + x] * b[y * 4 + 3];
|
||||||
|
// }
|
||||||
|
// static void translationMatrix(float *out, float x, float y, float z)
|
||||||
|
// {
|
||||||
|
// out[ 0] = 1.0f; out[ 1] = 0.0f; out[ 2] = 0.0f; out[ 3] = 0.0f;
|
||||||
|
// out[ 4] = 0.0f; out[ 5] = 1.0f; out[ 6] = 0.0f; out[ 7] = 0.0f;
|
||||||
|
// out[ 8] = 0.0f; out[ 9] = 0.0f; out[10] = 1.0f; out[11] = 0.0f;
|
||||||
|
// out[12] = x; out[13] = y; out[14] = z; out[15] = 1.0f;
|
||||||
|
// }
|
||||||
|
// static void rotationMatrix(float *out, float angle, float x, float y, float z)
|
||||||
|
// {
|
||||||
|
// angle *= (float)M_PI / 180.0f;
|
||||||
|
// float c = cosf(angle), s = sinf(angle), c2 = 1.0f - c;
|
||||||
|
// out[ 0] = x*x*c2 + c; out[ 1] = y*x*c2 + z*s; out[ 2] = x*z*c2 - y*s; out[ 3] = 0.0f;
|
||||||
|
// out[ 4] = x*y*c2 - z*s; out[ 5] = y*y*c2 + c; out[ 6] = y*z*c2 + x*s; out[ 7] = 0.0f;
|
||||||
|
// out[ 8] = x*z*c2 + y*s; out[ 9] = y*z*c2 - x*s; out[10] = z*z*c2 + c; out[11] = 0.0f;
|
||||||
|
// out[12] = 0.0f; out[13] = 0.0f; out[14] = 0.0f; out[15] = 1.0f;
|
||||||
|
// }
|
||||||
|
// static void transformPosition(float *out, float *m, float *p)
|
||||||
|
// {
|
||||||
|
// float d = 1.0f / (m[3] * p[0] + m[7] * p[1] + m[11] * p[2] + m[15]);
|
||||||
|
// out[2] = d * (m[2] * p[0] + m[6] * p[1] + m[10] * p[2] + m[14]);
|
||||||
|
// out[1] = d * (m[1] * p[0] + m[5] * p[1] + m[ 9] * p[2] + m[13]);
|
||||||
|
// out[0] = d * (m[0] * p[0] + m[4] * p[1] + m[ 8] * p[2] + m[12]);
|
||||||
|
// }
|
||||||
|
// static void transposeMatrix(float *out, float *m)
|
||||||
|
// {
|
||||||
|
// out[ 0] = m[0]; out[ 1] = m[4]; out[ 2] = m[ 8]; out[ 3] = m[12];
|
||||||
|
// out[ 4] = m[1]; out[ 5] = m[5]; out[ 6] = m[ 9]; out[ 7] = m[13];
|
||||||
|
// out[ 8] = m[2]; out[ 9] = m[6]; out[10] = m[10]; out[11] = m[14];
|
||||||
|
// out[12] = m[3]; out[13] = m[7]; out[14] = m[11]; out[15] = m[15];
|
||||||
|
// }
|
||||||
|
// static void perspectiveMatrix(float *out, float fovy, float aspect, float zNear, float zFar)
|
||||||
|
// {
|
||||||
|
// float f = 1.0f / tanf(fovy * (float)M_PI / 360.0f);
|
||||||
|
// float izFN = 1.0f / (zNear - zFar);
|
||||||
|
// out[ 0] = f / aspect; out[ 1] = 0.0f; out[ 2] = 0.0f; out[ 3] = 0.0f;
|
||||||
|
// out[ 4] = 0.0f; out[ 5] = f; out[ 6] = 0.0f; out[ 7] = 0.0f;
|
||||||
|
// out[ 8] = 0.0f; out[ 9] = 0.0f; out[10] = (zFar + zNear) * izFN; out[11] = -1.0f;
|
||||||
|
// out[12] = 0.0f; out[13] = 0.0f; out[14] = 2.0f * zFar * zNear * izFN; out[15] = 0.0f;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// static void fpsCameraViewMatrix(GLFWwindow *window, float *view)
|
||||||
|
// {
|
||||||
|
// // initial camera config
|
||||||
|
// static float position[] = { 0.0f, 0.3f, 1.5f };
|
||||||
|
// static float rotation[] = { 0.0f, 0.0f };
|
||||||
|
|
||||||
|
// // mouse look
|
||||||
|
// static double lastMouse[] = { 0.0, 0.0 };
|
||||||
|
// double mouse[2];
|
||||||
|
// glfwGetCursorPos(window, &mouse[0], &mouse[1]);
|
||||||
|
// if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS)
|
||||||
|
// {
|
||||||
|
// rotation[0] += (float)(mouse[1] - lastMouse[1]) * -0.2f;
|
||||||
|
// rotation[1] += (float)(mouse[0] - lastMouse[0]) * -0.2f;
|
||||||
|
// }
|
||||||
|
// lastMouse[0] = mouse[0];
|
||||||
|
// lastMouse[1] = mouse[1];
|
||||||
|
|
||||||
|
// float rotationY[16], rotationX[16], rotationYX[16];
|
||||||
|
// rotationMatrix(rotationX, rotation[0], 1.0f, 0.0f, 0.0f);
|
||||||
|
// rotationMatrix(rotationY, rotation[1], 0.0f, 1.0f, 0.0f);
|
||||||
|
// multiplyMatrices(rotationYX, rotationY, rotationX);
|
||||||
|
|
||||||
|
// // keyboard movement (WSADEQ)
|
||||||
|
// float speed = (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) ? 0.1f : 0.01f;
|
||||||
|
// float movement[3] = {0};
|
||||||
|
// if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) movement[2] -= speed;
|
||||||
|
// if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) movement[2] += speed;
|
||||||
|
// if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) movement[0] -= speed;
|
||||||
|
// if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) movement[0] += speed;
|
||||||
|
// if (glfwGetKey(window, GLFW_KEY_E) == GLFW_PRESS) movement[1] -= speed;
|
||||||
|
// if (glfwGetKey(window, GLFW_KEY_Q) == GLFW_PRESS) movement[1] += speed;
|
||||||
|
|
||||||
|
// float worldMovement[3];
|
||||||
|
// transformPosition(worldMovement, rotationYX, movement);
|
||||||
|
// position[0] += worldMovement[0];
|
||||||
|
// position[1] += worldMovement[1];
|
||||||
|
// position[2] += worldMovement[2];
|
||||||
|
|
||||||
|
// // construct view matrix
|
||||||
|
// float inverseRotation[16], inverseTranslation[16];
|
||||||
|
// transposeMatrix(inverseRotation, rotationYX);
|
||||||
|
// translationMatrix(inverseTranslation, -position[0], -position[1], -position[2]);
|
||||||
|
// multiplyMatrices(view, inverseRotation, inverseTranslation); // = inverse(translation(position) * rotationYX);
|
||||||
|
// }
|
Loading…
Reference in New Issue