62 Verts.Delete_All(
false);
76 int vcount =
Verts.Count();
77 int iprev = vcount - 1;
78 bool cur_point_in_front;
79 bool prev_point_in_front;
83 if (vcount <= 2)
return;
87 for (
int j=0; j<vcount; j++) {
90 if (prev_point_in_front) {
92 if (cur_point_in_front) {
110 if (cur_point_in_front) {
123 prev_point_in_front = cur_point_in_front;
160 IDBuffer.Set_Resolution(width,height);
165 IDBuffer.Get_Resolution(set_width,set_height);
198 Camera->Get_View_Matrix(&view_tm);
201#ifdef ALLOW_TEMPORARIES
255 bool pixel_passed =
false;
265 for (
int i=0; i<vcount; i++) {
266 Camera->Project_Camera_Space_Point(tverts[i],tverts[i]);
272 for (
int tri_index=0; tri_index<tcount; tri_index++) {
274 const TriIndex & tri = tris[tri_index];
275 pixel_passed |=
IDBuffer.Render_Triangle(tverts[tri.
I],tverts[tri.
J],tverts[tri.
K]);
292 bool pixel_passed =
false;
310 for (
int tri_index=0; tri_index<tcount; tri_index++) {
316 _VisPoly0.Add_Vertex(tverts[tris[tri_index].
I]);
317 _VisPoly0.Add_Vertex(tverts[tris[tri_index].J]);
318 _VisPoly0.Add_Vertex(tverts[tris[tri_index].K]);
323 _VisPoly0.Clip(planes[0],_VisPoly1);
324 _VisPoly1.Clip(planes[1],_VisPoly0);
325 _VisPoly0.Clip(planes[2],_VisPoly1);
326 _VisPoly1.Clip(planes[3],_VisPoly0);
327 _VisPoly0.Clip(planes[4],_VisPoly1);
328 _VisPoly1.Clip(planes[5],_VisPoly0);
333 int final_vcount = _VisPoly0.Verts.Count();
335 if (final_vcount >= 3) {
337 Vector3 * final_verts = &(_VisPoly0.Verts[0]);
340 for (i=0; i<final_vcount; i++) {
341 Camera->Project_Camera_Space_Point(final_verts[i],final_verts[i]);
347 for (i=1; i<final_vcount - 1; i++) {
349 pixel_passed |=
IDBuffer.Render_Triangle(final_verts[0],final_verts[i],final_verts[i+1]);
452 float oodx = 1 / ( ((verts[1].
X - verts[2].
X) * (verts[0].
Y - verts[2].
Y)) -
453 ((verts[0].
X - verts[2].
X) * (verts[1].
Y - verts[2].
Y)));
456 for(
int i=0; i<3; i++) {
457 OOZ[i] = 1/verts[i].
Z;
461 ((
OOZ[0] -
OOZ[2]) * (verts[1].
Y - verts[2].
Y)));
464 ((
OOZ[0] -
OOZ[2]) * (verts[1].
X - verts[2].
X)));
484 float y_prestep =
Y - verts[top].
Y;
485 float real_height = verts[bottom].
Y - verts[top].
Y;
486 float real_width = verts[bottom].
X - verts[top].
X;
488 X = ((real_width * y_prestep)/real_height) + verts[top].
X;
489 XStep = real_width / real_height;
490 float x_prestep =
X - verts[top].
X;
520 int pixels_passed = 0;
539 points[0].
X = 0.5f * (p0.
X + 1.0f) *
ResWidth;
540 points[1].
X = 0.5f * (p1.
X + 1.0f) *
ResWidth;
541 points[2].
X = 0.5f * (p2.
X + 1.0f) *
ResWidth;
547 points[0].
Z = 0.5f * (p0.
Z + 1.001f) * 1000.0f;
548 points[1].
Z = 0.5f * (p1.
Z + 1.001f) * 1000.0f;
549 points[2].
Z = 0.5f * (p2.
Z + 1.001f) * 1000.0f;
554 float y0 = points[0].
Y;
555 float y1 = points[1].
Y;
556 float y2 = points[2].
Y;
558 int top,middle,bottom,middle_for_compare,bottom_for_compare;
562 top = 2; middle = 0; bottom = 1;
563 middle_for_compare = 0; bottom_for_compare = 1;
567 middle = 1; bottom = 2;
568 middle_for_compare = 1; bottom_for_compare = 2;
570 middle = 2; bottom = 1;
571 middle_for_compare = 2; bottom_for_compare = 1;
576 top = 2; middle = 1; bottom = 0;
577 middle_for_compare = 1; bottom_for_compare = 0;
581 middle = 0; bottom = 2;
582 middle_for_compare = 3; bottom_for_compare = 2;
584 middle = 2; bottom = 0;
585 middle_for_compare = 2; bottom_for_compare = 3;
594 EdgeStruct top_to_bottom_edge(grads,points,top,bottom);
595 EdgeStruct top_to_middle_edge(grads,points,top,middle);
596 EdgeStruct middle_to_bottom_edge(grads,points,middle,bottom);
601 bool middle_is_left =
false;
602 if (bottom_for_compare > middle_for_compare) {
603 middle_is_left = 1 ^ is_backfacing;
605 middle_is_left = 0 ^ is_backfacing;
607 if (middle_is_left) {
608 left_edge = &top_to_middle_edge;
609 right_edge = &top_to_bottom_edge;
611 left_edge = &top_to_bottom_edge;
612 right_edge = &top_to_middle_edge;
618 int height = top_to_middle_edge.
Height;
630 if (middle_is_left) {
631 left_edge = &middle_to_bottom_edge;
632 right_edge = &top_to_bottom_edge;
634 left_edge = &top_to_bottom_edge;
635 right_edge = &middle_to_bottom_edge;
638 height = middle_to_bottom_edge.
Height;
649 return (pixels_passed > 0);
665 float xprestep = (float)xstart - left->
X;
667 float ooz = left->
OOZ + xprestep * grads.
DOOZ_DX;
668 int pixel_counter = 0;
674 while (width-- > 0) {
687 while (width-- > 0) {
699 return pixel_counter;
715 float xprestep = (float)xstart - left->
X;
717 float ooz = left->
OOZ + xprestep * grads.
DOOZ_DX;
719 while (width-- > 0) {
static OverlapType Overlap_Test(const AAPlaneClass &plane, const Vector3 &point)
void Get_Resolution(int *get_w, int *get_h)
int Render_Non_Occluder_Scanline(GradientsStruct &grads, EdgeStruct *left, EdgeStruct *right)
bool Is_Backfacing(const Vector3 &p0, const Vector3 &p1, const Vector3 &p2)
int Render_Occluder_Scanline(GradientsStruct &grads, EdgeStruct *left, EdgeStruct *right)
void Allocate_Buffers(void)
bool TwoSidedRenderingEnabled
int Pixel_Coords_To_Address(int x, int y)
void Set_Resolution(int w, int h)
bool Render_Triangle(const Vector3 &p0, const Vector3 &p1, const Vector3 &p2)
bool Compute_Intersection(const Vector3 &p0, const Vector3 &p1, float *set_t) const
bool In_Front(const Vector3 &point) const
static void Lerp(const Vector3 &a, const Vector3 &b, float alpha, Vector3 *set_result)
static void Transform(Vector3 *dst, const Vector3 *src, const Matrix3D &matrix, const int count)
SimpleDynVecClass< Vector3 > Verts
void Add_Vertex(const Vector3 &point)
void Clip(const PlaneClass &plane, VisPolyClass &dest) const
void Set_Camera(CameraClass *camera)
bool Render_Triangles_No_Clip(const Vector3 *verts, int vcount, const TriIndex *tris, int tcount)
CameraClass * Peek_Camera(void)
bool Render_Triangles_Clip(const Vector3 *verts, int vcount, const TriIndex *tris, int tcount)
void Get_Resolution(int *set_width, int *set_height)
void Set_Model_Transform(const Matrix3D &model)
SimpleVecClass< Vector3 > TempVertexBuffer
const Matrix3D & Get_MV_Transform(void)
void Update_MV_Transform(void)
bool Render_Triangles(const Vector3 *verts, int vcount, const TriIndex *tris, int tcount, const AABoxClass &bounds)
Vector3 * Get_Temp_Vertex_Buffer(int count)
~VisRasterizerClass(void)
CameraClass * Get_Camera(void)
void Set_Resolution(int width, int height)
static float Max(float a, float b)
static float Ceil(float val)
static long Float_To_Long(float f)
#define REF_PTR_RELEASE(x)
#define REF_PTR_SET(dst, src)
EdgeStruct(const GradientsStruct &grad, const Vector3 *verts, int top, int bottom)
GradientsStruct(const Vector3 *verts)