GameEngine/source/client_render.c

155 lines
6.3 KiB
C

#include <render.h>
RenderCtx r_ctx;
// Possible window flags
/*
FLAG_VSYNC_HINT
FLAG_FULLSCREEN_MODE -> not working properly -> wrong scaling!
FLAG_WINDOW_RESIZABLE
FLAG_WINDOW_UNDECORATED
FLAG_WINDOW_TRANSPARENT
FLAG_WINDOW_HIDDEN
FLAG_WINDOW_MINIMIZED -> Not supported on window creation
FLAG_WINDOW_MAXIMIZED -> Not supported on window creation
FLAG_WINDOW_UNFOCUSED
FLAG_WINDOW_TOPMOST
FLAG_WINDOW_HIGHDPI -> errors after minimize-resize, fb size is recalculated
FLAG_WINDOW_ALWAYS_RUN
FLAG_MSAA_4X_HINT
*/
void LoadPipeline() {
r_ctx.width = 800;
r_ctx.height = 480;
r_ctx.camera3d.position = (Vector3){ 10.0f, 10.0f, 10.0f }; // Camera position
r_ctx.camera3d.target = (Vector3){ 0.0f, 0.0f, 0.0f }; // Camera looking at point
r_ctx.camera3d.up = (Vector3){ 0.0f, 1.0f, 0.0f }; // Camera up vector (rotation towards target)
r_ctx.camera3d.fovy = 45.0f; // Camera field-of-view Y
r_ctx.camera3d.projection = CAMERA_PERSPECTIVE; // Camera projection type
r_ctx.hud_on = true;
r_ctx.debug_on = true;
InitWindow(r_ctx.width, r_ctx.height, "GAME!!");
assert(IsWindowReady());
r_ctx.window = GetWindowHandle();
r_ctx.shader.deferred = LoadShader("source/shader/deferred.vs", "source/shader/deferred.fs");
r_ctx.shader.gbuffer = LoadShader("source/shader/gbuffer.vs", "source/shader/gbuffer.fs");
r_ctx.shader.filter = LoadShader("", "source/shader/Screen_filter.fs");
r_ctx.gbuffer.framebufferId = rlLoadFramebuffer();
assert(r_ctx.gbuffer.framebufferId);
rlEnableFramebuffer(r_ctx.gbuffer.framebufferId);
r_ctx.gbuffer.depth_tex_id = rlLoadTextureDepth(r_ctx.width, r_ctx.height, false);
// If Artefact appear on Normal, may need to change to RL_PIXELFORMAT_UNCOMPRESSED_R32G32B32 and also need to be used in case of anti aliasing (MLAA or SMAA if needed)
r_ctx.gbuffer.normal_tex_id = rlLoadTexture(NULL, r_ctx.width, r_ctx.height, RL_PIXELFORMAT_UNCOMPRESSED_R16G16B16, 1);
// The color in RGB, and the specular strength in the alpha channel
r_ctx.gbuffer.albedoSpec_tex_id = rlLoadTexture(NULL, r_ctx.width, r_ctx.height, RL_PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, 1);
rlActiveDrawBuffers(3);
rlFramebufferAttach(r_ctx.gbuffer.framebufferId, r_ctx.gbuffer.depth_tex_id, RL_ATTACHMENT_DEPTH, RL_ATTACHMENT_TEXTURE2D, 0);
rlFramebufferAttach(r_ctx.gbuffer.framebufferId, r_ctx.gbuffer.normal_tex_id, RL_ATTACHMENT_COLOR_CHANNEL0, RL_ATTACHMENT_TEXTURE2D, 0);
rlFramebufferAttach(r_ctx.gbuffer.framebufferId, r_ctx.gbuffer.albedoSpec_tex_id, RL_ATTACHMENT_COLOR_CHANNEL1, RL_ATTACHMENT_TEXTURE2D, 0);
assert(rlFramebufferComplete(r_ctx.gbuffer.framebufferId));
rlEnableShader(r_ctx.shader.deferred.id);
int texUnitDepth = 0;
int texUnitNormal = 1;
int texUnitAlbedoSpec = 2;
SetShaderValue(r_ctx.shader.deferred, rlGetLocationUniform(r_ctx.shader.deferred.id, "gDepth"), &texUnitDepth, RL_SHADER_UNIFORM_SAMPLER2D);
SetShaderValue(r_ctx.shader.deferred, rlGetLocationUniform(r_ctx.shader.deferred.id, "gNormal"), &texUnitNormal, RL_SHADER_UNIFORM_SAMPLER2D);
SetShaderValue(r_ctx.shader.deferred, rlGetLocationUniform(r_ctx.shader.deferred.id, "gAlbedoSpec"), &texUnitAlbedoSpec, RL_SHADER_UNIFORM_SAMPLER2D);
rlDisableShader();
//now need to set this to things that use this Material, and add light used in the scene.
rlEnableDepthTest();
rlEnableBackfaceCulling();
TraceLog(LOG_INFO, "Render Pipeline Built");
SetTargetFPS(120);//may change
DisableCursor();
}
void UnloadPipeline() {
rlUnloadFramebuffer(r_ctx.gbuffer.framebufferId);
rlUnloadTexture(r_ctx.gbuffer.depth_tex_id);
rlUnloadTexture(r_ctx.gbuffer.normal_tex_id);
rlUnloadTexture(r_ctx.gbuffer.albedoSpec_tex_id);
UnloadShader(r_ctx.shader.deferred);
UnloadShader(r_ctx.shader.gbuffer);
UnloadShader(r_ctx.shader.filter);
CloseWindow();
}
void LoadCameraMode(int mode) {
switch (mode) {
case(0): {
break;
}
default:
break;
}
}
//need to work on a way to structurize my data for the scene to be rendered
void RenderingDeferred3D(const Scene* scene, const ModelRegistry *models, const AnimationRegistry *animations, const TextureRegistry *textures, const FontRegistry *fonts) {
(void)scene;
(void)models;
(void)animations;
(void)textures;
UpdateCamera(&r_ctx.camera3d, CAMERA_FREE);
if (IsKeyPressed(KEY_Z)) r_ctx.camera3d.target = (Vector3){ 0.0f, 0.0f, 0.0f };
BeginDrawing();
ClearBackground(BLACK);
rlEnableDepthMask();
rlEnableFramebuffer(r_ctx.gbuffer.framebufferId);
rlEnableShader(r_ctx.shader.gbuffer.id);
BeginMode3D(r_ctx.camera3d);
//MainGeamoetry;
//for (int i = 0; i < scene->count; i++) {
// RenderEntity *e = &scene->entities[i];
// Model m = models->models[e->modelId];
// switch (e->type) {
// case R_ENTITY_STATIC:
// DrawModel(m, (Vector3){0}, 1.0f, WHITE);
// break;
// case R_ENTITY_ANIMATED:
// UpdateModelAnimation(m, animation->animations[e->data.anim.activeAnim], e->data.anim.time);
// DrawModel(m, (Vector3){0}, 1.0f, WHITE);
// break;
// case R_ENTITY_INSTANCED:
// // Note: Raylib's DrawMeshInstanced handles the instancing buffer
// for (int j = 0; j < m.meshCount; j++) {
// DrawMeshInstanced(m.meshes[j], m.materials[0], e->data.instancing.transforms, e->data.instancing.instanceCount);
// }
// break;
// }
//}
EndMode3D();
rlDisableShader();
rlDisableFramebuffer();
rlDisableDepthMask();//may not be usefull
//rlDisableDepthTest();
//Light Pass and forward pass;
//I should build a shader that take every light in the scene and make a 3D heightmap of lighting then compute it once for all static light allowing to cheat computing everylight
//light could be computed into a scalar field
//Light Pass
BeginMode3D(r_ctx.camera3d);
DrawCube(Vector3Zero(), 1, 1, 1, GREEN);
EndMode3D();
//Screen Filter Pass
//BeginShaderMode(r_ctx.shader.filter);//may be good to have this disabled for accessibility
////DrawTextureRec();
//EndShaderMode();
DrawFPS(10, 10);
DrawTextEx(fonts->font[DENDRITIC_VOLTAGE] , "Hello", (Vector2){40, 40}, 16, 1, RED);
//render ui
EndDrawing();
}