|
|
@ -42,6 +42,8 @@ Raster::Raster(int width, int height) { |
|
|
|
_defaultUvPointer.data = _defaultUvArray; |
|
|
|
|
|
|
|
_matModel = matrix4(1); |
|
|
|
_matView = matrix4(1); |
|
|
|
_matProj = matrix4(1); |
|
|
|
} |
|
|
|
|
|
|
|
Raster::~Raster() { |
|
|
@ -185,7 +187,7 @@ void Raster::drawSpan(const Span &span, Image* image) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setPixel(i, span.y, color); |
|
|
|
setPixel(i, span.y, blendColor); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@ -224,7 +226,7 @@ void Raster::drawEge(const Ege& e1, const Ege& e2, Image* image) { |
|
|
|
} else { |
|
|
|
x2 = e2.x2 - xOffset2 * scale2; |
|
|
|
} |
|
|
|
color2 = colorLerp(e2.color1, e2.color2, scale2); |
|
|
|
color2 = colorLerp(e2.color2, e2.color1, scale2); |
|
|
|
uvE2 = uvLerp(e2.uv2, e2.uv1, scale2); |
|
|
|
scale2 += setp2; |
|
|
|
//setPixel(x2, y, Rgba(255,0,0));
|
|
|
@ -236,7 +238,7 @@ void Raster::drawEge(const Ege& e1, const Ege& e2, Image* image) { |
|
|
|
} else { |
|
|
|
x1 = e1.x2 - xOffset1 * scale1; |
|
|
|
} |
|
|
|
color1 = colorLerp(e1.color1, e1.color2, scale1); |
|
|
|
color1 = colorLerp(e1.color2, e1.color1, scale1); |
|
|
|
uvE1 = uvLerp(e1.uv2, e1.uv1, scale1); |
|
|
|
scale1 += setp1; |
|
|
|
//setPixel(x1, y, Rgba(255,0,0));
|
|
|
@ -263,8 +265,12 @@ void Raster::drawTriangle(Ege eges[3], Image* image) { |
|
|
|
int iShort1 = (iMax + 1) % 3; |
|
|
|
int iShort2 = (iMax + 2) % 3; |
|
|
|
|
|
|
|
|
|
|
|
//printf("max:%d (%d,%d) (%d,%d) (%d,%d,%d) (%d,%d,%d)\n", iMax,eges[iMax].x1, eges[iMax].y1, eges[iMax].x2, eges[iMax].y2, eges[iMax].color1._r, eges[iMax].color1._g, eges[iMax].color1._b, eges[iMax].color2._r, eges[iMax].color2._g, eges[iMax].color2._b);
|
|
|
|
//printf("sho:%d (%d,%d) (%d,%d) (%d,%d,%d) (%d,%d,%d)\n", iShort1,eges[iShort1].x1, eges[iShort1].y1, eges[iShort1].x2, eges[iShort1].y2, eges[iShort1].color1._r, eges[iShort1].color1._g, eges[iShort1].color1._b, eges[iShort1].color2._r, eges[iShort1].color2._g, eges[iShort1].color2._b);
|
|
|
|
|
|
|
|
drawEge(eges[iMax], eges[iShort1], image); |
|
|
|
drawEge(eges[iMax], eges[iShort2], image); |
|
|
|
//drawEge(eges[iMax], eges[iShort2], image);
|
|
|
|
} |
|
|
|
|
|
|
|
void Raster::drawTriangle(const Vertex& vertex, Image* image) { |
|
|
@ -320,67 +326,154 @@ void Raster::drawArrays(DRAWMODE pri, int start, int count) { |
|
|
|
char* cData = (char*) colorPointerdesc.data; |
|
|
|
char* uvData = (char*) uvPointerdesc.data; |
|
|
|
|
|
|
|
_matProjView = _matProj * _matView; |
|
|
|
matrix4 matPVT = _matProjView.transpose(); |
|
|
|
_frust.loadFrustum(matPVT); |
|
|
|
|
|
|
|
for (int i = start; i < start + count; i += 3) { |
|
|
|
|
|
|
|
float* pp = (float*) posData; |
|
|
|
float4 mp0(pp[0], pp[1], pp[2], 1); |
|
|
|
mp0 = _matModel * mp0; |
|
|
|
float3 mp0(pp[0], pp[1], pp[2]); |
|
|
|
|
|
|
|
posData += _positionPointer.stride; |
|
|
|
pp = (float*) posData; |
|
|
|
float4 mp1(pp[0], pp[1], pp[2], 1); |
|
|
|
mp1 = _matModel * mp1; |
|
|
|
float3 mp1(pp[0], pp[1], pp[2]); |
|
|
|
|
|
|
|
posData += _positionPointer.stride; |
|
|
|
pp = (float*) posData; |
|
|
|
float4 mp2(pp[0], pp[1], pp[2], 1); |
|
|
|
mp2 = _matModel * mp2; |
|
|
|
float3 mp2(pp[0], pp[1], pp[2]); |
|
|
|
|
|
|
|
int2 p0(mp0.x, mp0.y); |
|
|
|
int2 p1(mp1.x, mp1.y); |
|
|
|
int2 p2(mp2.x, mp2.y); |
|
|
|
|
|
|
|
posData += _positionPointer.stride; |
|
|
|
|
|
|
|
Rgba* pc = (Rgba*) cData; |
|
|
|
Rgba c0(*pc); |
|
|
|
cData += _colorPointer.stride; |
|
|
|
pc = (Rgba*) cData; |
|
|
|
Rgba c1(*pc); |
|
|
|
cData += _colorPointer.stride; |
|
|
|
pc = (Rgba*) cData; |
|
|
|
Rgba c2(*pc); |
|
|
|
cData += _colorPointer.stride; |
|
|
|
|
|
|
|
float* puv = (float*) uvData; |
|
|
|
float2 uv0(puv[0], puv[1]); |
|
|
|
uvData += _uvPointer.stride; |
|
|
|
puv = (float*) uvData; |
|
|
|
float2 uv1(puv[0], puv[1]); |
|
|
|
uvData += _uvPointer.stride; |
|
|
|
puv = (float*) uvData; |
|
|
|
float2 uv2(puv[0], puv[1]); |
|
|
|
uvData += _uvPointer.stride; |
|
|
|
|
|
|
|
Ege eges[3] = { |
|
|
|
Ege(p0.x, p0.y, p1.x, p1.y, c0, c1, uv0, uv1), |
|
|
|
Ege(p1.x, p1.y, p2.x, p2.y, c1, c2, uv1, uv2), |
|
|
|
Ege(p2.x, p2.y, p0.x, p0.y, c2, c0, uv2, uv0), |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
drawTriangle(eges, _texture); |
|
|
|
|
|
|
|
if (_colorPointer.data == 0) { |
|
|
|
cData = (char*) colorPointerdesc.data; |
|
|
|
} |
|
|
|
mp0 = mp0 * _matModel; |
|
|
|
mp1 = mp1 * _matModel; |
|
|
|
mp2 = mp2 * _matModel; |
|
|
|
|
|
|
|
if (_frust.pointInFrustum(mp0) || _frust.pointInFrustum(mp1) || _frust.pointInFrustum(mp2)) { |
|
|
|
|
|
|
|
mp0 = piplineTransform(mp0); |
|
|
|
mp1 = piplineTransform(mp1); |
|
|
|
mp2 = piplineTransform2(mp2); |
|
|
|
|
|
|
|
int2 p0(mp0.x, mp0.y); |
|
|
|
int2 p1(mp1.x, mp1.y); |
|
|
|
int2 p2(mp2.x, mp2.y); |
|
|
|
|
|
|
|
posData += _positionPointer.stride; |
|
|
|
|
|
|
|
Rgba* pc = (Rgba*) cData; |
|
|
|
Rgba c0(*pc); |
|
|
|
cData += _colorPointer.stride; |
|
|
|
pc = (Rgba*) cData; |
|
|
|
Rgba c1(*pc); |
|
|
|
cData += _colorPointer.stride; |
|
|
|
pc = (Rgba*) cData; |
|
|
|
Rgba c2(*pc); |
|
|
|
cData += _colorPointer.stride; |
|
|
|
|
|
|
|
float* puv = (float*) uvData; |
|
|
|
float2 uv0(puv[0], puv[1]); |
|
|
|
uvData += _uvPointer.stride; |
|
|
|
puv = (float*) uvData; |
|
|
|
float2 uv1(puv[0], puv[1]); |
|
|
|
uvData += _uvPointer.stride; |
|
|
|
puv = (float*) uvData; |
|
|
|
float2 uv2(puv[0], puv[1]); |
|
|
|
uvData += _uvPointer.stride; |
|
|
|
|
|
|
|
Ege eges[3] = { |
|
|
|
Ege(p0.x, p0.y, p1.x, p1.y, c0, c1, uv0, uv1), |
|
|
|
Ege(p1.x, p1.y, p2.x, p2.y, c1, c2, uv1, uv2), |
|
|
|
Ege(p2.x, p2.y, p0.x, p0.y, c2, c0, uv2, uv0), |
|
|
|
}; |
|
|
|
|
|
|
|
if (_uvPointer.data == 0) { |
|
|
|
uvData = (char*) uvPointerdesc.data; |
|
|
|
|
|
|
|
drawTriangle(eges, _texture); |
|
|
|
|
|
|
|
if (_colorPointer.data == 0) { |
|
|
|
cData = (char*) colorPointerdesc.data; |
|
|
|
} |
|
|
|
|
|
|
|
if (_uvPointer.data == 0) { |
|
|
|
uvData = (char*) uvPointerdesc.data; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
float3 Raster::piplineTransform2(float3 pos) { |
|
|
|
float4 world(pos.x, pos.y, pos.z, 1); |
|
|
|
|
|
|
|
float4 screen = _matProjView * world; |
|
|
|
if (screen.w == 0.0f) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
//printf("1 %f %f %f\n",screen.x, screen.y, screen.z);
|
|
|
|
|
|
|
|
screen.x /= screen.w; |
|
|
|
screen.y /= screen.w; |
|
|
|
screen.z /= screen.w; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// map to range 0 - 1
|
|
|
|
screen.x = screen.x * 0.5f + 0.5f; |
|
|
|
screen.y = screen.y * 0.5f + 0.5f; |
|
|
|
screen.z = screen.z * 0.5f + 0.5f; |
|
|
|
|
|
|
|
// map to viewport
|
|
|
|
screen.x = screen.x * _viewPort.x; |
|
|
|
screen.y = screen.y * _viewPort.y; |
|
|
|
//screen.y = _viewPort.y - (screen.y * _viewPort.y);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return float3(screen.x, screen.y, screen.z); |
|
|
|
} |
|
|
|
|
|
|
|
float3 Raster::piplineTransform(float3 pos) { |
|
|
|
float4 world(pos.x, pos.y, pos.z, 1); |
|
|
|
|
|
|
|
float4 screen = _matProjView * world; |
|
|
|
if (screen.w == 0.0f) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
screen.x /= screen.w; |
|
|
|
screen.y /= screen.w; |
|
|
|
screen.z /= screen.w; |
|
|
|
|
|
|
|
// map to range 0 - 1
|
|
|
|
screen.x = screen.x * 0.5f + 0.5f; |
|
|
|
screen.y = screen.y * 0.5f + 0.5f; |
|
|
|
screen.z = screen.z * 0.5f + 0.5f; |
|
|
|
|
|
|
|
// map to viewport
|
|
|
|
screen.x = screen.x * _viewPort.x; |
|
|
|
screen.y = screen.y * _viewPort.y; |
|
|
|
//screen.y = _viewPort.y - (screen.y * _viewPort.y);
|
|
|
|
|
|
|
|
return float3(screen.x, screen.y, screen.z); |
|
|
|
} |
|
|
|
|
|
|
|
void Raster::loadProjMatrix(const matrix4& mat) { |
|
|
|
_matProj = mat; |
|
|
|
} |
|
|
|
|
|
|
|
void Raster::loadProjIdentity() { |
|
|
|
_matProj = matrix4(1); |
|
|
|
} |
|
|
|
|
|
|
|
void Raster::loadViewMatrix(const matrix4& mat) { |
|
|
|
_matView = mat; |
|
|
|
} |
|
|
|
|
|
|
|
void Raster::loadViewIdentity() { |
|
|
|
_matView = matrix4(1); |
|
|
|
} |
|
|
|
|
|
|
|
void Raster::loadMatrix(const matrix4& mat) { |
|
|
|
_matModel = mat; |
|
|
|
} |
|
|
@ -389,6 +482,19 @@ void Raster::loadIdentity() { |
|
|
|
_matModel = matrix4(1); |
|
|
|
} |
|
|
|
|
|
|
|
void Raster::setPerspective(float fovy, float aspect, float zNear, float zFar) { |
|
|
|
_matProj = perspective<float>(fovy, aspect, zNear, zFar); |
|
|
|
} |
|
|
|
|
|
|
|
void Raster::lookat(float3 const & eye, float3 const & center, float3 const & up) { |
|
|
|
_matView = lookAt(eye, center, up); |
|
|
|
} |
|
|
|
|
|
|
|
void Raster::setViewPort(int x, int y, int w, int h) { |
|
|
|
_viewPort.x = w; |
|
|
|
_viewPort.y = h; |
|
|
|
} |
|
|
|
|
|
|
|
void Raster::bindTexture(Image* image) { |
|
|
|
_texture = image; |
|
|
|
} |
|
|
|