aboutsummaryrefslogtreecommitdiff
path: root/src/render_sprite.c
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-02-04 03:40:05 +0100
committerCharles <sircharlesaze@gmail.com>2020-02-04 03:40:05 +0100
commitc8de182e9fa0c8a2674bf2f13d2ed9f500607ebd (patch)
tree57bee31b2c0d95b00aab160ed5c1ec7527a13d75 /src/render_sprite.c
parent6309d5ffd30d97af666ca306fb0df293645fc7e4 (diff)
downloadcub3d-c8de182e9fa0c8a2674bf2f13d2ed9f500607ebd.tar.gz
cub3d-c8de182e9fa0c8a2674bf2f13d2ed9f500607ebd.tar.bz2
cub3d-c8de182e9fa0c8a2674bf2f13d2ed9f500607ebd.zip
Norming
Diffstat (limited to 'src/render_sprite.c')
-rw-r--r--src/render_sprite.c121
1 files changed, 62 insertions, 59 deletions
diff --git a/src/render_sprite.c b/src/render_sprite.c
index 0570a71..379f67a 100644
--- a/src/render_sprite.c
+++ b/src/render_sprite.c
@@ -6,79 +6,82 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/02 17:39:07 by cacharle #+# #+# */
-/* Updated: 2020/02/02 23:52:29 by cacharle ### ########.fr */
+/* Updated: 2020/02/04 03:38:53 by cacharle ### ########.fr */
/* */
/* ************************************************************************** */
#include "cub3d.h"
-int sprite_compar(const void *a, const void *b)
+static void draw_stripe(t_state *state, t_sprite_state *sstate, int stripe)
{
- const t_sprite *sprite_a;
- const t_sprite *sprite_b;
+ int tex_width;
+ int tex_height;
+ int tex_x;
+ int y;
- sprite_a = a;
- sprite_b = b;
- if (sprite_a->dist > sprite_b->dist)
- return -1;
- if (sprite_a->dist < sprite_b->dist)
- return 1;
- return 0;
+ tex_width = state->textures[TEX_SPRITE].width;
+ tex_height = state->textures[TEX_SPRITE].height;
+ tex_x = (int)(256 * (stripe - (-sstate->sprite_width / 2 + sstate->sprite_window_x))
+ * tex_width / sstate->sprite_width) / 256;
+ if (!(sstate->transform.y > 0 && stripe > 0 && stripe < state->window.width && sstate->transform.y < state->z_buffer[stripe]))
+ return ;
+ y = sstate->draw_start - 1;
+ while (++y < sstate->draw_end_y)
+ {
+ int d = y * 256 - state->window.height * 128 + sstate->sprite_height * 128;
+ int tex_y = ((d * tex_height) / sstate->sprite_height) / 256;
+ t_color color = ((t_color*)state->textures[TEX_SPRITE].data)[tex_width * tex_y + tex_x];
+ if ((color.hexcode & 0x00FFFFFF) != 0)
+ ((t_color*)state->window.data)[y * state->window.width + stripe] = color;
+ }
}
-void sprites_dist(t_state *state)
+static void sprite_boundary(t_state *state, t_sprite_state *sstate)
{
- int i;
-
- i = -1;
- while (++i < state->sprites_num)
- state->sprites[i].dist = vector_norm(vector_sub(state->sprites[i].pos, state->pos));
+ sstate->sprite_height = ft_abs((int)(state->window.height
+ / (sstate->transform.y)));
+ sstate->draw_start = -sstate->sprite_height / 2 + state->window.height / 2;
+ if(sstate->draw_start < 0)
+ sstate->draw_start = 0;
+ sstate->draw_end_y = sstate->sprite_height / 2 + state->window.height / 2;
+ if(sstate->draw_end_y >= state->window.height)
+ sstate->draw_end_y = state->window.height - 1;
+ sstate->sprite_width = ft_abs( (int) (state->window.height
+ / (sstate->transform.y)));
+ sstate->draw_start_x = -sstate->sprite_width / 2 + sstate->sprite_window_x;
+ if (sstate->draw_start_x < 0)
+ sstate->draw_start_x = 0;
+ sstate->draw_end_x = sstate->sprite_width / 2 + sstate->sprite_window_x;
+ if (sstate->draw_end_x >= state->window.width)
+ sstate->draw_end_x = state->window.width - 1;
}
-void render_update_sprite(t_state *state)
+static void render_sprite(t_state *state, int i)
{
- sprites_dist(state);
- ft_qsort(state->sprites, state->sprites_num, sizeof(t_sprite), sprite_compar);
- for(int i = 0; i < state->sprites_num; i++)
- {
- double sprite_x = state->sprites[i].pos.x - state->pos.x;
- double sprite_y = state->sprites[i].pos.y - state->pos.y;
+ int stripe;
+ t_sprite_state sstate;
- double inverse_det = 1.0 / (state->plane.x * state->dir.y - state->dir.x * state->plane.y);
- double transform_x = inverse_det * (state->dir.y * sprite_x - state->dir.x * sprite_y);
- double transform_y = inverse_det * (-state->plane.y * sprite_x + state->plane.x * sprite_y);
- int sprite_window_x = (int)((state->window.width / 2) * (1 + transform_x / transform_y));
-
- int sprite_height = abs((int)(state->window.height / (transform_y)));
- int draw_start = -sprite_height / 2 + state->window.height / 2;
- if(draw_start < 0)
- draw_start = 0;
- int draw_end_y = sprite_height / 2 + state->window.height / 2;
- if(draw_end_y >= state->window.height)
- draw_end_y = state->window.height - 1;
+ sstate.sprite.x = state->sprites[i].pos.x - state->pos.x;
+ sstate.sprite.y = state->sprites[i].pos.y - state->pos.y;
+ sstate.inverse_det = 1.0 / (state->plane.x
+ * state->dir.y - state->dir.x * state->plane.y);
+ sstate.transform.x = sstate.inverse_det
+ * (state->dir.y * sstate.sprite.x - state->dir.x * sstate.sprite.y);
+ sstate.transform.y = sstate.inverse_det * (-state->plane.y
+ * sstate.sprite.x + state->plane.x * sstate.sprite.y);
+ sstate.sprite_window_x = (int)((state->window.width / 2)
+ * (1 + sstate.transform.x / sstate.transform.y));
+ sprite_boundary(state, &sstate);
+ stripe = sstate.draw_start_x - 1;
+ while (++stripe < sstate.draw_end_x)
+ draw_stripe(state, &sstate, stripe);
+}
- int sprite_width = abs( (int) (state->window.height / (transform_y)));
- int draw_start_x = -sprite_width / 2 + sprite_window_x;
- if (draw_start_x < 0)
- draw_start_x = 0;
- int draw_end_x = sprite_width / 2 + sprite_window_x;
- if (draw_end_x >= state->window.width)
- draw_end_x = state->window.width - 1;
+void render_update_sprite(t_state *state)
+{
+ int i;
- for(int stripe = draw_start_x; stripe < draw_end_x; stripe++)
- {
- int tex_width = state->textures[TEX_SPRITE].width;
- int tex_height = state->textures[TEX_SPRITE].height;
- int tex_x = (int)(256 * (stripe - (-sprite_width / 2 + sprite_window_x)) * tex_width / sprite_width) / 256;
- if(transform_y > 0 && stripe > 0 && stripe < state->window.width && transform_y < state->z_buffer[stripe])
- for(int y = draw_start; y < draw_end_y; y++)
- {
- int d = y * 256 - state->window.height * 128 + sprite_height * 128;
- int tex_y = ((d * tex_height) / sprite_height) / 256;
- t_color color = ((t_color*)state->textures[TEX_SPRITE].data)[tex_width * tex_y + tex_x];
- if ((color.hexcode & 0x00FFFFFF) != 0) // if not empty pixel
- ((t_color*)state->window.data)[y * state->window.width + stripe] = color;
- }
- }
- }
+ i = -1;
+ while (++i < state->sprites_num)
+ render_sprite(state, i);
}