summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/emu/video/poly.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/emu/video/poly.h')
-rw-r--r--trunk/src/emu/video/poly.h156
1 files changed, 156 insertions, 0 deletions
diff --git a/trunk/src/emu/video/poly.h b/trunk/src/emu/video/poly.h
new file mode 100644
index 00000000000..d8120d6e8bb
--- /dev/null
+++ b/trunk/src/emu/video/poly.h
@@ -0,0 +1,156 @@
+/***************************************************************************
+
+ poly.h
+
+ New polygon helper routines.
+
+****************************************************************************
+
+ Pixel model:
+
+ (0.0,0.0) (1.0,0.0) (2.0,0.0) (3.0,0.0)
+ +---------------+---------------+---------------+
+ | | | |
+ | | | |
+ | (0.5,0.5) | (1.5,0.5) | (2.5,0.5) |
+ | * | * | * |
+ | | | |
+ | | | |
+ (0.0,1.0) (1.0,1.0) (2.0,1.0) (3.0,1.0)
+ +---------------+---------------+---------------+
+ | | | |
+ | | | |
+ | (0.5,1.5) | (1.5,1.5) | (2.5,1.5) |
+ | * | * | * |
+ | | | |
+ | | | |
+ | | | |
+ +---------------+---------------+---------------+
+ (0.0,2.0) (1.0,2.0) (2.0,2.0) (3.0,2.0)
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __POLYNEW_H__
+#define __POLYNEW_H__
+
+
+/***************************************************************************
+ CONSTANTS
+***************************************************************************/
+
+#define MAX_VERTEX_PARAMS 6
+#define MAX_POLYGON_VERTS 32
+
+#define POLYFLAG_INCLUDE_BOTTOM_EDGE 0x01
+#define POLYFLAG_INCLUDE_RIGHT_EDGE 0x02
+#define POLYFLAG_NO_WORK_QUEUE 0x04
+#define POLYFLAG_ALLOW_QUADS 0x08
+
+
+
+/***************************************************************************
+ TYPE DEFINITIONS
+***************************************************************************/
+
+/* opaque reference to the poly manager */
+typedef struct _poly_manager poly_manager;
+
+
+/* input vertex data */
+typedef struct _poly_vertex poly_vertex;
+struct _poly_vertex
+{
+ float x; /* X coordinate */
+ float y; /* Y coordinate */
+ float p[MAX_VERTEX_PARAMS]; /* interpolated parameter values */
+};
+
+
+/* poly_param_extent describes information for a single parameter in an extent */
+typedef struct _poly_param_extent poly_param_extent;
+struct _poly_param_extent
+{
+ float start; /* parameter value at starting X,Y */
+ float dpdx; /* dp/dx relative to starting X */
+};
+
+
+/* poly_extent describes start/end points for a scanline, along with per-scanline parameters */
+typedef struct _poly_extent poly_extent;
+struct _poly_extent
+{
+ INT16 startx; /* starting X coordinate (inclusive) */
+ INT16 stopx; /* ending X coordinate (exclusive) */
+ poly_param_extent param[MAX_VERTEX_PARAMS]; /* starting and dx values for each parameter */
+};
+
+
+/* callback routine to process a batch of scanlines in a triangle */
+typedef void (*poly_draw_scanline_func)(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid);
+
+
+
+/***************************************************************************
+ TYPE DEFINITIONS
+***************************************************************************/
+
+
+/* ----- initialization/teardown ----- */
+
+/* allocate a new poly manager that can render triangles */
+poly_manager *poly_alloc(running_machine &machine, int max_polys, size_t extra_data_size, UINT8 flags);
+
+/* free a poly manager */
+void poly_free(poly_manager *poly);
+
+
+
+/* ----- common functions ----- */
+
+/* wait until all polygons in the queue have been rendered */
+void poly_wait(poly_manager *poly, const char *debug_reason);
+
+/* get a pointer to the extra data for the next polygon */
+void *poly_get_extra_data(poly_manager *poly);
+
+
+
+/* ----- core triangle rendering ----- */
+
+/* render a single triangle given 3 vertexes */
+UINT32 poly_render_triangle(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, const poly_vertex *v1, const poly_vertex *v2, const poly_vertex *v3);
+
+/* render a set of triangles in a fan */
+UINT32 poly_render_triangle_fan(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v);
+
+/* perform a custom render of an object, given specific extents */
+UINT32 poly_render_triangle_custom(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int startscanline, int numscanlines, const poly_extent *extents);
+
+
+
+/* ----- core quad rendering ----- */
+
+/* render a single quad given 4 vertexes */
+UINT32 poly_render_quad(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, const poly_vertex *v1, const poly_vertex *v2, const poly_vertex *v3, const poly_vertex *v4);
+
+/* render a set of quads in a fan */
+UINT32 poly_render_quad_fan(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v);
+
+
+
+/* ----- core polygon rendering ----- */
+
+/* render a single polygon up to 32 vertices */
+UINT32 poly_render_polygon(poly_manager *poly, void *dest, const rectangle &cliprect, poly_draw_scanline_func callback, int paramcount, int numverts, const poly_vertex *v);
+
+
+
+/* ----- clipping ----- */
+
+/* zclip (assumes p[0] == z) a polygon */
+int poly_zclip_if_less(int numverts, const poly_vertex *v, poly_vertex *outv, int paramcount, float clipval);
+
+
+#endif /* __POLY_H__ */