📄 riceindices.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 + -