Add first of several ray cast/rendering files

This commit is contained in:
Gregory Nutt 2014-12-05 08:44:55 -06:00
parent 5f384d9d21
commit 7433c4a86d
10 changed files with 1735 additions and 10 deletions

View File

@ -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)

View File

@ -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
****************************************************************************/

View File

@ -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

View 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 */

View 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 */

View File

@ -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 */

View File

@ -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 */

View File

@ -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
****************************************************************************/

View File

@ -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 */

File diff suppressed because it is too large Load Diff