File: zbuffer.h

package info (click to toggle)
residualvm 0.1.1%2Bdfsg-3
  • links: PTS, VCS
  • area: contrib
  • in suites: jessie, jessie-kfreebsd
  • size: 18,456 kB
  • ctags: 20,564
  • sloc: cpp: 122,088; sh: 6,057; perl: 977; xml: 974; asm: 729; python: 564; makefile: 147; sed: 11; php: 1
file content (123 lines) | stat: -rw-r--r-- 3,543 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#ifndef GRAPHICS_TINYGL_ZBUFFER_H_
#define GRAPHICS_TINYGL_ZBUFFER_H_

#include "graphics/pixelbuffer.h"

namespace TinyGL {

// Z buffer

#define ZB_Z_BITS 16

#define ZB_POINT_Z_FRAC_BITS 14

#define ZB_POINT_S_MIN ( (1 << 13) )
#define ZB_POINT_S_MAX ( (1 << 22) - (1 << 13) )
#define ZB_POINT_T_MIN ( (1 << 21) )
#define ZB_POINT_T_MAX ( (1 << 30) - (1 << 21) )

#define ZB_POINT_RED_MIN ( (1 << 10) )
#define ZB_POINT_RED_MAX ( (1 << 16) - (1 << 10) )
#define ZB_POINT_GREEN_MIN ( (1 << 9) )
#define ZB_POINT_GREEN_MAX ( (1 << 16) - (1 << 9) )
#define ZB_POINT_BLUE_MIN ( (1 << 10) )
#define ZB_POINT_BLUE_MAX ( (1 << 16) - (1 << 10) )

// display modes
#define ZB_MODE_5R6G5B  1  // true color 16 bits

 #define RGB_TO_PIXEL(r,g,b) zb->cmode.RGBToColor(r, g, b)
typedef byte PIXEL;

#define PSZSH 4

extern uint8 PSZB;

struct Buffer {
	byte *pbuf;
	unsigned int *zbuf;
	bool used;
};

typedef struct {
	int xsize, ysize;
	int linesize; // line size, in bytes
	Graphics::PixelFormat cmode;
	int pixelbits;
	int pixelbytes;

	Buffer buffer;

	unsigned int *zbuf;
	unsigned char *shadow_mask_buf;
	int shadow_color_r;
	int shadow_color_g;
	int shadow_color_b;
	Graphics::PixelBuffer pbuf;
	int frame_buffer_allocated;

	unsigned char *dctable;
	int *ctable;
	Graphics::PixelBuffer current_texture;
} ZBuffer;

typedef struct {
	int x,y,z;     // integer coordinates in the zbuffer
	int s,t;       // coordinates for the mapping
	int r,g,b;     // color indexes

	float sz,tz;   // temporary coordinates for mapping
} ZBufferPoint;

// zbuffer.c

Buffer *ZB_genOffscreenBuffer(ZBuffer *zb);
void ZB_delOffscreenBuffer(ZBuffer *zb, Buffer *buffer);
/**
 * Blit the buffer to the screen buffer, checking the depth of the pixels.
 * Eack pixel is copied if and only if its depth value is bigger than the
 * depth value of the screen pixel, so if it is 'above'.
 */
void ZB_blitOffscreenBuffer(ZBuffer *zb, Buffer *buffer);
void ZB_selectOffscreenBuffer(ZBuffer *zb, Buffer *buffer);
void ZB_clearOffscreenBuffer(ZBuffer *zb, Buffer *buffer);

ZBuffer *ZB_open(int xsize, int ysize, const Graphics::PixelBuffer &buffer);
void ZB_close(ZBuffer *zb);
void ZB_resize(ZBuffer *zb, void *frame_buffer, int xsize, int ysize);
void ZB_clear(ZBuffer *zb, int clear_z, int z, int clear_color, int r, int g, int b);
// linesize is in BYTES
void ZB_copyFrameBuffer(ZBuffer *zb, void *buf, int linesize);

// zline.c

void ZB_plot(ZBuffer *zb,ZBufferPoint *p);
void ZB_line(ZBuffer *zb,ZBufferPoint *p1,ZBufferPoint *p2);
void ZB_line_z(ZBuffer * zb, ZBufferPoint * p1, ZBufferPoint * p2);

// ztriangle.c */

void ZB_setTexture(ZBuffer *zb, const Graphics::PixelBuffer &texture);
void ZB_fillTriangleFlat(ZBuffer *zb, ZBufferPoint *p1,
						 ZBufferPoint *p2, ZBufferPoint *p3);
void ZB_fillTriangleFlatShadowMask(ZBuffer *zb, ZBufferPoint *p1,
						 ZBufferPoint *p2, ZBufferPoint *p3);
void ZB_fillTriangleFlatShadow(ZBuffer *zb, ZBufferPoint *p1,
						 ZBufferPoint *p2, ZBufferPoint *p3);
void ZB_fillTriangleSmooth(ZBuffer *zb, ZBufferPoint *p1,
						   ZBufferPoint *p2, ZBufferPoint *p3);
void ZB_fillTriangleMapping(ZBuffer *zb, ZBufferPoint *p1,
							ZBufferPoint *p2, ZBufferPoint *p3);
void ZB_fillTriangleMappingPerspective(ZBuffer *zb, ZBufferPoint *p0,
									   ZBufferPoint *p1, ZBufferPoint *p2);
typedef void (*ZB_fillTriangleFunc)(ZBuffer *, ZBufferPoint *,
									ZBufferPoint *, ZBufferPoint *);

// memory.c
void gl_free(void *p);
void *gl_malloc(int size);
void *gl_zalloc(int size);

} // end of namespace TinyGL

#endif