45BWRenderClass::Buffer::Buffer(
unsigned char* buffer_,
int scale_)
54BWRenderClass::Buffer::~Buffer()
58void BWRenderClass::Buffer::Set_H_Line(
int start_x,
int end_x,
int y)
60 if (y<minv || y>=maxv || end_x<minv || start_x>=maxv)
return;
61 if (start_x<minv) start_x=minv;
62 if (end_x>=maxv) end_x=maxv-1;
81void BWRenderClass::Buffer::Fill(
unsigned char c)
90 pixel_buffer(buffer,buffer_scale)
100 pixel_buffer.Fill(c);
108 float half_scale=pixel_buffer.
Scale()*0.5f;
110 reinterpret_cast<float*
>(vertices),
118static inline bool Cull(
123 float x1=c2[0]-c1[0];
124 float y1=c2[1]-c1[1];
125 float x2=c3[0]-c1[0];
126 float y2=c3[1]-c1[1];
128 if (r<0)
return false;
136 for (
int n=0;n<index_count;++n) {
138 int idx_1=indices[0];
139 int idx_2=indices[1];
140 int idx_3=indices[2];
143 if (Cull(vertices[idx_1],vertices[idx_2],vertices[idx_3])==b)
continue;
145 Vector2 corner_1(vertices[idx_1][0],vertices[idx_1][1]);
146 Vector2 corner_2(vertices[idx_2][0],vertices[idx_2][1]);
147 Vector2 corner_3(vertices[idx_3][0],vertices[idx_3][1]);
151 if (corner_2[1]<corner_1[1])
Swap(corner_1,corner_2);
152 if (corner_3[1]<corner_1[1])
Swap(corner_1,corner_3);
153 if (corner_3[1]<corner_2[1])
Swap(corner_2,corner_3);
156 Vector3 xcf(corner_1[0],corner_2[0],corner_3[0]);
158 Render_Preprocessed_Triangle(xcf,yci);
165 for (
int n=0;n<index_count;++n) {
166 int idx_1=*indices++;
167 int idx_2=*indices++;
168 int idx_3=*indices++;
170 if (Cull(vertices[idx_1],vertices[idx_2],vertices[idx_3]))
continue;
172 Vector2 corner_1(vertices[idx_1][0],vertices[idx_1][1]);
173 Vector2 corner_2(vertices[idx_2][0],vertices[idx_2][1]);
174 Vector2 corner_3(vertices[idx_3][0],vertices[idx_3][1]);
178 if (corner_2[1]<corner_1[1])
Swap(corner_1,corner_2);
179 if (corner_3[1]<corner_1[1])
Swap(corner_1,corner_3);
180 if (corner_3[1]<corner_2[1])
Swap(corner_2,corner_3);
183 Vector3 xcf(corner_1[0],corner_2[0],corner_3[0]);
185 Render_Preprocessed_Triangle(xcf,yci);
189void BWRenderClass::Render_Preprocessed_Triangle(
Vector3& xcf,
Vector3i& yci)
192 float x_right=x_left;
193 int ycnt=yci[1]-yci[0];
196 float x_step_1=(xcf[1]-xcf[0])/
float(ycnt);
197 float x_step_2=(xcf[2]-xcf[0])/
float(yci[2]-y);
198 if (x_step_1>x_step_2) {
229 float one_per_ycnt=1.0f/float(ycnt);
230 float x_step_1=(xcf[2]-x_left)*one_per_ycnt;
231 float x_step_2=(xcf[2]-x_right)*one_per_ycnt;
Color scale(const Color &a, const Color &b)
WWINLINE void Swap(Vector2 &a, Vector2 &b)
void Set_Vertex_Locations(Vector2 *vertices, int count)
void Render_Triangle_Strip(const unsigned long *indices, int index_count)
void Render_Triangles(const unsigned long *indices, int index_count)
BWRenderClass(unsigned char *buffer, int scale)
void Fill(unsigned char c)
WWINLINE void Scale(float a, float b)
static void MulAdd(float *dest, float multiplier, float add, int count)
static long Float_To_Long(float f)