📄 mgcsoftzt.cpp
字号:
// Magic Software, Inc.
// http://www.magic-software.com
// Copyright (c) 2000, All Rights Reserved
//
// Source code from Magic Software is supplied under the terms of a license
// agreement and may not be copied or disclosed except in accordance with the
// terms of that agreement. The various license agreements may be found at
// the Magic Software web site. This file is subject to the license
//
// RESTRICTED USE SOURCE CODE
// http://www.magic-software.com/License/restricted.pdf
#include "MgcSoftASM.h"
#include "MgcSoftRenderer.h"
// TO DO. This sample code ignores the members of the MgcZBufferState
// object. The depth buffer is always tested and written when necessary.
// The comparison function is 'less than or equal to'. The code should be
// modified to properly handle the members.
//---------------------------------------------------------------------------
void MgcSoftRenderer::DrawEdgeZT (unsigned int uiV0, unsigned int uiV1)
{
EdgeSetupParameters
LinAttrSetup(3)
MgcVector2& rkT0 = m_kMesh.Texture(uiV0);
MgcVector2& rkT1 = m_kMesh.Texture(uiV1);
aiA0[0] = m_kImage.GetX(rkT0.x);
aiA0[1] = m_kImage.GetY(rkT0.y);
MgcSoftASM_FloatToIntMult(m_kMesh.Depth(uiV0),aiA0[2],16);
aiA1[0] = m_kImage.GetX(rkT1.x);
aiA1[1] = m_kImage.GetY(rkT1.y);
MgcSoftASM_FloatToIntMult(m_kMesh.Depth(uiV1),aiA1[2],16);
EdgeInitX
InitLinAttrX
EdgePrologTraverseX
if ( aiA0[2] <= m_ausZBuffer[iIndex] )
{
m_akBuffer[iIndex] = m_kImage.GetColor(aiA0[0],aiA0[1]);
m_ausZBuffer[iIndex] = aiA0[2];
}
EdgeReturnX
UpdateLinAttrX
EdgeEpilogTraverseX
EdgeExitX
EdgeInitY
InitLinAttrY
EdgePrologTraverseY
if ( aiA0[2] <= m_ausZBuffer[iIndex] )
{
m_akBuffer[iIndex] = m_kImage.GetColor(aiA0[0],aiA0[1]);
m_ausZBuffer[iIndex] = aiA0[2];
}
EdgeReturnY
UpdateLinAttrY
EdgeEpilogTraverseY
EdgeExitY
}
//---------------------------------------------------------------------------
void MgcSoftRenderer::DrawTriZT (unsigned int uiV0, unsigned int uiV1,
unsigned int uiV2)
{
TriangleSetupParameters
LinAttrSetup(3)
MgcVector2& rkT0 = m_kMesh.Texture(uiV0);
MgcVector2& rkT1 = m_kMesh.Texture(uiV1);
MgcVector2& rkT2 = m_kMesh.Texture(uiV2);
m_uiNumLinAttr = 3; // u, v, d
m_uiNumPerAttr = 0; // none
m_aafLinAttr[0][0] = rkT0.x;
m_aafLinAttr[0][1] = rkT0.y;
m_aafLinAttr[0][2] = m_kMesh.Depth(uiV0);
m_aafLinAttr[1][0] = rkT1.x;
m_aafLinAttr[1][1] = rkT1.y;
m_aafLinAttr[1][2] = m_kMesh.Depth(uiV1);
m_aafLinAttr[2][0] = rkT2.x;
m_aafLinAttr[2][1] = rkT2.y;
m_aafLinAttr[2][2] = m_kMesh.Depth(uiV2);
TriBeginLoop
aiA0[0] = m_kImage.GetX(m_aafLinAttrMin[iY][0]);
aiA0[1] = m_kImage.GetY(m_aafLinAttrMin[iY][1]);
MgcSoftASM_FloatToIntMult(m_aafLinAttrMin[iY][2],aiA0[2],16);
aiA1[0] = m_kImage.GetX(m_aafLinAttrMax[iY][0]);
aiA1[1] = m_kImage.GetY(m_aafLinAttrMax[iY][1]);
MgcSoftASM_FloatToIntMult(m_aafLinAttrMax[iY][2],aiA1[2],16);
if ( iDx > 1 )
{
InitLinAttrX
for (int iX = iX0, iAx = 2*iDx; iX <= iX1; iX++, iIndex++)
{
if ( aiA0[2] <= m_ausZBuffer[iIndex] )
{
m_akBuffer[iIndex] = m_kImage.GetColor(aiA0[0],aiA0[1]);
m_ausZBuffer[iIndex] = aiA0[2];
}
UpdateLinAttrX
}
}
else if ( iDx == 1 )
{
if ( aiA0[2] <= m_ausZBuffer[iIndex] )
{
m_akBuffer[iIndex] = m_kImage.GetColor(aiA0[0],aiA0[1]);
m_ausZBuffer[iIndex] = aiA0[2];
}
iIndex++;
if ( aiA1[2] <= m_ausZBuffer[iIndex] )
{
m_akBuffer[iIndex] = m_kImage.GetColor(aiA1[0],aiA1[1]);
m_ausZBuffer[iIndex] = aiA1[2];
}
}
else
{
if ( aiA0[2] <= m_ausZBuffer[iIndex] )
{
m_akBuffer[iIndex] = m_kImage.GetColor(aiA0[0],aiA0[1]);
m_ausZBuffer[iIndex] = aiA0[2];
}
}
TriEndLoop
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -