Add first of several ray cast/rendering files
This commit is contained in:
parent
5f384d9d21
commit
7433c4a86d
@ -37,16 +37,17 @@
|
||||
-include $(TOPDIR)/Make.defs
|
||||
include $(APPDIR)/Make.defs
|
||||
|
||||
# Hello, World! built-in application info
|
||||
# Traveler built-in application info
|
||||
|
||||
APPNAME = traveler
|
||||
PRIORITY = SCHED_PRIORITY_DEFAULT
|
||||
STACKSIZE = 2048
|
||||
|
||||
# Hello, World! Example
|
||||
# Traveler files
|
||||
|
||||
ASRCS =
|
||||
CSRCS = trv_color.c trv_doors.c trv_graphics.c trv_input.c trv_mem.c trv_pov.c
|
||||
ASRCS =
|
||||
CSRCS = trv_color.c trv_doors.c trv_graphics.c trv_input.c trv_mem.c trv_pov.c
|
||||
CSRCS += trv_rayrend.c
|
||||
MAINSRC = trv_main.c
|
||||
|
||||
ifeq ($(CONFIG_NX),y)
|
||||
|
@ -47,10 +47,54 @@
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define BITMAP_WIDTH 64
|
||||
#define BITMAP_HEIGHT 64
|
||||
#define BITMAP_LOG2H 6
|
||||
#define BITMAP_SIZE (BITMAP_WIDTH * BITMAP_HEIGHT)
|
||||
#define BITMAP_IMASK (BITMAP_HEIGHT-1)
|
||||
#define BITMAP_JMASK (BITMAP_WIDTH-1)
|
||||
#define BITMAP_JSHIFT 6
|
||||
#define BMICLIP(i) ((i) & BITMAP_IMASK)
|
||||
#define BMJCLIP(i) ((i) & BITMAP_JMASK)
|
||||
#define BMOFFSET(i,j) (((i) << BITMAP_JSHIFT) | (j))
|
||||
#define MAX_BITMAPS 256
|
||||
|
||||
/****************************************************************************
|
||||
* Public Types
|
||||
****************************************************************************/
|
||||
|
||||
struct trv_bitmap_s
|
||||
{
|
||||
uint16_t w;
|
||||
uint16_t h;
|
||||
uint8_t log2h;
|
||||
FAR trv_pixel_t *bm;
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/* These point to the (allocated) bit map buffers for the even and odd
|
||||
* bitmaps
|
||||
*/
|
||||
|
||||
extern struct trv_bitmap_s *g_even_bitmaps[MAX_BITMAPS];
|
||||
#ifndef WEDIT
|
||||
extern struct trv_bitmap_s *g_odd_bitmaps[MAX_BITMAPS];
|
||||
#endif
|
||||
|
||||
/* This is the maximum value + 1 of a texture code */
|
||||
|
||||
extern uint16_t g_trv_nbitmaps;
|
||||
|
||||
/* These are the colors from the worldPalette which should used to rend
|
||||
* the sky and ground
|
||||
*/
|
||||
|
||||
extern trv_pixel_t g_sky_color;
|
||||
extern trv_pixel_t g_ground_color;
|
||||
|
||||
/****************************************************************************
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
|
@ -91,9 +91,9 @@
|
||||
|
||||
struct trv_color_rgb_s
|
||||
{
|
||||
uint8_t red;
|
||||
uint8_t green;
|
||||
uint8_t blue;
|
||||
uint8_t red; /* red component of color 0-63 */
|
||||
uint8_t green; /* green component of color 0-63 */
|
||||
uint8_t blue; /* blue component of color 0-63 */
|
||||
};
|
||||
|
||||
struct trv_color_lum_s
|
||||
|
82
graphics/traveler/include/trv_paltable.h
Normal file
82
graphics/traveler/include/trv_paltable.h
Normal file
@ -0,0 +1,82 @@
|
||||
/****************************************************************************
|
||||
* apps/graphics/traveler/include/trv_paltable.h
|
||||
*
|
||||
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __APPS_GRAPHICS_TRAVELER_INCLUDE_TRV_PALTABLE_H
|
||||
#define __APPS_GRAPHICS_TRAVELER_INCLUDE_TRV_PALTABLE_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include "trv_types.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor
|
||||
****************************************************************************/
|
||||
|
||||
/* Here some palette-related definitions. */
|
||||
|
||||
#define PALETTE_SIZE 256 /* This is the number of colors in the palette */
|
||||
#define NUM_ZONES 16 /* This is the number of distance zones in the palette table */
|
||||
|
||||
/* Here are some macros used to access the palette table. */
|
||||
|
||||
#define PAL_SCALE_BITS 2
|
||||
#define GET_DISTANCE(x,y) ( (x) >= (y) ? ((x) + ((y) >>1)) : ((y) + ((x) >>1)))
|
||||
#define GET_ZONE(x,y) (GET_DISTANCE(x,y) >> (sSHIFT+PAL_SCALE_BITS))
|
||||
#define GET_PALINDEX(d) ((d) >= NUM_ZONES ? (NUM_ZONES-1) : (d))
|
||||
#define GET_PALPTR(d) g_paltable[GET_PALINDEX(d)]
|
||||
|
||||
/* This is a special version which is used by the texture logic. The
|
||||
* texture engine used 8 bits of fraction in many of its calculation
|
||||
*/
|
||||
|
||||
#define GET_FZONE(x,y,n) (GET_DISTANCE(x,y) >> (sSHIFT+PAL_SCALE_BITS-(n)))
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/* This is the palette table which is used to adjust the texture values
|
||||
* with distance
|
||||
*/
|
||||
|
||||
extern trv_pixel_t *g_paltable[NUM_ZONES];
|
||||
|
||||
/****************************************************************************
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
#endif /* __APPS_GRAPHICS_TRAVELER_INCLUDE_TRV_PALTABLE_H */
|
166
graphics/traveler/include/trv_raycast.h
Normal file
166
graphics/traveler/include/trv_raycast.h
Normal file
@ -0,0 +1,166 @@
|
||||
/****************************************************************************
|
||||
* apps/graphics/traveler/include/trv_raycast.h
|
||||
* This is the header file associated with trv_raycast.c
|
||||
*
|
||||
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __APPS_GRAPHICS_TRAVELER_INCLUDE_TRV_RAYCAST_H
|
||||
#define __APPS_GRAPHICS_TRAVELER_INCLUDE_TRV_RAYCAST_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include "trv_types.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* The following definitions define the world view window in terms of the
|
||||
* 320x200 display coordinates.
|
||||
*/
|
||||
|
||||
#define WINDOW_LEFT 0 /* Offset (in bytes) to the left side
|
||||
* of the world window */
|
||||
#define WINDOW_WIDTH 320 /* Width of the world window */
|
||||
#define WINDOW_TOP 0 /* Offset (in multiples of TRV_SCREEN_WIDTH)
|
||||
* to the top of world window */
|
||||
#define WINDOW_HEIGHT 200 /* height of the world window */
|
||||
#define WINDOW_MIDDLE 100 /* Center or horizon of the world window */
|
||||
|
||||
/* This calculation tends to overflow unless it is cast carefully */
|
||||
|
||||
#define WINDOW_SIZE (((int32_t)WINDOW_WIDTH)*((int32_t)WINDOW_HEIGHT))
|
||||
|
||||
/* This is the biggest distance that can be represented with int16_t */
|
||||
|
||||
#define TRV_INFINITY 0x7fff
|
||||
|
||||
/* The actual size of the image will be determined by the
|
||||
* both the WINDOW size as well as the GULP size
|
||||
*/
|
||||
|
||||
#define NUMBER_HGULPS (WINDOW_WIDTH/HGULP_SIZE)
|
||||
#define IMAGE_WIDTH (HGULP_SIZE*NUMBER_HGULPS)
|
||||
#define IMAGE_LEFT (((WINDOW_WIDTH-IMAGE_WIDTH) >> 1) + WINDOW_LEFT)
|
||||
#define IMAGE_HEIGHT WINDOW_HEIGHT
|
||||
#define IMAGE_TOP WINDOW_TOP
|
||||
|
||||
/* This defines the number of pixels (in each direction) with will be
|
||||
* processed on each pass through the innermost ray casting loop
|
||||
*/
|
||||
|
||||
#define HGULP_SIZE 7
|
||||
#define VGULP_SIZE 16
|
||||
|
||||
/* The following define the various meanings of hit.type */
|
||||
|
||||
#define NO_HIT 0x00
|
||||
#define FRONT_HIT 0x00
|
||||
#define BACK_HIT 0x01
|
||||
#define FB_MASK 0x01
|
||||
#define X_HIT 0x00
|
||||
#define Y_HIT 0x02
|
||||
#define Z_HIT 0x04
|
||||
#define XYZ_MASK 0x06
|
||||
|
||||
#define IS_FRONT_HIT(h) (((h)->type & FB_MASK) == FRONT_HIT)
|
||||
#define IS_BACK_HIT(h) (((h)->type & FB_MASK) == BACK_HIT)
|
||||
#define IS_XRAY_HIT(h) (((h)->type & XYZ_MASK) == X_HIT)
|
||||
#define IS_YRAY_HIT(h) (((h)->type & XYZ_MASK) == Y_HIT)
|
||||
#define IS_ZRAY_HIT(h) (((h)->type & XYZ_MASK) == Z_HIT)
|
||||
|
||||
#define MK_HIT_TYPE(fb,xyz) ((fb)|(xyz))
|
||||
|
||||
/****************************************************************************
|
||||
* Public Types
|
||||
****************************************************************************/
|
||||
|
||||
/* This structure provides the return values for each ray caster. For
|
||||
* performance reasons, the size of this structure should be an even
|
||||
* power of two (makes index calculation faster).
|
||||
*/
|
||||
|
||||
struct trv_rect_data_s;
|
||||
struct trv_raycast_s
|
||||
{
|
||||
/* 'rect' points to the rectangle that was hit (if any) */
|
||||
|
||||
FAR struct trv_rect_data_s *rect;
|
||||
|
||||
uint8_t type; /* Type of hit: X/Y/Z cast, front/back */
|
||||
uint8_t unused2; /* Padding to force power of two size */
|
||||
int16_t xpos; /* Horizontal position on surface of the hit */
|
||||
int16_t ypos; /* Vertical position on surface of the hit */
|
||||
int16_t xdist; /* X distance to the hit */
|
||||
int16_t ydist; /* Y distance to the hit */
|
||||
int16_t zdist; /* Z distance to the hit (not used) */
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
/* This structure holds pre-calculated pitch data for all ray casts. NOTE:
|
||||
* would be a performance improvement if this structure is an even power of
|
||||
*two in size (don't have to multiply to calculate indices)
|
||||
*/
|
||||
|
||||
/* The following array describes the hits from X/Y/Z-ray casting for the
|
||||
* current HGULP_SIZE x VGULP_SIZE cell
|
||||
*/
|
||||
|
||||
extern struct trv_raycast_s g_ray_hit[VGULP_SIZE][HGULP_SIZE+1];
|
||||
|
||||
/* This structure points to the double buffer row corresponding to the
|
||||
* pitch angle
|
||||
*/
|
||||
|
||||
extern uint8_t *g_buffer_row[VGULP_SIZE];
|
||||
|
||||
/* The is the "column" offset in g_buffer_row for the current cell being
|
||||
* operated on. This value is updated in a loop by trv_raycaster.
|
||||
*/
|
||||
|
||||
extern int16_t g_cell_column;
|
||||
|
||||
/* This structure holds the parameters used in the current ray cast */
|
||||
|
||||
extern struct trv_camera_s g_camera;
|
||||
|
||||
/****************************************************************************
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
#endif /* __APPS_GRAPHICS_TRAVELER_INCLUDE_TRV_RAYCAST_H */
|
@ -64,5 +64,6 @@ struct trv_graphics_info_s;
|
||||
|
||||
void trv_raycaster(FAR struct trv_camera_s *player,
|
||||
FAR struct trv_graphics_info_s *ginfo);
|
||||
uint8_t trv_get_texture(uint8_t row, uint8_t col);
|
||||
|
||||
#endif /* __APPS_GRAPHICS_TRAVELER_INCLUDE_TRV_RAYCNTL_H */
|
||||
|
@ -41,12 +41,37 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include "trv_types.h"
|
||||
#include "trv_world.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
/* The following macro calculates the texture index for the given the
|
||||
* horizontal position (h), the vertical position (v) and the log2 bitmap
|
||||
* size (s).
|
||||
*/
|
||||
|
||||
#define TMASK(s) ((1 << (s)) - 1)
|
||||
#define TFIX(x,s) ((x) << (s))
|
||||
#define TFRAC(x,m) ((x) & (m))
|
||||
#define TNDX(h,v,s,m) (TFIX( TFRAC( (~(v)), m ), s) + TFRAC( h, m ) )
|
||||
|
||||
/* Here is a macro to extract one pixel from a WALL texture. This is used
|
||||
* by the raycasters to determine a hit in a transparent wall hit an
|
||||
* opaque portion of the texture
|
||||
*/
|
||||
|
||||
#define GET_FRONT_PIXEL(r,h,v) \
|
||||
trv_get_rectpixel(h,v,g_even_bitmaps[ (r)->texture ], (r)->scale)
|
||||
#define GET_BACK_PIXEL(r,h,v) \
|
||||
trv_get_rectpixel(h,v,g_odd_bitmaps[ (r)->texture ], (r)->scale)
|
||||
|
||||
/* This is special value of a pixel in a "grandparent" rectangle which means
|
||||
* that the pixel is transparent.
|
||||
*/
|
||||
|
||||
#define INVISIBLE_PIXEL 0
|
||||
|
||||
/****************************************************************************
|
||||
* Public Types
|
||||
****************************************************************************/
|
||||
@ -55,6 +80,17 @@
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
void trv_rend_backdrop (struct trv_camera_s *camera);
|
||||
struct trv_camera_s;
|
||||
struct trv_graphics_info_s;
|
||||
struct trv_bitmap_s;
|
||||
|
||||
void trv_rend_backdrop(FAR struct trv_camera_s *camera,
|
||||
FAR struct trv_graphics_info_s *ginfo);
|
||||
void trv_rend_cell(uint8_t row, uint8_t col, uint8_t height, uint8_t width);
|
||||
void trv_rend_row(uint8_t row, uint8_t col, uint8_t width);
|
||||
void trv_rend_column(uint8_t row, uint8_t col, uint8_t height);
|
||||
void trv_rend_pixel(uint8_t row, uint8_t col);
|
||||
trv_pixel_t trv_get_rectpixel(int16_t hPos, int16_t vPos,
|
||||
FAR struct trv_bitmap_s *bmp, uint8_t scale);
|
||||
|
||||
#endif /* __APPS_GRAPHICS_TRAVELER_INCLUDE_TRV_RAYEND_H */
|
||||
|
@ -45,6 +45,7 @@
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
/* Angles *******************************************************************/
|
||||
|
||||
/* These are definitions of commonly used angles. */
|
||||
|
||||
@ -69,6 +70,63 @@
|
||||
#define ANGLE_270 1440
|
||||
#define ANGLE_360 1920
|
||||
|
||||
/* Fixed precision definitions **********************************************/
|
||||
|
||||
/* SMALL precision (6 bits past binary point) */
|
||||
/* This occurs frequently because each CELL is 64x64 */
|
||||
|
||||
#define sUNITY 64
|
||||
#define sHALF 32
|
||||
#define sQUARTER 16
|
||||
#define sSHIFT 6
|
||||
#define sMASK 63
|
||||
|
||||
#define sTRUNC(a) ((a) >> sSHIFT)
|
||||
#define sROUND(a) (((a) + sHALF) >> sSHIFT)
|
||||
#define sFIX(a) ((a) << sSHIFT)
|
||||
#define sSNAP(a) ((a) & (~sMASK))
|
||||
#define sFRAC(a) ((a) & sMASK)
|
||||
|
||||
#define sMUL(a,b) (((int32_t)(a) * (int32_t)(b)) >> sSHIFT )
|
||||
#define sDIV(a,b) (((int32_t)(a) << sSHIFT) / (b))
|
||||
#define sFLOAT(a) ((float)(a) / (float)sUNITY)
|
||||
|
||||
/* DOUBLE precision (12 bits past binary point) */
|
||||
/* This precision results when two SMALL precision numbers are multiplied */
|
||||
|
||||
#define dUNITY 4096
|
||||
#define dHALF 2048
|
||||
#define dSHIFT 12
|
||||
#define dMASK 4095
|
||||
|
||||
#define dTRUNC(a) ((a) >> dSHIFT)
|
||||
#define dROUND(a) (((a) + dHALF) >> dSHIFT)
|
||||
#define dFIX(a) ((a) << dSHIFT)
|
||||
#define dSNAP(a) ((a) & (~dMASK))
|
||||
#define dFRAC(a) ((a) & dMASK)
|
||||
|
||||
/* TRIPLE precision (18 bits past binary point) */
|
||||
/* This precision results when a SMALL and a DOUBLE precision number
|
||||
* are multiplied
|
||||
*/
|
||||
|
||||
#define tSHIFT 18
|
||||
|
||||
/* QUAD precision (24 bits past binary point) */
|
||||
/* This precision results when two DOUBLE precision numbers are multiplied */
|
||||
|
||||
#define qSHIFT 24
|
||||
|
||||
/* BIG precision (16 bits past binary point) */
|
||||
/* This is convenient precision because it is easy to extract the integer
|
||||
* portion without shifting or masking
|
||||
*/
|
||||
|
||||
#define bUNITY 65536
|
||||
#define bHALF 32768
|
||||
#define bSHIFT 16
|
||||
#define bMASK 65535
|
||||
|
||||
/****************************************************************************
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
|
@ -257,7 +257,7 @@ int traveler_main(int argc, char *argv[])
|
||||
|
||||
/* Paint the back drop */
|
||||
|
||||
trv_rend_backdrop(&g_trv_player);
|
||||
trv_rend_backdrop(&g_trv_player, &g_trv_ginfo);
|
||||
|
||||
/* Render the 3-D view */
|
||||
|
||||
|
1337
graphics/traveler/src/trv_rayrend.c
Executable file
1337
graphics/traveler/src/trv_rayrend.c
Executable file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user