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

📄 riceindices.cpp

📁 x3d_new.rar
💻 CPP
字号:
#include "StdAfx.h"
#include "RiceIndices.h"

#include <stdio.h>
#include <string.h>

CRiceIndicesMng::CRiceIndicesMng(void)
: m_bValid(false)
{
	memset(m_Templates, 0, sizeof(SRiceIndicesTemplate) * 256);
}

CRiceIndicesMng::~CRiceIndicesMng(void)
{
	if(m_bValid)
		Destroy();
}

bool CRiceIndicesMng::Create()
{
	assert(!m_bValid);

	// 创建所有模板
	bool bAllSuccess = true;

    for(int i = 0; i < 256; ++i)
	{
        if(!CreateTemplate(i))
			bAllSuccess = false;
	}

	m_bValid = true;
    return bAllSuccess;
}

void CRiceIndicesMng::Destroy()
{
	assert(m_bValid);

	// 销毁所有模板
    for(int i = 0; i < 256; ++i)
    {
        if(NULL == m_Templates[i].m_pIndices)
			continue;

        delete[] m_Templates[i].m_pIndices;
        m_Templates[i].m_pIndices = NULL;
        m_Templates[i].m_nIndicesNum = 0;
    }

	m_bValid = false;
}

bool CRiceIndicesMng::CreateTemplate(unsigned int uRiceIgnore)
{
    // 1.确定有效的顶点    
	unsigned char byPoints[9] = {0};
    int nPointNum = 0;

    for(unsigned int i = 0; i < 8; ++i)
    {
        if((1 << i) & uRiceIgnore)
            continue;

        byPoints[nPointNum++] = i + 1;
    }

    // ...补齐最后一个三角形(为了数值连续,这里将数放大,最后索引中会改回来)
    byPoints[nPointNum] = byPoints[0] + 8;

    // 2.开始计算索引
    unsigned char byIndices[24];
    int nIndicesNum = 0;

    unsigned char uPoint1;
    unsigned char uPoint2;

    for(int i = 0; i < nPointNum; ++i)
    {
        uPoint1 = byPoints[i];
        uPoint2 = byPoints[i+1];

        // 都是奇数或间隔超过2,则为不正确三角形
        if((uPoint1 & uPoint2 & 1) || uPoint2 - uPoint1 > 2)
            continue;

        byIndices[nIndicesNum++] = 0;
        byIndices[nIndicesNum++] = uPoint1;
        byIndices[nIndicesNum++] = uPoint2;
    }

    if(0 == nIndicesNum)
        return true;

    // ...改回被放大的数字
    if(byIndices[nIndicesNum - 1] > 8)
        byIndices[nIndicesNum - 1] -= 8;

    // 3.设置模板
    m_Templates[uRiceIgnore].m_pIndices = new unsigned char[nIndicesNum];
    if(NULL == m_Templates[uRiceIgnore].m_pIndices)
		return false;
    
    memcpy(m_Templates[uRiceIgnore].m_pIndices, byIndices, nIndicesNum);
    m_Templates[uRiceIgnore].m_nIndicesNum = nIndicesNum;

	return true;
}

⌨️ 快捷键说明

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