Initial revision
[blender.git] / source / blender / render / intern / include / zbuf_int.h
1 /*
2  * zbuf_int.h
3  * internal interface for zbuf.h (ie. functions that are not used
4  * anywhere else) 
5  *
6  * $Id$
7  *
8  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version. The Blender
14  * Foundation also sells licenses for use in proprietary software under
15  * the Blender License.  See http://www.blender.org/BL/ for information
16  * about this.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software Foundation,
25  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
26  *
27  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
28  * All rights reserved.
29  *
30  * The Original Code is: all of this file.
31  *
32  * Contributor(s): none yet.
33  *
34  * ***** END GPL/BL DUAL LICENSE BLOCK *****
35  */
36
37 #ifndef ZBUF_INT_H
38 #define ZBUF_INT_H
39
40 #include "render_types.h"
41 #include "zbuf_types.h"
42
43
44
45 /**
46  * Convert a homogenous coordinate to a z buffer coordinate. The
47  * function makes use of Zmulx, Zmuly, the x and y scale factors for
48  * the screen, and Zjitx, Zjity, the pixel offset. (These are declared
49  * in render.c) The normalised z coordinate must fall on [0, 1]. 
50  * @param zco  [3, 4 floats] pointer to the resulting z buffer coordinate
51  * @param hoco [4 floats] pointer to the homogenous coordinate of the
52  * vertex in world space.
53  */
54 void hoco_to_zco(float *zco, float *hoco);
55
56 /**
57  * Fill the z buffer for alpha?
58  *
59  * This is one of the z buffer fill functions called in zbufclip() and
60  * zbufwireclip(). 
61  *
62  * @param v1 [4 floats, world coordinates] first vertex
63  * @param v2 [4 floats, world coordinates] second vertex
64  * @param v3 [4 floats, world coordinates] third vertex
65  */
66 void zbufinvulAc(float *v1, float *v2, float *v3);
67
68 /**
69  * Fill the z buffer, but invert z order, and add the face index to
70  * the corresponing face buffer.
71  *
72  * This is one of the z buffer fill functions called in zbufclip() and
73  * zbufwireclip(). 
74  *
75  * @param v1 [4 floats, world coordinates] first vertex
76  * @param v2 [4 floats, world coordinates] second vertex
77  * @param v3 [4 floats, world coordinates] third vertex
78  */
79 void zbufinvulGLinv(float *v1, float *v2, float *v3);
80
81 /**
82  * Fill the z buffer, and add the face index to
83  * the corresponing face buffer.  Writes into R.rectz and R.rectot. It
84  * assumes that Zvlnr is set to the face index of the face under
85  * consideration. Zvlnr is written into R.rectot. R.rectz
86  *
87  * This is one of the z buffer fill functions called in zbufclip() and
88  * zbufwireclip(). 
89  *
90  * @param v1 [4 floats, world coordinates] first vertex
91  * @param v2 [4 floats, world coordinates] second vertex
92  * @param v3 [4 floats, world coordinates] third vertex
93  */
94 void zbufinvulGL(float *v1, float *v2, float *v3);
95
96 /**
97  * Fill the z buffer. The face buffer is not operated on!
98  *
99  * This is one of the z buffer fill functions called in zbufclip() and
100  * zbufwireclip(). 
101  *
102  * @param v1 [4 floats, world coordinates] first vertex
103  * @param v2 [4 floats, world coordinates] second vertex
104  * @param v3 [4 floats, world coordinates] third vertex
105  */
106 void zbufinvulGL_onlyZ(float *v1, float *v2, float *v3);
107
108 /**
109  * Prints 3 unlabelled floating point values to stdout. Used for diagnostics.
110  * @param v1 any float
111  * @param v2 any float
112  * @param v3 any float
113  */
114 void print3floats(float *v1, float *v2, float *v3);
115
116 /**
117  * Checks labda and uses this to make decision about clipping the line
118  * segment from v1 to v2. labda is the factor by which the vector is
119  * cut. ( calculate s + l * ( t - s )). The result is appended to the
120  * vertex list of this face.
121  * Note: uses globals.
122  * (arguments: one int, one pointer to int... why?)
123  * @param v1 start coordinate s
124  * @param v2 target coordinate t
125  * @param b1 
126  * @param b2 
127  * @param clve vertex vector.
128  */
129 static void  maakvertpira(float *v1, float *v2, int *b1, int b2, int *clve);
130
131 /**
132  * Sets labda: flag, and parametrize the clipping of vertices in
133  * viewspace coordinates. labda = -1 means no clipping, labda in [0,
134  * 1] means a clipping.
135  * Note: uses globals.
136  * @param v1 start coordinate s
137  * @param v2 target coordinate t
138  * @param b1 
139  * @param b2 
140  * @param b3
141  * @param a index for coordinate (x, y, or z)
142  */
143 static void  clipp(float *v1, float *v2, int b1, int *b2, int *b3, int a);
144
145 /**
146  * Tests whether this coordinate is 'inside' or 'outside' of the view
147  * volume? By definition, this is in [0, 1]. 
148  * @param p vertex z difference plus coordinate difference?
149  * @param q origin z plus r minus some coordinate?
150  * @param u1 [in/out] clip fraction for ?
151  * @param u2 [in/out]
152  * @return 0 if point is outside, or 1 if the point lies on the clip
153  *         boundary 
154  */
155 static short cliptestf(float p, float q, float *u1, float *u2);
156
157
158 /* not documented yet */
159 /* not sure if these should stay static... */
160
161 static int   clipline(float *v1, float *v2);
162
163 /**
164  * Provide book-keeping for the z buffer data lists.
165  */
166 APixstr     *addpsmainA(void);
167 void         freepsA(void);
168 APixstr     *addpsA(void);
169
170 /**
171  * Fill function for the z buffer (fills lines)
172  */
173 void         zbuflineAc(float *vec1, float *vec2);
174 void         zbufline(float *vec1, float *vec2);
175
176
177 /**
178  * Copy results from the solid face z buffering to the transparent
179  * buffer.
180  */
181 void         copyto_abufz(int sample);
182
183 /**
184  * Do accumulation z buffering.
185  */
186 void         zbuffer_abuf(void);
187
188 /**
189  * Shade this face at this location in SCS.
190  */
191 void         shadetrapixel(float x, float y, int vlak);
192
193 /**
194  * Determine the distance to the camera of this halo, in ZCS.
195  */
196 unsigned int         calcHaloDist(HaloRen *har);
197
198 #endif /* ZBUF_INT_H */
199
200
201
202
203