mirror of
https://git.planet-casio.com/Fcalva/Copy3DEngine.git
synced 2024-12-28 04:23:44 +01:00
draw_stripe : Opti max (Pour du C)
This commit is contained in:
parent
6942d10dda
commit
84b823f285
5 changed files with 93 additions and 139 deletions
|
@ -18,7 +18,7 @@ set(SOURCES
|
||||||
src/main.c
|
src/main.c
|
||||||
src/moteur.c
|
src/moteur.c
|
||||||
src/map.c
|
src/map.c
|
||||||
src/opti.S
|
# src/opti.S
|
||||||
)
|
)
|
||||||
|
|
||||||
set(ASSETS
|
set(ASSETS
|
||||||
|
|
20
src/main.c
20
src/main.c
|
@ -27,8 +27,6 @@
|
||||||
#error Ce code est pour FXCG50/G90+E uniquement, enlevez ce message a vos riques et périls
|
#error Ce code est pour FXCG50/G90+E uniquement, enlevez ce message a vos riques et périls
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define debug 0 //pour afficher les infos de debug
|
|
||||||
|
|
||||||
image_t *tex_index[TINDEX_S];
|
image_t *tex_index[TINDEX_S];
|
||||||
|
|
||||||
extern char map_test[map_w][map_h];
|
extern char map_test[map_w][map_h];
|
||||||
|
@ -91,8 +89,6 @@ int main(){
|
||||||
|
|
||||||
load_map();
|
load_map();
|
||||||
|
|
||||||
image_t *frame_buffer = image_create_vram();
|
|
||||||
|
|
||||||
extern image_t *tex_index[TINDEX_S];
|
extern image_t *tex_index[TINDEX_S];
|
||||||
|
|
||||||
tex_index[1] = &buisson0;
|
tex_index[1] = &buisson0;
|
||||||
|
@ -108,6 +104,10 @@ int main(){
|
||||||
|
|
||||||
prof_init();
|
prof_init();
|
||||||
|
|
||||||
|
#if debug
|
||||||
|
EngineTimers timers;
|
||||||
|
#endif
|
||||||
|
|
||||||
while (!exit_game) {
|
while (!exit_game) {
|
||||||
prof_t frame = prof_make();
|
prof_t frame = prof_make();
|
||||||
prof_enter(frame);
|
prof_enter(frame);
|
||||||
|
@ -117,14 +117,18 @@ int main(){
|
||||||
dma_memset((void*)((uint32_t)gint_vram + viewport_w*viewport_h),
|
dma_memset((void*)((uint32_t)gint_vram + viewport_w*viewport_h),
|
||||||
0xc4c9c4c9, viewport_w*viewport_h);
|
0xc4c9c4c9, viewport_w*viewport_h);
|
||||||
|
|
||||||
draw_walls();
|
|
||||||
|
|
||||||
if(first_frame){
|
if(first_frame){
|
||||||
main_menu();
|
main_menu();
|
||||||
}
|
}
|
||||||
|
|
||||||
keys_get();
|
keys_get();
|
||||||
|
|
||||||
|
draw_walls(
|
||||||
|
#if debug
|
||||||
|
&timers
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
|
||||||
if (disp_frame_time == 1) dprint( 1, 10, C_BLACK, "Frame time : %d ms", frame_time);
|
if (disp_frame_time == 1) dprint( 1, 10, C_BLACK, "Frame time : %d ms", frame_time);
|
||||||
|
|
||||||
#if debug
|
#if debug
|
||||||
|
@ -134,6 +138,10 @@ int main(){
|
||||||
dprint( 1, 50, C_BLACK, "dirY : %d", dirY);
|
dprint( 1, 50, C_BLACK, "dirY : %d", dirY);
|
||||||
dprint( 1, 60, C_BLACK, "posX : %d", posX);
|
dprint( 1, 60, C_BLACK, "posX : %d", posX);
|
||||||
dprint( 1, 70, C_BLACK, "posY : %d", posY);
|
dprint( 1, 70, C_BLACK, "posY : %d", posY);
|
||||||
|
dprint( 1, 80, C_BLACK, "Raycast time : %d", prof_time(timers.raycast_time));
|
||||||
|
dprint( 1, 90, C_BLACK, "Draw time : %d", prof_time(timers.draw_time));
|
||||||
|
timers.raycast_time = prof_make();
|
||||||
|
timers.draw_time = prof_make();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
dupdate();
|
dupdate();
|
||||||
|
|
47
src/moteur.c
47
src/moteur.c
|
@ -168,24 +168,40 @@ void load_map(){
|
||||||
}
|
}
|
||||||
|
|
||||||
#if asm_opti
|
#if asm_opti
|
||||||
void draw_stripe(image_t *tex, int texSampleY, int linePos, fixed_t texSize, int texX, int x);
|
|
||||||
#else
|
#else
|
||||||
void inline draw_stripe(image_t *tex, int texSampleY, int linePos, fixed_t texSize, int texX, int x){
|
inline void __attribute__((always_inline)) draw_stripe(image_t *tex, int texSampleY,
|
||||||
|
int linePos, fixed_t texSize, int texX, int x){
|
||||||
fixed_t screenPos = fix(linePos);
|
fixed_t screenPos = fix(linePos);
|
||||||
uint32_t texDat = (uint32_t)tex->data + 2*texX;
|
uint32_t texDat = (uint32_t)tex->data + 2*texX;
|
||||||
for(int texPos = texSampleY; texPos < 64; texPos++){
|
register int vramSize asm("r2") = 396;
|
||||||
if(screenPos < -texSize) goto noDraw;
|
register int oneConst asm("r12");
|
||||||
for(fixed_t oldPos = screenPos; oldPos < screenPos+texSize; oldPos+=0xFFFF){
|
asm("mov #-1, r12\n"
|
||||||
gint_vram[ffloor(oldPos)*396+x] = *(uint16_t*)texDat;
|
"extu.w r12, r12"
|
||||||
|
: "=r" (oneConst)
|
||||||
|
: "r" (oneConst)
|
||||||
|
);
|
||||||
|
for(int texPos = texSampleY; texPos < 64; ++texPos){
|
||||||
|
if(screenPos >= -texSize){
|
||||||
|
int vrampos = ffloor(screenPos)*vramSize+x;
|
||||||
|
fixed_t oldPos = screenPos;
|
||||||
|
int16_t pix = *(int16_t*)texDat;
|
||||||
|
do{
|
||||||
|
gint_vram[vrampos] = pix;
|
||||||
|
vrampos += vramSize;
|
||||||
|
oldPos += oneConst;
|
||||||
|
}while(oldPos < screenPos+texSize);
|
||||||
}
|
}
|
||||||
noDraw:
|
|
||||||
screenPos += texSize;
|
screenPos += texSize;
|
||||||
texDat += tex->stride;
|
texDat += tex->stride;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void draw_walls(){
|
void draw_walls(
|
||||||
|
#if debug
|
||||||
|
EngineTimers *timers
|
||||||
|
#endif
|
||||||
|
){
|
||||||
extern fixed_t posX;
|
extern fixed_t posX;
|
||||||
extern fixed_t posY;
|
extern fixed_t posY;
|
||||||
extern fixed_t dirX;
|
extern fixed_t dirX;
|
||||||
|
@ -222,6 +238,9 @@ void draw_walls(){
|
||||||
struct image_linear_map temp;
|
struct image_linear_map temp;
|
||||||
|
|
||||||
for(x = 0; x < viewport_w; x++) {
|
for(x = 0; x < viewport_w; x++) {
|
||||||
|
#if debug
|
||||||
|
prof_enter(timers->raycast_time);
|
||||||
|
#endif
|
||||||
|
|
||||||
//calculate ray position and direction
|
//calculate ray position and direction
|
||||||
cameraX = fdiv(fix(x*2), fix(viewport_w)) - 0xFFFF + h_offset; //x-coordinate in camera space
|
cameraX = fdiv(fix(x*2), fix(viewport_w)) - 0xFFFF + h_offset; //x-coordinate in camera space
|
||||||
|
@ -245,6 +264,7 @@ void draw_walls(){
|
||||||
// stepping further below works. So the values can be computed as below.
|
// stepping further below works. So the values can be computed as below.
|
||||||
// Division through zero is prevented, even though technically that's not
|
// Division through zero is prevented, even though technically that's not
|
||||||
// needed in C++ with IEEE 754 floating point values.
|
// needed in C++ with IEEE 754 floating point values.
|
||||||
|
//Fcalva : It is with fp32s !
|
||||||
|
|
||||||
rayDirX = rayDirX == 0 ? 1 : rayDirX;
|
rayDirX = rayDirX == 0 ? 1 : rayDirX;
|
||||||
rayDirY = rayDirY == 0 ? 1 : rayDirY;
|
rayDirY = rayDirY == 0 ? 1 : rayDirY;
|
||||||
|
@ -281,7 +301,7 @@ void draw_walls(){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
//Otherwise check if ray has hit a wall
|
//Otherwise check if ray has hit a wall
|
||||||
else if (map_test[mapX][mapY] > 0) {
|
if (map_test[mapX][mapY] > 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
//jump to next map square, either in x-direction, or in y-direction
|
//jump to next map square, either in x-direction, or in y-direction
|
||||||
|
@ -306,6 +326,11 @@ void draw_walls(){
|
||||||
if (side == 0) perpWallDist = (sideDistX - deltaDistX);
|
if (side == 0) perpWallDist = (sideDistX - deltaDistX);
|
||||||
else perpWallDist = (sideDistY - deltaDistY);
|
else perpWallDist = (sideDistY - deltaDistY);
|
||||||
|
|
||||||
|
#if debug
|
||||||
|
prof_leave(timers->raycast_time);
|
||||||
|
prof_enter(timers->draw_time);
|
||||||
|
#endif
|
||||||
|
|
||||||
//texturing calculations
|
//texturing calculations
|
||||||
|
|
||||||
//calculate value of wallX
|
//calculate value of wallX
|
||||||
|
@ -341,5 +366,9 @@ void draw_walls(){
|
||||||
image_t *tex = tex_index[map_test[mapX][mapY]];
|
image_t *tex = tex_index[map_test[mapX][mapY]];
|
||||||
|
|
||||||
draw_stripe(tex, texSampleY, linePos, texSize, texX, x);
|
draw_stripe(tex, texSampleY, linePos, texSize, texX, x);
|
||||||
|
|
||||||
|
#if debug
|
||||||
|
prof_leave(timers->draw_time);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
64
src/moteur.h
64
src/moteur.h
|
@ -1,24 +1,40 @@
|
||||||
// Voir README.md pour license précise, par Fcalva 2023-2024 et est sous GPLv3
|
// Voir README.md pour license précise, par Fcalva 2023-2024 et est sous GPLv3
|
||||||
|
|
||||||
#ifndef moteur_h
|
#ifndef moteur_h
|
||||||
#define moteur_h
|
#define moteur_h
|
||||||
|
|
||||||
#include <gint/image.h>
|
#include "libprof.h"
|
||||||
|
#include <gint/image.h>
|
||||||
//param. graphiques
|
|
||||||
#define screen_w 396
|
//param. graphiques
|
||||||
#define screen_h 224
|
#define screen_w 396
|
||||||
#define viewport_w 396
|
#define screen_h 224
|
||||||
#define viewport_h 224
|
#define viewport_w 396
|
||||||
#define max_dist fix(32) //en tuiles << 16, actuellement 32
|
#define viewport_h 224
|
||||||
|
#define max_dist fix(32) //en tuiles << 16, actuellement 32
|
||||||
#define TINDEX_S 256
|
|
||||||
|
#define TINDEX_S 256
|
||||||
#define asm_opti 1
|
|
||||||
|
#define debug 0 //pour afficher les infos de debug
|
||||||
void load_map();
|
|
||||||
void end_screen();
|
#define asm_opti 0
|
||||||
void draw_walls();
|
|
||||||
void move();
|
typedef struct {
|
||||||
|
|
||||||
#endif /* moteur */
|
prof_t raycast_time;
|
||||||
|
prof_t draw_time;
|
||||||
|
|
||||||
|
} EngineTimers;
|
||||||
|
|
||||||
|
void draw_stripe(image_t *tex, int texSampleY, int linePos, fixed_t texSize, int texX, int x);
|
||||||
|
|
||||||
|
void load_map();
|
||||||
|
void end_screen();
|
||||||
|
void draw_walls(
|
||||||
|
#if debug
|
||||||
|
EngineTimers *timers
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
void move();
|
||||||
|
|
||||||
|
#endif /* moteur */
|
||||||
|
|
99
src/opti.S
99
src/opti.S
|
@ -1,99 +0,0 @@
|
||||||
##void draw_stripe(image_t *tex, int texSampleY, int linePos, fixed_t texSize, int texX, int x){
|
|
||||||
## fixed_t screenPos = fix(linePos);
|
|
||||||
## uint32_t texDat = (uint32_t)tex->data + 2*texX;
|
|
||||||
## for(int texPos = texSampleY; texPos < 64; texPos++){
|
|
||||||
## if(screenPos < -texSize) goto noDraw;
|
|
||||||
## for(fixed_t oldPos = screenPos; oldPos < screenPos+texSize; oldPos+=0xFFFF){
|
|
||||||
## gint_vram[ffloor(oldPos)*396+x] = *(uint16_t*)texDat;
|
|
||||||
## }
|
|
||||||
## noDraw:
|
|
||||||
## screenPos += texSize;
|
|
||||||
## texDat += tex->stride;
|
|
||||||
## }
|
|
||||||
##}
|
|
||||||
|
|
||||||
# r0 : vram
|
|
||||||
# r1 : tex->stride
|
|
||||||
# r2 : texDat
|
|
||||||
# r3 : 0xFFFF / swapped with 64
|
|
||||||
# r4 : tex -> x -> texX -> oldPos
|
|
||||||
# r5 : texSampleY -> texPos
|
|
||||||
# r6 : linePos -> screenPos
|
|
||||||
# r7 : texSize
|
|
||||||
# r8 : 396*2
|
|
||||||
# r9 : -texSize
|
|
||||||
# r10 : px save
|
|
||||||
# @-4 : texX -> r8 (save)
|
|
||||||
# @-8 : x -> r9 (save)
|
|
||||||
# @-12 : r10 (save)
|
|
||||||
|
|
||||||
.global _draw_stripe
|
|
||||||
.align 4
|
|
||||||
_draw_stripe:
|
|
||||||
mov.l .gint_vram, r0
|
|
||||||
|
|
||||||
add #4, r4
|
|
||||||
mov.l @r4, r1
|
|
||||||
|
|
||||||
add #4, r4
|
|
||||||
mov.l @r4, r2
|
|
||||||
mov.l @r15+, r4
|
|
||||||
shll r4
|
|
||||||
add r4, r2
|
|
||||||
|
|
||||||
mov.l @r15+, r4
|
|
||||||
shll r4
|
|
||||||
add r4, r0
|
|
||||||
|
|
||||||
shll16 r6
|
|
||||||
|
|
||||||
mov.l r8, @-r15
|
|
||||||
mov #99, r8
|
|
||||||
shll2 r8
|
|
||||||
shll r8
|
|
||||||
|
|
||||||
mov.l r9, @-r15
|
|
||||||
mov r7, r9
|
|
||||||
neg r9, r9
|
|
||||||
|
|
||||||
mov.l r10, @-r15
|
|
||||||
|
|
||||||
ds_lpstart:
|
|
||||||
cmp/gt r6, r9
|
|
||||||
bt noDraw
|
|
||||||
nop
|
|
||||||
nop
|
|
||||||
ds_tex_lpstart:
|
|
||||||
mov #-1, r3
|
|
||||||
mov r6, r4
|
|
||||||
#tex read
|
|
||||||
mov.w @r2, r10
|
|
||||||
extu.w r3, r3
|
|
||||||
add r7, r6
|
|
||||||
mov.w r10, @r0
|
|
||||||
add r3, r4
|
|
||||||
cmp/gt r4, r6
|
|
||||||
add r8, r0
|
|
||||||
bf ds_tex_lpstart
|
|
||||||
bt ds_tex_exit
|
|
||||||
nop
|
|
||||||
noDraw:
|
|
||||||
add r7, r6
|
|
||||||
add r8, r0
|
|
||||||
ds_tex_exit:
|
|
||||||
add r1, r2
|
|
||||||
mov #64, r3
|
|
||||||
add #1, r5
|
|
||||||
cmp/ge r5, r3
|
|
||||||
bf ds_lpstart
|
|
||||||
nop
|
|
||||||
|
|
||||||
mov.l @r15+, r10
|
|
||||||
mov.l @r15+, r9
|
|
||||||
mov.l @r15+, r8
|
|
||||||
rts
|
|
||||||
add #-8, r15
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
.gint_vram:
|
|
||||||
.long _gint_vram
|
|
Loading…
Reference in a new issue