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

📄 mgcsoftzt.cpp

📁 3D Game Engine Design Source Code非常棒
💻 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 + -