📄 graphics3d.cpp
字号:
r += (RCOLOR(color)>>1);
if (b>255)
b = 255;
if (g>255)
g = 255;
if (r>255)
r = 255;
m_pCurrentRenderTarget->m_pColorBuffer[pos] = MAKERGB(r, g, b);
}
pos --;
nx += delta;
}
// bottom right
pos = (SCREEN_HEIGHT-k)*SCREEN_WIDTH+rx;
temp1 = pos-rx+endx;
nx = nindex + rn;
if (m_renderParam & RP_MIRROR)
while (pos <= temp1) {
if ((m_pCurrentRenderTarget->m_pColorBuffer[pos]) && (temp > m_pCurrentRenderTarget->m_pMirrorBuffer[pos])) {
m_pCurrentRenderTarget->m_pMirrorBuffer[pos] = temp;
vertex = SphereNormal[nx>>SHIFT];
vertex.y = -vertex.y;
vertex2 = matmidself.TransformNormal(vertex);
v = (vertex2.z+(1<<COS_SIN_SHIFT))<<m_curTexture->m_shift>>COS_SIN_SHIFT>>1;
u = Atan2i(vertex2.x, vertex2.y)<<m_curTexture->m_shift>>11;
color = m_pCurrentRenderTarget->m_pColorBuffer[pos];
r = RCOLOR(color);
g = GCOLOR(color);
b = BCOLOR(color);
color = pData[(v<<m_curTexture->m_shift)|u];
int r2 = RCOLOR(color);
int g2 = GCOLOR(color);
int b2 = BCOLOR(color);
r = (r*6 + r2*2) >>3;
g = (g*6 + g2*2) >>3;
b = (b*6 + b2*2) >>3;
m_pCurrentRenderTarget->m_pColorBuffer[pos] = MAKERGB(r, g, b);
}
pos ++;
nx += delta;
}
else
while (pos <= temp1) {
if (temp > m_pCurrentRenderTarget->m_pZBuffer[pos]) {
m_pCurrentRenderTarget->m_pZBuffer[pos] = temp;
vertex = SphereNormal[nx>>SHIFT];
vertex.y = -vertex.y;
vertex2 = matmidworld.TransformNormal(vertex);
sstemp = 0;
for (i=0; i<m_onBallLight; i++) {
temp2 = l[i].ball2pos * vertex2>>COS_SIN_SHIFT<<SHIFT>>COS_SIN_SHIFT;
if (temp2 >= 0) {
stemp = (l[i].vn * vertex2 >>COS_SIN_SHIFT);
stemp = stemp*stemp >>COS_SIN_SHIFT;
stemp = stemp*stemp >>COS_SIN_SHIFT;
stemp = stemp*stemp >>COS_SIN_SHIFT;
stemp = stemp*stemp >>COS_SIN_SHIFT;
stemp = (stemp*stemp >>COS_SIN_SHIFT <<SHIFT >>COS_SIN_SHIFT) *l[i].dist >>SHIFT;
sstemp += stemp;
}
}
if (pData2) {
v = (vertex2.z+(1<<COS_SIN_SHIFT))<<m_envTexture->m_shift>>COS_SIN_SHIFT>>1;
u = Atan2i(vertex2.x, vertex2.y)<<m_envTexture->m_shift>>11;
color = pData2[(v<<m_envTexture->m_shift)|u];
b = (BCOLOR(color)>>1) + sstemp;
g = (GCOLOR(color)>>1) + sstemp;
r = (RCOLOR(color)>>1) + sstemp;
} else
b = g = r = sstemp;
vertex = matworldself.TransformNormal(vertex2);
v = (vertex.z+(1<<COS_SIN_SHIFT))<<m_curTexture->m_shift>>COS_SIN_SHIFT>>1;
u = Atan2i(vertex.x, vertex.y)<<m_curTexture->m_shift>>11;
color = pData[(v<<m_curTexture->m_shift)|u];
b += (BCOLOR(color)>>1);
g += (GCOLOR(color)>>1);
r += (RCOLOR(color)>>1);
if (b>255)
b = 255;
if (g>255)
g = 255;
if (r>255)
r = 255;
m_pCurrentRenderTarget->m_pColorBuffer[pos] = MAKERGB(r, g, b);
}
pos ++;
nx += delta;
}
k++;
ny -= delta;
}
}
void CGraphics3D::FrustumCut(Point *pPoint)
{
Point list[20], rp[3];
int next[20], temp, vleft[20], vright[20], vup[20], vbottom[20];
int i, j, head, top, zmax, zmin;
for (i=0; i<3; i++) {
list[i] = pPoint[i];
SYS_ASSERT(pPoint[i].u <= SHIFT2VALUE && pPoint[i].u >=0);
SYS_ASSERT(pPoint[i].v <= SHIFT2VALUE && pPoint[i].v >=0);
next[i] = i+1;
j = list[i].z * m_leftFace.z;
temp = list[i].x * m_leftFace.x;
vleft[i] = j + temp;
vright[i] = j - temp;
}
top = 3;
next[2] = 0;
i = head = 0;
// left cut
while (vleft[i] < 0) {
i = next[i];
if (i == head)
break;
}
if (vleft[i] < 0)
return;
head = i;
while (vleft[next[i]] >= 0) {
i = next[i];
if (i == head)
break;
}
if (vleft[next[i]] < 0) {
j = next[i];
temp = vleft[i] - vleft[j];
if (temp > SHIFT2VALUE)
temp = (-vleft[j]) * recipTable[(temp >>SHIFT)+1] >>SHIFT;
else
temp = (-vleft[j]) * recipTable[temp];
if (temp >= SHIFT2VALUE>>1) {
if (list[i].x > list[j].x)
list[top].x = list[j].x + ((list[i].x - list[j].x) * (temp >>SHIFT) >>RECIPBITSHIFT);
else
list[top].x = list[j].x - ((list[j].x - list[i].x) * (temp >>SHIFT) >>RECIPBITSHIFT)-1;
list[top].y = list[j].y + ((list[i].y - list[j].y) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].z = list[j].z + ((list[i].z - list[j].z) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].u = list[j].u + ((list[i].u - list[j].u) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].v = list[j].v + ((list[i].v - list[j].v) * (temp >>SHIFT) >>RECIPBITSHIFT);
} else {
if (list[i].x > list[j].x)
list[top].x = list[j].x + ((list[i].x - list[j].x) * temp >>RECIPBIT);
else
list[top].x = list[j].x - ((list[j].x - list[i].x) * temp >>RECIPBIT);
list[top].y = list[j].y + ((list[i].y - list[j].y) * temp >>RECIPBIT);
list[top].z = list[j].z + ((list[i].z - list[j].z) * temp >>RECIPBIT);
list[top].u = list[j].u + ((list[i].u - list[j].u) * temp >>RECIPBIT);
list[top].v = list[j].v + ((list[i].v - list[j].v) * temp >>RECIPBIT);
}
vleft[top] = 0;
vright[top] = list[top].z * m_rightFace.z + list[top].x * m_rightFace.x;
next[top] = j;
next[i] = top;
i = head = top;
top++;
while (vleft[next[i]] < 0)
i = next[i];
j = next[i];
temp = vleft[j] - vleft[i];
if (temp > SHIFT2VALUE)
temp = (-vleft[i]) * recipTable[(temp >>SHIFT)+1] >>SHIFT;
else
temp = (-vleft[i]) * recipTable[temp];
if (temp >= SHIFT2VALUE>>1) {
if (list[j].x > list[i].x)
list[top].x = list[i].x + ((list[j].x - list[i].x) * (temp >>SHIFT) >>RECIPBITSHIFT);
else
list[top].x = list[i].x - ((list[i].x - list[j].x) * (temp >>SHIFT) >>RECIPBITSHIFT)-1;
list[top].y = list[i].y + ((list[j].y - list[i].y) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].z = list[i].z + ((list[j].z - list[i].z) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].u = list[i].u + ((list[j].u - list[i].u) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].v = list[i].v + ((list[j].v - list[i].v) * (temp >>SHIFT) >>RECIPBITSHIFT);
} else {
if (list[j].x > list[i].x)
list[top].x = list[i].x + ((list[j].x - list[i].x) * temp >>RECIPBIT);
else
list[top].x = list[i].x - ((list[i].x - list[j].x) * temp >>RECIPBIT);
list[top].y = list[i].y + ((list[j].y - list[i].y) * temp >>RECIPBIT);
list[top].z = list[i].z + ((list[j].z - list[i].z) * temp >>RECIPBIT);
list[top].u = list[i].u + ((list[j].u - list[i].u) * temp >>RECIPBIT);
list[top].v = list[i].v + ((list[j].v - list[i].v) * temp >>RECIPBIT);
}
vleft[top] = 0;
vright[top] = list[top].z * m_rightFace.z + list[top].x * m_rightFace.x;
next[head] = top;
next[top] = j;
top++;
}
// right cut
i = head;
while (vright[i] < 0) {
i = next[i];
if (i == head)
break;
}
if (vright[i] < 0)
return;
head = i;
while (vright[next[i]] >= 0) {
i = next[i];
if (i == head)
break;
}
if (vright[next[i]] < 0) {
j = next[i];
temp = vright[i] - vright[j];
if (temp > SHIFT2VALUE)
temp = (-vright[j]) * recipTable[(temp >>SHIFT)+1] >>SHIFT;
else
temp = (-vright[j]) * recipTable[temp];
if (temp >= SHIFT2VALUE>>1) {
if (list[i].x > list[j].x)
list[top].x = list[j].x + ((list[i].x - list[j].x) * (temp >>SHIFT) >>RECIPBITSHIFT);
else
list[top].x = list[j].x - ((list[j].x - list[i].x) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].y = list[j].y + ((list[i].y - list[j].y) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].z = list[j].z + ((list[i].z - list[j].z) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].u = list[j].u + ((list[i].u - list[j].u) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].v = list[j].v + ((list[i].v - list[j].v) * (temp >>SHIFT) >>RECIPBITSHIFT);
} else {
if (list[i].x > list[j].x)
list[top].x = list[j].x + ((list[i].x - list[j].x) * temp >>RECIPBIT);
else
list[top].x = list[j].x - ((list[j].x - list[i].x) * temp >>RECIPBIT);
list[top].y = list[j].y + ((list[i].y - list[j].y) * temp >>RECIPBIT);
list[top].z = list[j].z + ((list[i].z - list[j].z) * temp >>RECIPBIT);
list[top].u = list[j].u + ((list[i].u - list[j].u) * temp >>RECIPBIT);
list[top].v = list[j].v + ((list[i].v - list[j].v) * temp >>RECIPBIT);
}
vright[top] = 0;
next[top] = j;
next[i] = top;
i = head = top;
top++;
while (vright[next[i]] < 0)
i = next[i];
j = next[i];
temp = vright[j] - vright[i];
if (temp > SHIFT2VALUE)
temp = (-vright[i]) * recipTable[(temp >>SHIFT)+1] >>SHIFT;
else
temp = (-vright[i]) * recipTable[temp];
if (temp >= SHIFT2VALUE>>1) {
if (list[j].x > list[i].x)
list[top].x = list[i].x + ((list[j].x - list[i].x) * (temp >>SHIFT) >>RECIPBITSHIFT);
else
list[top].x = list[i].x - ((list[i].x - list[j].x) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].y = list[i].y + ((list[j].y - list[i].y) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].z = list[i].z + ((list[j].z - list[i].z) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].u = list[i].u + ((list[j].u - list[i].u) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].v = list[i].v + ((list[j].v - list[i].v) * (temp >>SHIFT) >>RECIPBITSHIFT);
} else {
if (list[j].x > list[i].x)
list[top].x = list[i].x + ((list[j].x - list[i].x) * temp >>RECIPBIT);
else
list[top].x = list[i].x - ((list[i].x - list[j].x) * temp >>RECIPBIT);
list[top].y = list[i].y + ((list[j].y - list[i].y) * temp >>RECIPBIT);
list[top].z = list[i].z + ((list[j].z - list[i].z) * temp >>RECIPBIT);
list[top].u = list[i].u + ((list[j].u - list[i].u) * temp >>RECIPBIT);
list[top].v = list[i].v + ((list[j].v - list[i].v) * temp >>RECIPBIT);
}
vright[top] = 0;
next[head] = top;
next[top] = j;
top++;
}
i = head;
j = list[i].z * m_bottomFace.z;
temp = list[i].y * m_bottomFace.y;
vbottom[i] = j + temp;
vup[i] = j - temp;
i = next[i];
while (i != head) {
j = list[i].z * m_bottomFace.z;
temp = list[i].y * m_bottomFace.y;
vbottom[i] = j + temp;
vup[i] = j - temp;
i = next[i];
}
// bottom cut
while (vbottom[i] < 0) {
i = next[i];
if (i == head)
break;
}
if (vbottom[i] < 0)
return;
head = i;
while (vbottom[next[i]] >= 0) {
i = next[i];
if (i == head)
break;
}
if (vbottom[next[i]] < 0) {
j = next[i];
temp = vbottom[i] - vbottom[j];
if (temp > SHIFT2VALUE)
temp = (-vbottom[j]) * recipTable[(temp >>SHIFT)+1] >>SHIFT;
else
temp = (-vbottom[j]) * recipTable[temp];
if (temp >= SHIFT2VALUE>>1) {
list[top].x = list[j].x + ((list[i].x - list[j].x) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].y = list[j].y + ((list[i].y - list[j].y) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].z = list[j].z + ((list[i].z - list[j].z) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].u = list[j].u + ((list[i].u - list[j].u) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].v = list[j].v + ((list[i].v - list[j].v) * (temp >>SHIFT) >>RECIPBITSHIFT);
} else {
list[top].x = list[j].x + ((list[i].x - list[j].x) * temp >>RECIPBIT);
list[top].y = list[j].y + ((list[i].y - list[j].y) * temp >>RECIPBIT);
list[top].z = list[j].z + ((list[i].z - list[j].z) * temp >>RECIPBIT);
list[top].u = list[j].u + ((list[i].u - list[j].u) * temp >>RECIPBIT);
list[top].v = list[j].v + ((list[i].v - list[j].v) * temp >>RECIPBIT);
}
vbottom[top] = 0;
vup[top] = list[top].z * m_upFace.z + list[top].y * m_upFace.y;
next[top] = j;
next[i] = top;
i = head = top;
top++;
while (vbottom[next[i]] < 0)
i = next[i];
j = next[i];
temp = vbottom[j] - vbottom[i];
if (temp > SHIFT2VALUE)
temp = (-vbottom[i]) * recipTable[(temp >>SHIFT)+1] >>SHIFT;
else
temp = (-vbottom[i]) * recipTable[temp];
if (temp >= SHIFT2VALUE>>1) {
list[top].x = list[i].x + ((list[j].x - list[i].x) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].y = list[i].y + ((list[j].y - list[i].y) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].z = list[i].z + ((list[j].z - list[i].z) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].u = list[i].u + ((list[j].u - list[i].u) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].v = list[i].v + ((list[j].v - list[i].v) * (temp >>SHIFT) >>RECIPBITSHIFT);
} else {
list[top].x = list[i].x + ((list[j].x - list[i].x) * temp >>RECIPBIT);
list[top].y = list[i].y + ((list[j].y - list[i].y) * temp >>RECIPBIT);
list[top].z = list[i].z + ((list[j].z - list[i].z) * temp >>RECIPBIT);
list[top].u = list[i].u + ((list[j].u - list[i].u) * temp >>RECIPBIT);
list[top].v = list[i].v + ((list[j].v - list[i].v) * temp >>RECIPBIT);
}
vbottom[top] = 0;
vup[top] = list[top].z * m_upFace.z + list[top].y * m_upFace.y;
next[head] = top;
next[top] = j;
top++;
}
// up cut
i = head;
while (vup[i] < 0) {
i = next[i];
if (i == head)
break;
}
if (vup[i] < 0)
return;
head = i;
while (vup[next[i]] >= 0) {
i = next[i];
if (i == head)
break;
}
if (vup[next[i]] < 0) {
j = next[i];
temp = vup[i] - vup[j];
if (temp > SHIFT2VALUE)
temp = (-vup[j]) * recipTable[(temp >>SHIFT)+1] >>SHIFT;
else
temp = (-vup[j]) * recipTable[temp];
if (temp >= SHIFT2VALUE>>1) {
list[top].x = list[j].x + ((list[i].x - list[j].x) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].y = list[j].y + ((list[i].y - list[j].y) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].z = list[j].z + ((list[i].z - list[j].z) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].u = list[j].u + ((list[i].u - list[j].u) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].v = list[j].v + ((list[i].v - list[j].v) * (temp >>SHIFT) >>RECIPBITSHIFT);
} else {
list[top].x = list[j].x + ((list[i].x - list[j].x) * temp >>RECIPBIT);
list[top].y = list[j].y + ((list[i].y - list[j].y) * temp >>RECIPBIT);
list[top].z = list[j].z + ((list[i].z - list[j].z) * temp >>RECIPBIT);
list[top].u = list[j].u + ((list[i].u - list[j].u) * temp >>RECIPBIT);
list[top].v = list[j].v + ((list[i].v - list[j].v) * temp >>RECIPBIT);
}
vup[top] = 0;
next[top] = j;
next[i] = top;
i = head = top;
top++;
while (vup[next[i]] < 0)
i = next[i];
j = next[i];
temp = vup[j] - vup[i];
if (temp > SHIFT2VALUE)
temp = (-vup[i]) * recipTable[(temp >>SHIFT)+1] >>SHIFT;
else
temp = (-vup[i]) * recipTable[temp];
if (temp >= SHIFT2VALUE>>1) {
list[top].x = list[i].x + ((list[j].x - list[i].x) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].y = list[i].y + ((list[j].y - list[i].y) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].z = list[i].z + ((list[j].z - list[i].z) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].u = list[i].u + ((list[j].u - list[i].u) * (temp >>SHIFT) >>RECIPBITSHIFT);
list[top].v = list[i].v + ((list[j].v - list[i].v) * (temp >>SHIFT) >>RECIPBITSHIFT);
} else {
list[top].x = list[i].x + ((list[j].x - list[i].x) * temp >>RECIPBIT);
list[top].y = list[i].y + ((list[j].y - list[i].y) * temp >>RECIPBIT);
list[top].z = list[i].z + ((list[j].z - list[i].z) * temp >>RECIPBIT);
list[top].u = list[i].u + ((list[j].u - list[i].u) * temp >>RECIPBIT);
list[top].v = list[i].v + ((list[j].v - list[i].v) * temp >>RECIPBIT);
}
vup[top] = 0;
next[head] = top;
next[top] = j;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -