summaryrefslogtreecommitdiff
path: root/apps/graphics
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2014-12-06 09:14:07 -0600
committerGregory Nutt <gnutt@nuttx.org>2014-12-06 09:14:07 -0600
commitd992aae2de69af72c71c26fc06b870647b523279 (patch)
treef36fa413cce1951c8a3c4b6a907ea50c2a857e8f /apps/graphics
parentc2e439133b6a4a417d95114d7c1c5d9fa87f90ca (diff)
downloadnuttx-d992aae2de69af72c71c26fc06b870647b523279.tar.gz
nuttx-d992aae2de69af72c71c26fc06b870647b523279.tar.bz2
nuttx-d992aae2de69af72c71c26fc06b870647b523279.zip
Add the first of several world creation files
Diffstat (limited to 'apps/graphics')
-rw-r--r--apps/graphics/traveler/Makefile7
-rw-r--r--apps/graphics/traveler/include/trv_bitmaps.h3
-rw-r--r--apps/graphics/traveler/include/trv_paltable.h2
-rw-r--r--apps/graphics/traveler/src/trv_createworld.c454
-rw-r--r--apps/graphics/traveler/src/trv_main.c2
5 files changed, 464 insertions, 4 deletions
diff --git a/apps/graphics/traveler/Makefile b/apps/graphics/traveler/Makefile
index 5316efe4e..fdfb07dbd 100644
--- a/apps/graphics/traveler/Makefile
+++ b/apps/graphics/traveler/Makefile
@@ -46,9 +46,10 @@ STACKSIZE = 2048
# Traveler files
ASRCS =
-CSRCS = trv_bitmaps.c trv_color.c trv_doors.c trv_graphics.c trv_input.c
-CSRCS += trv_mem.c trv_plane.c trv_pov.c trv_rayavoid.c trv_raycast.c
-CSRCS += trv_raycntl.c trv_rayprune.c trv_rayrend.c trv_trigtbl.c
+CSRCS = trv_bitmaps.c trv_color.c trv_createworld.c trv_doors.c
+CSRCS += trv_graphics.c trv_input.c trv_mem.c trv_plane.c trv_pov.c
+CSRCS += trv_rayavoid.c trv_raycast.c trv_raycntl.c trv_rayprune.c
+CSRCS += trv_rayrend.c trv_trigtbl.c
MAINSRC = trv_main.c
ifeq ($(CONFIG_NX),y)
diff --git a/apps/graphics/traveler/include/trv_bitmaps.h b/apps/graphics/traveler/include/trv_bitmaps.h
index ae20c5cb3..94ff64e88 100644
--- a/apps/graphics/traveler/include/trv_bitmaps.h
+++ b/apps/graphics/traveler/include/trv_bitmaps.h
@@ -99,4 +99,7 @@ extern trv_pixel_t g_ground_color;
* Public Function Prototypes
****************************************************************************/
+int trv_initialize_bitmaps(void);
+int trv_load_bitmapfile(FAR const char *bitmapfile);
+
#endif /* __APPS_GRAPHICS_TRAVELER_INCLUDE_TRV_BITMAPS_H */
diff --git a/apps/graphics/traveler/include/trv_paltable.h b/apps/graphics/traveler/include/trv_paltable.h
index 38df97473..a307a1244 100644
--- a/apps/graphics/traveler/include/trv_paltable.h
+++ b/apps/graphics/traveler/include/trv_paltable.h
@@ -79,4 +79,6 @@ extern trv_pixel_t *g_paltable[NUM_ZONES];
* Public Function Prototypes
****************************************************************************/
+int trv_load_paltable(FAR const char *file);
+
#endif /* __APPS_GRAPHICS_TRAVELER_INCLUDE_TRV_PALTABLE_H */
diff --git a/apps/graphics/traveler/src/trv_createworld.c b/apps/graphics/traveler/src/trv_createworld.c
new file mode 100644
index 000000000..5eacf1e67
--- /dev/null
+++ b/apps/graphics/traveler/src/trv_createworld.c
@@ -0,0 +1,454 @@
+/*******************************************************************************
+ * apps/graphics/traveler/src/trv_createworld.c
+ * This file contains the logic that creates the world.
+ *
+ * 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.
+ *
+ ****************************************************************************/
+
+/****************************************************************************
+ * Included files
+ ****************************************************************************/
+
+#include "trv_types.h"
+#include "trv_paltable.h"
+#include "trv_world.h"
+#include "trv_plane.h"
+#include "trv_bitmaps.h"
+
+#include <stdio.h>
+#include <errno.h>
+#include <apps/inifile.h>
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+/* Everything related to the camera POV is defined in the camera section. */
+
+#define CAMERA_SECTION_NAME "camera"
+
+/* These values define the initial camera position. */
+
+#define CAMERA_INITIAL_X "initialcamerax"
+#define CAMERA_INITIAL_Y "initialcameray"
+#define CAMERA_INITIAL_Z "initialcameraz"
+
+/* These values define the orientation of the g_camera. */
+
+#define CAMERA_INITIAL_YAW "initialcamerayaw"
+#define CAMERA_INITIAL_PITCH "initialcamerayaw"
+
+/* Everything related to the player is defined in the player section. */
+
+#define PLAYER_SECTION_NAME "player"
+
+/* These are characteristics of the player. */
+
+#define PLAYER_HEIGHT "playerheight"
+#define PLAYER_WALK_STEPHEIGHT "playerwalkstepheight"
+#define PLAYER_RUN_STEPHEIGHT "playerrunstepheight"
+
+/* Everything related to the world is defined in the world section. */
+
+#define WORLD_SECTION_NAME "world"
+
+/* Other files: */
+
+#define WORLD_MAP "worldmap"
+#define WORLD_PALETTE "worldpalette"
+#define WORLD_IMAGES "worldimages"
+
+/****************************************************************************
+ * Private Type Declarations
+ ***************************************************************************/
+
+/****************************************************************************
+ * Private Function Prototypes
+ ****************************************************************************/
+
+static int trv_ini_short(INIHANDLE inihandle, FAR int16_t *value,
+ FAR const char *section, FAR const char *name);
+#if 0 /* Not used */
+static int trv_ini_long(INIHANDLE inihandle, FAR long *value,
+ FAR const char *section, FAR const char *name);
+#endif
+static int trv_ini_filename(INIHANDLE inihandle, FAR char **filename,
+ FAR const char *section, FAR const char *name);
+static int trv_manage_wldfile(INIHANDLE inihandle);
+
+/****************************************************************************
+ * Public Data
+ ****************************************************************************/
+
+/* This is the starting position and orientation of the camera in the world */
+
+struct trv_camera_s g_initial_camera;
+
+/* This is the height of player (distance from the camera Z position to
+ * the position of the player's "feet"
+ */
+
+trv_coord_t g_player_height;
+
+/* This is size of something that the player can step over when "walking" */
+
+trv_coord_t g_walk_stepheight;
+
+/* This is size of something that the player can step over when "running" */
+
+trv_coord_t g_run_stepheight;
+
+/****************************************************************************
+ * Private Data
+ ****************************************************************************/
+
+static const char g_camera_section_name[] = CAMERA_SECTION_NAME;
+static const char g_camera_initialx_name[] = CAMERA_INITIAL_X;
+static const char g_camera_initialy_name[] = CAMERA_INITIAL_Y;
+static const char g_camera_initialz_name[] = CAMERA_INITIAL_Z;
+static const char g_camera_initialyaw_name[] = CAMERA_INITIAL_YAW;
+static const char g_camera_initialpitch_name[] = CAMERA_INITIAL_PITCH;
+
+static const char g_player_section_name[] = PLAYER_SECTION_NAME;
+static const char g_player_height_name[] = PLAYER_HEIGHT;
+static const char g_player_walkstepheight_name[] = PLAYER_WALK_STEPHEIGHT;
+static const char g_player_runstepheight_name[] = PLAYER_RUN_STEPHEIGHT;
+
+static const char g_world_section_name[] = WORLD_SECTION_NAME;
+static const char g_world_map_name[] = WORLD_MAP;
+static const char g_world_palette_name[] = WORLD_PALETTE;
+static const char g_world_images_name[] = WORLD_IMAGES;
+
+/****************************************************************************
+ * Private Variables
+ ****************************************************************************/
+
+/****************************************************************************
+ * Private Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: trv_ini_short
+ *
+ * Description:
+ * Reads a short value from the INI file and assures that it is within
+ * range for an a int16_t
+ *
+ ***************************************************************************/
+
+static int trv_ini_short(INIHANDLE inihandle, FAR int16_t *value,
+ FAR const char *section, FAR const char *name)
+{
+ /* Read the long integer from the .INI file. We supply the default
+ * value of INT32_MAX. If this value is returned, we assume that
+ * that is evidence that the requested value was not supplied in the
+ * .INI file.
+ */
+
+ long inivalue = inifile_read_integer(inihandle, section, name, INT32_MAX);
+
+ /* Make sure that it is in range for a int16_t. */
+
+ if (inivalue < INT16_MIN || inivalue > INT16_MAX)
+ {
+ /* It is not!... */
+
+ *value = 0;
+
+ /* Is this because the integer was not found? or because
+ * it is really out of range.
+ */
+
+ if (inivalue != INT32_MAX)
+ {
+
+ fprintf(stderr, "ERROR: Integer out of range in INI file:\n");
+ fprintf(stderr, " Section=\"%s\" Variable name=\"%s\" value=%ld\n",
+ section, name, (long)inivalue);
+ return -ENOENT;
+
+ }
+ else
+ {
+ fprintf(stderr, "ERROR: Required integer not found in INI file:\n");
+ fprintf(stderr, " Section=\"%s\" Variable name=\"%s\"\n",
+ section, name);
+ return -ERANGE;
+ }
+ }
+ else
+ {
+ *value = (int16_t)inivalue;
+ return OK;
+ }
+}
+
+/****************************************************************************
+ * Name: trv_ini_long
+ *
+ * Description:
+ * Reads a long value from the INI file
+ *
+ ***************************************************************************/
+
+#if 0 /* Not used */
+static uint8_t trv_ini_long(INIHANDLE inihandle, FAR long *value,
+ FAR const char *section, FAR const char *name)
+{
+ /* Read the long integer from the .INI file.*/
+
+ *value = inifile_read_integer(inihandle, section, name, 0);
+ return 0;
+}
+#endif
+
+/****************************************************************************
+ * Name: trv_ini_filename
+ *
+ * Description:
+ * Reads a file name from the the INI file.
+ *
+ ***************************************************************************/
+
+static int trv_ini_filename(INIHANDLE inihandle, FAR char **filename,
+ FAR const char *section, FAR const char *name)
+{
+ /* Read the string from the .INI file. We supply the default value of
+ * NULL. If this value is returned, we assume that that is evidence that
+ * the requested value was not supplied in the .INI file.
+ */
+
+ FAR char *value = inifile_read_string(inihandle, section, name, NULL);
+
+ /* Did we get the file name? */
+
+ if (!value)
+ {
+ /* No... */
+
+ *filename = NULL;
+
+ fprintf(stderr, "ERROR: Required filename not found in INI file:\n");
+ fprintf(stderr, " Section=\"%s\" Variable name=\"%s\"\n",
+ section, name);
+ return -ENOENT;
+ }
+ else
+ {
+ *filename = value;
+ return OK;
+ }
+}
+/****************************************************************************
+ * Name: trv_manage_wldfile
+ *
+ * Description:
+ * This is the guts of trv_world_create. It is implemented as a separate
+ * function in order to simplify error handling
+ *
+ ***************************************************************************/
+
+static int trv_manage_wldfile(INIHANDLE inihandle)
+{
+ FAR char *filename;
+ int ret;
+
+ /* Read the initial camera/player position */
+
+ ret = trv_ini_short(inihandle, &g_initial_camera.x,
+ g_camera_section_name, g_camera_initialx_name);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ ret = trv_ini_short(inihandle, &g_initial_camera.y,
+ g_camera_section_name, g_camera_initialy_name);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ ret = trv_ini_short(inihandle, &g_initial_camera.z,
+ g_camera_section_name, g_camera_initialz_name);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ /* Get the player's yaw/pitch orientation */
+
+ ret = trv_ini_short(inihandle, &g_initial_camera.yaw,
+ g_camera_section_name, g_camera_initialyaw_name);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ ret = trv_ini_short(inihandle, &g_initial_camera.pitch,
+ g_camera_section_name, g_camera_initialpitch_name);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ /* Get the height of the player */
+
+ ret = trv_ini_short(inihandle, &g_player_height,
+ g_player_section_name, g_player_height_name);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ /* Read the player's capability to step on top of things in the world. */
+
+ ret = trv_ini_short(inihandle, &g_walk_stepheight,
+ g_player_section_name, g_player_walkstepheight_name);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ ret = trv_ini_short(inihandle, &g_run_stepheight,
+ g_player_section_name, g_player_runstepheight_name);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ /* Get the name of the file containing the world map */
+
+ ret = trv_ini_filename(inihandle, &filename,
+ g_world_section_name, g_world_map_name);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ /* Allocate and load the world */
+
+ ret = trv_initialize_planes();
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ ret = trv_load_planefile(filename);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ inifile_free_string(filename);
+
+ /* Get the name of the file containing the palette table which is used
+ * to adjust the lighting with distance.
+ */
+
+ ret = trv_ini_filename(inihandle, &filename,
+ g_world_section_name, g_world_palette_name);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ /* Then load it into g_paltable. */
+
+ ret = trv_load_paltable(filename);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ inifile_free_string(filename);
+
+ /* Get the name of the file containing the texture data */
+
+ ret = trv_ini_filename(inihandle, &filename,
+ g_world_section_name, g_world_images_name);
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ /* Then load the bitmaps */
+
+ ret = trv_initialize_bitmaps();
+ if (ret < 0)
+ {
+ return ret;
+ }
+
+ ret = trv_load_bitmapfile(filename);
+ inifile_free_string(filename);
+
+ return ret;
+}
+
+/****************************************************************************
+ * Public Functions
+ ****************************************************************************/
+
+/****************************************************************************
+ * Name: trv_world_create
+ *
+ * Description:
+ * Load the world data structures from information in an INI file
+ *
+ ***************************************************************************/
+
+int trv_world_create(FAR const char *wldfile)
+{
+ INIHANDLE inihandle;
+ int ret;
+
+ /* Open the INI file which contains all of the information that we
+ * need to construct the world
+ */
+
+ inihandle = inifile_initialize(wldfile);
+ if (!inihandle)
+ {
+ fprintf(stderr, "ERROR: Could not open INI file=\"%s\"\n", wldfile);
+ return -ENOENT;
+ }
+
+ /* Load the world file data */
+
+ ret = trv_manage_wldfile(inihandle);
+
+ /* Close the INI file and return */
+
+ inifile_uninitialize(inihandle);
+ return ret;
+}
diff --git a/apps/graphics/traveler/src/trv_main.c b/apps/graphics/traveler/src/trv_main.c
index e3cb0c973..029fd4065 100644
--- a/apps/graphics/traveler/src/trv_main.c
+++ b/apps/graphics/traveler/src/trv_main.c
@@ -219,7 +219,7 @@ int traveler_main(int argc, char *argv[])
ret = trv_world_create(world_filename);
if (ret < 0)
{
- trv_abort("ERROR: %d loading world file %s: %d\n",
+ trv_abort("ERROR: Failed to load world file %s: %d\n",
world_filename, ret);
}