draw: draw_distance for 3d spaces, proper positioning of skybox according to it, scenery demo on circle rasters

This commit is contained in:
veclavtalica
2025-02-26 15:53:59 +03:00
parent 23fbd45564
commit 8c0f43ec34
9 changed files with 123 additions and 80 deletions

View File

@ -20,6 +20,7 @@ DeferredCommand *deferred_commands;
/* TODO: with buffered render, don't we use camera of wrong frame right now ? */
Matrix4 camera_projection_matrix;
Matrix4 camera_look_at_matrix;
float camera_far_z;
float camera_2d_rotation;
Vec2 camera_2d_position;
@ -36,7 +37,7 @@ static void reset_camera_2d(void) {
void render_clear(void) {
draw_camera((Vec3){0, 0, 0}, (Vec3){0, 0, 1}, (Vec3){0, 1, 0}, 1.57079632679f, 1);
draw_camera((Vec3){0, 0, 0}, (Vec3){0, 0, 1}, (Vec3){0, 1, 0}, 1.57079632679f, 1, 100);
reset_camera_2d();
text_cache_reset_arena(&ctx.text_cache);
@ -423,7 +424,7 @@ TWN_API void draw_camera_2d(Vec2 position,
}
/* TODO: check for NaNs and alike */
void draw_camera(Vec3 position, Vec3 direction, Vec3 up, float fov, float zoom) {
void draw_camera(Vec3 position, Vec3 direction, Vec3 up, float fov, float zoom, float draw_distance) {
bool const orthographic = fabsf(0.0f - fov) < 0.00001f;
if (!orthographic && fov >= (float)(M_PI))
log_warn("Invalid fov given (%f)", (double)fov);
@ -437,6 +438,7 @@ void draw_camera(Vec3 position, Vec3 direction, Vec3 up, float fov, float zoom)
(Vec2){ 1/-zoom, 1/zoom },
(Vec2){ 1/zoom, 1/-zoom }
},
.far_z = draw_distance
};
if (!orthographic)
@ -444,6 +446,8 @@ void draw_camera(Vec3 position, Vec3 direction, Vec3 up, float fov, float zoom)
else
camera_projection_matrix = camera_orthographic(&camera);
camera_far_z = draw_distance;
camera_look_at_matrix = camera_look_at(&camera);
}
@ -455,7 +459,8 @@ DrawCameraFromPrincipalAxesResult draw_camera_from_principal_axes(Vec3 position,
float pitch,
float yaw,
float fov,
float zoom)
float zoom,
float draw_distance)
{
bool const orthographic = fabsf(0.0f - fov) < 0.00001f;
if (!orthographic && fov >= (float)(M_PI))
@ -476,7 +481,7 @@ DrawCameraFromPrincipalAxesResult draw_camera_from_principal_axes(Vec3 position,
Vec3 const up = (Vec3){0, 1, 0};
draw_camera(position, direction, up, fov, zoom);
draw_camera(position, direction, up, fov, zoom, draw_distance);
return (DrawCameraFromPrincipalAxesResult) {
.direction = direction,

View File

@ -16,6 +16,7 @@
extern Matrix4 camera_projection_matrix;
extern Matrix4 camera_look_at_matrix;
extern float camera_far_z;
extern float camera_2d_rotation;
extern Vec2 camera_2d_position;

View File

@ -441,66 +441,68 @@ void finally_render_skybox(DeferredCommandDrawSkybox command) {
glEnable(GL_DEPTH_CLAMP);
#endif
float const d = camera_far_z / sqrtf(3);
glBegin(GL_QUADS); {
/* up */
glTexCoord3f(50.f, 50.f, 50.f);
glVertex3f(50.f, 50.f, 50.f);
glTexCoord3f(-50.f, 50.f, 50.f);
glVertex3f(-50.f, 50.f, 50.f);
glTexCoord3f(-50.f, 50.f, -50.f);
glVertex3f(-50.f, 50.f, -50.f);
glTexCoord3f(50.f, 50.f, -50.f);
glVertex3f(50.f, 50.f, -50.f);
glTexCoord3f(d, d, d);
glVertex3f(d, d, d);
glTexCoord3f(-d, d, d);
glVertex3f(-d, d, d);
glTexCoord3f(-d, d, -d);
glVertex3f(-d, d, -d);
glTexCoord3f(d, d, -d);
glVertex3f(d, d, -d);
/* down */
glTexCoord3f(50.f, -50.f, 50.f);
glVertex3f(50.f, -50.f, 50.f);
glTexCoord3f(50.f, -50.f, -50.f);
glVertex3f(50.f, -50.f, -50.f);
glTexCoord3f(-50.f, -50.f, -50.f);
glVertex3f(-50.f, -50.f, -50.f);
glTexCoord3f(-50.f, -50.f, 50.f);
glVertex3f(-50.f, -50.f, 50.f);
glTexCoord3f(d, -d, d);
glVertex3f(d, -d, d);
glTexCoord3f(d, -d, -d);
glVertex3f(d, -d, -d);
glTexCoord3f(-d, -d, -d);
glVertex3f(-d, -d, -d);
glTexCoord3f(-d, -d, d);
glVertex3f(-d, -d, d);
/* east */
glTexCoord3f(50.f, -50.f, 50.f);
glVertex3f(50.f, -50.f, 50.f);
glTexCoord3f(50.f, 50.f, 50.f);
glVertex3f(50.f, 50.f, 50.f);
glTexCoord3f(50.f, 50.f, -50.f);
glVertex3f(50.f, 50.f, -50.f);
glTexCoord3f(50.f, -50.f, -50.f);
glVertex3f(50.f, -50.f, -50.f);
glTexCoord3f(d, -d, d);
glVertex3f(d, -d, d);
glTexCoord3f(d, d, d);
glVertex3f(d, d, d);
glTexCoord3f(d, d, -d);
glVertex3f(d, d, -d);
glTexCoord3f(d, -d, -d);
glVertex3f(d, -d, -d);
/* west */
glTexCoord3f(-50.f, -50.f, 50.f);
glVertex3f(-50.f, -50.f, 50.f);
glTexCoord3f(-50.f, -50.f, -50.f);
glVertex3f(-50.f, -50.f, -50.f);
glTexCoord3f(-50.f, 50.f, -50.f);
glVertex3f(-50.f, 50.f, -50.f);
glTexCoord3f(-50.f, 50.f, 50.f);
glVertex3f(-50.f, 50.f, 50.f);
glTexCoord3f(-d, -d, d);
glVertex3f(-d, -d, d);
glTexCoord3f(-d, -d, -d);
glVertex3f(-d, -d, -d);
glTexCoord3f(-d, d, -d);
glVertex3f(-d, d, -d);
glTexCoord3f(-d, d, d);
glVertex3f(-d, d, d);
/* north */
glTexCoord3f(-50.f, -50.f, 50.f);
glVertex3f(-50.f, -50.f, 50.f);
glTexCoord3f(-50.f, 50.f, 50.f);
glVertex3f(-50.f, 50.f, 50.f);
glTexCoord3f(50.f, 50.f, 50.f);
glVertex3f(50.f, 50.f, 50.f);
glTexCoord3f(50.f, -50.f, 50.f);
glVertex3f(50.f, -50.f, 50.f);
glTexCoord3f(-d, -d, d);
glVertex3f(-d, -d, d);
glTexCoord3f(-d, d, d);
glVertex3f(-d, d, d);
glTexCoord3f(d, d, d);
glVertex3f(d, d, d);
glTexCoord3f(d, -d, d);
glVertex3f(d, -d, d);
/* south */
glTexCoord3f(-50.f, -50.f, -50.f);
glVertex3f(-50.f, -50.f, -50.f);
glTexCoord3f(50.f, -50.f, -50.f);
glVertex3f(50.f, -50.f, -50.f);
glTexCoord3f(50.f, 50.f, -50.f);
glVertex3f(50.f, 50.f, -50.f);
glTexCoord3f(-50.f, 50.f, -50.f);
glVertex3f(-50.f, 50.f, -50.f);
glTexCoord3f(-d, -d, -d);
glVertex3f(-d, -d, -d);
glTexCoord3f(d, -d, -d);
glVertex3f(d, -d, -d);
glTexCoord3f(d, d, -d);
glVertex3f(d, d, -d);
glTexCoord3f(-d, d, -d);
glVertex3f(-d, d, -d);
} glEnd();
#ifndef __EMSCRIPTEN__