⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graphics3d.cpp

📁 liu7788414
💻 CPP
📖 第 1 页 / 共 5 页
字号:
					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 + -