#pragma once
#include "OgreImage.h"
#include <vector>
namespace OgreSE
{
class TerrainBrush//地形画刷
{
public:
/** 默认构造 */
TerrainBrush(unsigned short size = 0);
/** 由给定的一个float数组构造 */
TerrainBrush(const float* brush, unsigned short width, unsigned short height);
/** 由给定的一个float数组构造 */
TerrainBrush(const std::vector<float>& brush, unsigned short width, unsigned short height);
/** 拷贝构造 */
TerrainBrush(const CString& fileName, unsigned short size);
/** 拷贝构造 */
TerrainBrush(const TerrainBrush& other);
~TerrainBrush();
/** 拷贝赋值 */ //将other赋值给this
TerrainBrush& operator=(const TerrainBrush& other);
//填充m_BrushArray 数值数组
void FillFromImage(Ogre::Image& image);
void FillFromImage(const CString& imageFile);
//获得画刷尺寸-包括画刷的宽度 和 高度
unsigned short GetWidth() const { return m_nWidth; }
unsigned short GetHeight() const { return m_nHeight; }
// 功能: 访问画刷数据数组
float& At(unsigned short x, unsigned short y)
{
return m_BrushArray[x + y*m_nWidth];
}
float At(unsigned short x, unsigned short y) const
{
return m_BrushArray[x + y*m_nWidth];
}
// 功能: 异常安全的交换函数 交换两个TerrainBrush对象
void swap(TerrainBrush& other);
private:
float* m_BrushArray; //数值数组,想要使用 vector<float>, 但是 gives warnings with dll export
unsigned short m_nWidth, m_nHeight;// 画刷尺寸
};
}
#include "StdAfx.h"
#include "SETerrainBrush.h"
namespace OgreSE
{
//画刷的构造函数 size:画刷的尺寸
TerrainBrush::TerrainBrush(unsigned short size)
: m_nWidth(size), m_nHeight(size), m_BrushArray(0)
{
if (size)
{
size_t size = m_nWidth*m_nHeight;
m_BrushArray = new float[size];//画刷的数组
memset(m_BrushArray, 0, size*sizeof(float)); //默认全为0
}
}
TerrainBrush::TerrainBrush(const float* brush, unsigned short width, unsigned short height)
: m_nWidth(width), m_nHeight(height)
{
m_BrushArray = new float[width*height];
memcpy(m_BrushArray, brush, width*height*sizeof(float));
}//这里的参数直接都有了m_BrushArray的数据
TerrainBrush::TerrainBrush(const std::vector<float>& brush, unsigned short width, unsigned short height)
: m_nWidth(width), m_nHeight(height)
{
m_BrushArray = new float[width*height];
copy(brush.begin(), brush.end(), m_BrushArray);
}//使用vector<float> 替代 float*
TerrainBrush::TerrainBrush(const TerrainBrush& other)
: m_nWidth(other.m_nWidth), m_nHeight(other.m_nHeight)
{
m_BrushArray = new float[m_nWidth*m_nHeight];
memcpy(m_BrushArray, other.m_BrushArray, m_nWidth*m_nHeight*sizeof(float));
}//拷贝构造函数
TerrainBrush::TerrainBrush(const CString& fileName, unsigned short size)
{//图片的名字
if (fileName.IsEmpty() )
{
m_nWidth = size;
m_nHeight = size;
size_t arraySize = m_nWidth * m_nHeight;
m_BrushArray = new float[arraySize];
memset(m_BrushArray, 0, arraySize*sizeof(float));
return;
}
Ogre::Image image;
image.load(std::string(CT2CA(fileName)), BRUSH_RESOURCE_GROUP_NAME);//将图片序列化为image存储到image中
if (size == 0)
{
m_nWidth = image.getWidth();
m_nHeight = image.getHeight();
}
else
{
m_nWidth = size;
m_nHeight = size;
}
m_BrushArray = new float[m_nWidth * m_nHeight];
FillFromImage(image);
}
TerrainBrush::~TerrainBrush()
{
SAFE_DELETE_ARRAY(m_BrushArray);
}
//赋值重载
TerrainBrush& TerrainBrush::operator=(const TerrainBrush& other)
{
TerrainBrush tmp (other);
tmp.swap(*this);
return *this;
}
void TerrainBrush::swap(TerrainBrush& other)
{
std::swap(m_nWidth, other.m_nWidth);
std::swap(m_nHeight, other.m_nHeight);
std::swap(m_BrushArray, other.m_BrushArray);
}
//将名字为imageFile的图片填充到image中
void TerrainBrush::FillFromImage(const CString& imageFile)
{
if (m_nWidth == 0 || m_nHeight == 0)//如果这个画刷的长宽为0 则返回
return;
if (imageFile.IsEmpty())//
{
size_t size = m_nWidth * m_nHeight;
memset(m_BrushArray, 0, size*sizeof(float));
}
else
{
Ogre::Image image;
image.load(std::string(CT2CA(imageFile)), BRUSH_RESOURCE_GROUP_NAME);
FillFromImage(image);
}
}
//填充Image
void TerrainBrush::FillFromImage(Ogre::Image& image)
{
image.resize(m_nWidth, m_nHeight);
size_t size = m_nWidth*m_nHeight;
ASSERT(m_BrushArray);
// 计算图片每像素的字节数
int bpp = image.getSize() / size;
// 计算 bpp 个字节可以表示的最大数值
size_t maxValue = (1 << (bpp*8)) - 1;
// 填充数组
const unsigned char* imageData = image.getData();
for (size_t i = 0; i < size; ++i)
{
size_t val = 0;
memcpy(&val, imageData, bpp);
imageData += bpp;
m_BrushArray[i] = float(val) / maxValue;
}
}
}
OGRESE画刷文件 注释
最新推荐文章于 2018-11-01 10:58:53 发布