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

📄 wmltexture.cpp

📁 3D Game Engine Design Source Code非常棒
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Magic Software, Inc.
// http://www.magic-software.com
// http://www.wild-magic.com
// Copyright (c) 2003.  All Rights Reserved
//
// The Wild Magic Library (WML) source code is supplied under the terms of
// the license agreement http://www.magic-software.com/License/WildMagic.pdf
// and may not be copied or disclosed except in accordance with the terms of
// that agreement.

#include "WmlTexture.h"
#include "WmlRenderer.h"
using namespace Wml;

WmlImplementRTTI(Texture,Object);
WmlImplementStream(Texture);

//----------------------------------------------------------------------------
Texture::Texture ()
{
    m_eCorrection = CM_PERSPECTIVE;
    m_eApply = AM_REPLACE;
    m_kBlendColor = ColorRGB::BLACK;
    m_eWrap = WM_CLAMP_S_CLAMP_T;
    m_eFilter = FM_NEAREST;
    m_eMipmap = MM_NONE;
    m_eEnvmap = EM_NONE;
    m_fPriority = 1.0f;
    memset(m_acUserData,0,8*sizeof(char));

    // the following is relevant only if the wrap mode is clamp-to-border
    m_kBorderColor = ColorRGB::BLACK;

    // the following are relevant only if the apply mode is AM_COMBINE
    m_eCombineFuncRGB = ACF_REPLACE;
    m_eCombineFuncAlpha = ACF_REPLACE;
    m_eCombineSrc0RGB = ACS_TEXTURE;
    m_eCombineSrc1RGB = ACS_TEXTURE;
    m_eCombineSrc2RGB = ACS_TEXTURE;
    m_eCombineSrc0Alpha = ACS_TEXTURE;
    m_eCombineSrc1Alpha = ACS_TEXTURE;
    m_eCombineSrc2Alpha = ACS_TEXTURE;
    m_eCombineOp0RGB = ACO_SRC_COLOR;
    m_eCombineOp1RGB = ACO_SRC_COLOR;
    m_eCombineOp2RGB = ACO_SRC_COLOR;
    m_eCombineOp0Alpha = ACO_SRC_COLOR;
    m_eCombineOp1Alpha = ACO_SRC_COLOR;
    m_eCombineOp2Alpha = ACO_SRC_COLOR;
    m_eCombineScaleRGB = ACSC_ONE;
    m_eCombineScaleAlpha = ACSC_ONE;
}
//----------------------------------------------------------------------------
Texture::~Texture ()
{
    // Inform all renderers that the texture is being destroyed.  Any
    // renderer using this texture can free up any associated resources.
    Renderer::OnDestroyTexture(this);

    m_spkImage = NULL;
}
//----------------------------------------------------------------------------
Object* Texture::GetObjectByName (const char* acName)
{
    Object* pkFound = Object::GetObjectByName(acName);
    if ( pkFound )
        return pkFound;

    if ( m_spkImage )
    {
        pkFound = m_spkImage->GetObjectByName(acName);
        if ( pkFound )
            return pkFound;
    }

    return 0;
}
//----------------------------------------------------------------------------
void Texture::GetAllObjectsByName (const char* acName,
    std::vector<Object*>& rkObjects)
{
    Object::GetAllObjectsByName(acName,rkObjects);

    if ( m_spkImage )
        m_spkImage->GetAllObjectsByName(acName,rkObjects);
}
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------
// streaming
//----------------------------------------------------------------------------
Object* Texture::Factory (Stream& rkStream)
{
    Texture* pkObject = new Texture;
    Stream::Link* pkLink = new Stream::Link(pkObject);
    pkObject->Load(rkStream,pkLink);
    return pkObject;
}
//----------------------------------------------------------------------------
void Texture::Load (Stream& rkStream, Stream::Link* pkLink)
{
    Object::Load(rkStream,pkLink);

    // native data
    StreamReadEnum(rkStream,m_eCorrection);
    StreamReadEnum(rkStream,m_eApply);
    StreamRead(rkStream,m_kBlendColor);
    StreamReadEnum(rkStream,m_eWrap);
    StreamReadEnum(rkStream,m_eFilter);
    StreamReadEnum(rkStream,m_eMipmap);
    StreamRead(rkStream,m_fPriority);

    if ( rkStream.GetVersion() >= Version(1,3) )
    {
        StreamReadEnum(rkStream,m_eEnvmap);
        StreamRead(rkStream,m_kBorderColor);
        StreamReadEnum(rkStream,m_eCombineFuncRGB);
        StreamReadEnum(rkStream,m_eCombineFuncAlpha);
        StreamReadEnum(rkStream,m_eCombineSrc0RGB);
        StreamReadEnum(rkStream,m_eCombineSrc1RGB);
        StreamReadEnum(rkStream,m_eCombineSrc2RGB);
        StreamReadEnum(rkStream,m_eCombineSrc0Alpha);
        StreamReadEnum(rkStream,m_eCombineSrc1Alpha);
        StreamReadEnum(rkStream,m_eCombineSrc2Alpha);
        StreamReadEnum(rkStream,m_eCombineOp0RGB);
        StreamReadEnum(rkStream,m_eCombineOp1RGB);
        StreamReadEnum(rkStream,m_eCombineOp2RGB);
        StreamReadEnum(rkStream,m_eCombineOp0Alpha);
        StreamReadEnum(rkStream,m_eCombineOp1Alpha);
        StreamReadEnum(rkStream,m_eCombineOp2Alpha);
        StreamReadEnum(rkStream,m_eCombineScaleRGB);
        StreamReadEnum(rkStream,m_eCombineScaleAlpha);
    }

    // link data
    Image* pkImage;
    StreamRead(rkStream,pkImage);
    pkLink->Add(pkImage);
}
//----------------------------------------------------------------------------
void Texture::Link (Stream& rkStream, Stream::Link* pkLink)
{
    Object::Link(rkStream,pkLink);

    Object* pkLinkID = pkLink->GetLinkID();
    m_spkImage = (Image*)rkStream.GetFromMap(pkLinkID);
}
//----------------------------------------------------------------------------
bool Texture::Register (Stream& rkStream)
{
    if ( !Object::Register(rkStream) )
        return false;

    if ( m_spkImage )
        m_spkImage->Register(rkStream);

    return true;
}
//----------------------------------------------------------------------------
void Texture::Save (Stream& rkStream)
{
    Object::Save(rkStream);

    // native data
    StreamWriteEnum(rkStream,m_eCorrection);
    StreamWriteEnum(rkStream,m_eApply);
    StreamWrite(rkStream,m_kBlendColor);
    StreamWriteEnum(rkStream,m_eWrap);
    StreamWriteEnum(rkStream,m_eFilter);
    StreamWriteEnum(rkStream,m_eMipmap);
    StreamWrite(rkStream,m_fPriority);

    StreamWriteEnum(rkStream,m_eEnvmap);
    StreamWrite(rkStream,m_kBorderColor);
    StreamWriteEnum(rkStream,m_eCombineFuncRGB);
    StreamWriteEnum(rkStream,m_eCombineFuncAlpha);
    StreamWriteEnum(rkStream,m_eCombineSrc0RGB);
    StreamWriteEnum(rkStream,m_eCombineSrc1RGB);
    StreamWriteEnum(rkStream,m_eCombineSrc2RGB);
    StreamWriteEnum(rkStream,m_eCombineSrc0Alpha);
    StreamWriteEnum(rkStream,m_eCombineSrc1Alpha);
    StreamWriteEnum(rkStream,m_eCombineSrc2Alpha);
    StreamWriteEnum(rkStream,m_eCombineOp0RGB);
    StreamWriteEnum(rkStream,m_eCombineOp1RGB);
    StreamWriteEnum(rkStream,m_eCombineOp2RGB);
    StreamWriteEnum(rkStream,m_eCombineOp0Alpha);
    StreamWriteEnum(rkStream,m_eCombineOp1Alpha);
    StreamWriteEnum(rkStream,m_eCombineOp2Alpha);
    StreamWriteEnum(rkStream,m_eCombineScaleRGB);
    StreamWriteEnum(rkStream,m_eCombineScaleAlpha);

    // m_uiUserData is derived, no need to save

    // link data
    StreamWrite(rkStream,m_spkImage);
}
//----------------------------------------------------------------------------
StringTree* Texture::SaveStrings ()
{
    StringTree* pkTree = new StringTree(26,0,2,0);

    // strings
    pkTree->SetString(0,MakeString(&ms_kRTTI,GetName()));

    switch ( m_eCorrection )
    {
    case CM_AFFINE:
        pkTree->SetString(1,MakeString("correction = AFFINE"));
        break;
    case CM_PERSPECTIVE:
        pkTree->SetString(1,MakeString("correction = PERSPECTIVE"));
        break;
    default:  // CM_QUANTITY
        break;
    };

    switch ( m_eApply )
    {
    case AM_REPLACE:
        pkTree->SetString(2,MakeString("apply = REPLACE"));
        break;
    case AM_DECAL:
        pkTree->SetString(2,MakeString("apply = DECAL"));
        break;
    case AM_MODULATE:
        pkTree->SetString(2,MakeString("apply = MODULATE"));
        break;
    case AM_BLEND:
        pkTree->SetString(2,MakeString("apply = BLEND"));
        break;
    case AM_ADD:
        pkTree->SetString(2,MakeString("apply = ADD"));
        break;
    case AM_COMBINE:
        pkTree->SetString(2,MakeString("apply = COMBINE"));
        break;
    default:  // AM_QUANTITY
        break;
    };

    switch ( m_eCombineFuncRGB )
    {
    case ACF_REPLACE:
        pkTree->SetString(3,MakeString("CombFuncRGB = REPLACE"));
        break;
    case ACF_MODULATE:
        pkTree->SetString(3,MakeString("CombFuncRGB = MODULATE"));
        break;
    case ACF_ADD:
        pkTree->SetString(3,MakeString("CombFuncRGB = ADD"));
        break;
    case ACF_ADD_SIGNED:
        pkTree->SetString(3,MakeString("CombFuncRGB = ADD_SIGNED"));
        break;
    case ACF_SUBTRACT:
        pkTree->SetString(3,MakeString("CombFuncRGB = SUBTRACT"));
        break;
    case ACF_INTERPOLATE:
        pkTree->SetString(3,MakeString("CombFuncRGB = INTERPOLATE"));
        break;
    case ACF_DOT3_RGB:
        pkTree->SetString(3,MakeString("CombFuncRGB = DOT3_RGB"));
        break;
    case ACF_DOT3_RGBA:
        pkTree->SetString(3,MakeString("CombFuncRGB = DOT3_RGBA"));
        break;
    default:  // ACF_QUANTITY
        break;
    }

    switch ( m_eCombineFuncAlpha )
    {
    case ACF_REPLACE:
        pkTree->SetString(4,MakeString("CombineFuncAlpha = REPLACE"));
        break;
    case ACF_MODULATE:
        pkTree->SetString(4,MakeString("CombineFuncAlpha = MODULATE"));
        break;
    case ACF_ADD:
        pkTree->SetString(4,MakeString("CombineFuncAlpha = ADD"));
        break;
    case ACF_ADD_SIGNED:
        pkTree->SetString(4,MakeString("CombineFuncAlpha = ADD_SIGNED"));
        break;
    case ACF_SUBTRACT:
        pkTree->SetString(4,MakeString("CombineFuncAlpha = SUBTRACT"));
        break;
    case ACF_INTERPOLATE:
        pkTree->SetString(4,MakeString("CombineFuncAlpha = INTERPOLATE"));
        break;
    case ACF_DOT3_RGB:
        pkTree->SetString(4,MakeString("CombineFuncAlpha = DOT3_RGB"));
        break;
    case ACF_DOT3_RGBA:
        pkTree->SetString(4,MakeString("CombineFuncAlpha = DOT3_RGBA"));
        break;
    default:  // ACF_QUANTITY
        break;
    }

    switch ( m_eCombineSrc0RGB )
    {
    case ACS_TEXTURE:
        pkTree->SetString(5,MakeString("CombineSrc0RGB = TEXTURE"));
        break;
    case ACS_PRIMARY_COLOR:
        pkTree->SetString(5,MakeString("CombineSrc0RGB = PRIMARY_COLOR"));
        break;
    case ACS_CONSTANT:
        pkTree->SetString(5,MakeString("CombineSrc0RGB = CONSTANT"));
        break;
    case ACS_PREVIOUS:
        pkTree->SetString(5,MakeString("CombineSrc0RGB = PREVIOUS"));
        break;
    default:  // ACS_QUANTITY
        break;
    }

    switch ( m_eCombineSrc1RGB )
    {
    case ACS_TEXTURE:
        pkTree->SetString(6,MakeString("CombineSrc1RGB = TEXTURE"));
        break;
    case ACS_PRIMARY_COLOR:
        pkTree->SetString(6,MakeString("CombineSrc1RGB = PRIMARY_COLOR"));
        break;
    case ACS_CONSTANT:
        pkTree->SetString(6,MakeString("CombineSrc1RGB = CONSTANT"));
        break;
    case ACS_PREVIOUS:
        pkTree->SetString(6,MakeString("CombineSrc1RGB = PREVIOUS"));
        break;
    default:  // ACS_QUANTITY
        break;
    }

    switch ( m_eCombineSrc2RGB )
    {
    case ACS_TEXTURE:
        pkTree->SetString(7,MakeString("CombineSrc1RGB = TEXTURE"));
        break;
    case ACS_PRIMARY_COLOR:
        pkTree->SetString(7,MakeString("CombineSrc1RGB = PRIMARY_COLOR"));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -