OGRESE画刷文件 注释

#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;
	}
}


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值