您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-X 节点(CCTexture2D.h)API

2013-11-07 18:30 579 查看
本文来自http://blog.csdn.net/runaying ,引用必须注明出处!

cocos2d-X 节点(CCTexture2D.h)API

温馨提醒:为了大家能更好学习,强烈推荐大家看看本人的这篇博客 Cocos2d-X权威指南笔记

贴图类 CCTexture2D是关于
OpenGL
的概念。在
OpenGL中称图片为贴图,在Cocos2D-x中
CCTexture2D
就是图片对象的意思,可以通过它创建精灵等对象 .CCTexture2D类是精灵类和其相关类的基础。以下会看到很多类都可以用CCTexture2D类定义。

//cocos2d-x-3.0alpha0-pre/cocos2dx/textures

#ifndef __CCTEXTURE2D_H__
#define __CCTEXTURE2D_H__

#include <string>
#include <map>

#include "cocoa/CCObject.h"
#include "cocoa/CCGeometry.h"
#include "ccTypes.h"
#ifdef EMSCRIPTEN
#include "base_nodes/CCGLBufferedNode.h"
#endif // EMSCRIPTEN

NS_CC_BEGIN

class Image;
typedef struct _MipmapInfo MipmapInfo;

/**
* @addtogroup textures
* @{
*/

//CONSTANTS:

class GLProgram;

//CLASS INTERFACES:

简要

/** @brief Texture2D class.
* 这个类可以方便的从一个  images, text or raw data. 创建OpenGL的2D textures       // 图像,文本或原始数据
*创建Texture2D对象将永远有  power-of-two dimensions             //两个维度。
*实际的图像的 texture 可能小于 texture 的尺寸;这取决于你是如何创建 tEXURE2D对象的 i.e. "contentSize" != (pixelsWide, pixelsHigh) and (maxS, maxT) != (1.0, 1.0).
* 请注意,所生成的纹理的内容将上下颠倒!
*/
class CC_DLL Texture2D : public Object
#ifdef EMSCRIPTEN
, public GLBufferedNode
#endif // EMSCRIPTEN
{
public:
/** @typedef Texture2D::PixelFormat
texture 可能会被像素格式化
*/
enum class PixelFormat
{
//! 自动检测类型
AUTO,
//! 32-bit texture: BGRA8888    //32位纹理:BGRA8888
BGRA8888,
//! 32-bit texture: RGBA8888
RGBA8888,
//! 24-bit texture: RGBA888
RGB888,
//! 不带Alpha通道的16位纹理
RGB565,
//! 8-bit textures 作为 masks     //模形
A8,
//! 8-bit 强度的 texture
I8,
//! 16-bit textures  作为 masks     //模形
AI88,
//! 16-bit textures: RGBA4444
RGBA4444,
//! 16-bit textures: RGB5A1
RGB5A1,
//! 4-bit PVRTC-compressed texture: PVRTC4A                        // 压缩
PVRTC4,
//! 4-bit PVRTC-compressed texture: PVRTC4 (有 alpha 通道)
PVRTC4A,
//! 2-bit PVRTC-compressed texture: PVRTC2
PVRTC2,
//! 2-bit PVRTC-compressed texture: PVRTC2 (有 alpha 通道)
PVRTC2A,
//! ETC-compressed texture: ETC                       // 压缩
ETC,
//! S3TC-compressed texture: S3TC_Dxt1
S3TC_DXT1,
//! S3TC-compressed texture: S3TC_Dxt3
S3TC_DXT3,
//! S3TC-compressed texture: S3TC_Dxt5
S3TC_DXT5,
//! ATITC-compressed texture: ATC_RGB
ATC_RGB,
//! ATITC-compressed texture: ATC_EXPLICIT_ALPHA
ATC_EXPLICIT_ALPHA,
//! ATITC-compresed texture: ATC_INTERPOLATED_ALPHA
ATC_INTERPOLATED_ALPHA,
//! 默认的 texture 格式: AUTO
DEFAULT = AUTO,

NONE = -1
};

struct PixelFormatInfo {

PixelFormatInfo(GLenum internalFormat, GLenum format, GLenum type, int bpp, bool compressed, bool alpha)
: internalFormat(internalFormat)
, format(format)
, type(type)
, bpp(bpp)
, compressed(compressed)
, alpha(alpha)
{}

GLenum internalFormat;
GLenum format;
GLenum type;
int bpp;
bool compressed;
bool alpha;
};

typedef std::map<Texture2D::PixelFormat, const PixelFormatInfo> PixelFormatInfoMap;

/**
set Min / Mag 扩展的过滤器
*/
typedef struct _TexParams {
GLuint    minFilter;
GLuint    magFilter;
GLuint    wrapS;
GLuint    wrapT;
}TexParams;

public:
/** 为 UIImagescontains alpha 通道设置默认的像素的格式.
该UIImage如果包含Alpha通道,然后有三种选择:
- generate 32-bit textures: Texture2D::PixelFormat::RGBA8888 (default one)     //默认的一种
- generate 24-bit textures: Texture2D::PixelFormat::RGB888                     //生成
- generate 16-bit textures: Texture2D::PixelFormat::RGBA4444
- generate 16-bit textures: Texture2D::PixelFormat::RGB5A1
- generate 16-bit textures: Texture2D::PixelFormat::RGB565
- generate 8-bit textures: Texture2D::PixelFormat::A8 (使用它的时候你只能使用一种颜色)

他是如何工作的 ?
-如果图片是 RGBA(使用了 alpha通道)则默认的像素格式将被使用 (它可以是 a 8-bit, 16-bit or 32-bit texture)
-如果图片是 RGB(没有使用 alpha通道) 如果默认的像素格式是 RGBA8888 那么将使用 RGBA8888 (32-bit) ,其他情况将使用一个 RGB565 (16-bit texture)

这个参数对 PVR / PVR.CCZ 图片是无效的.

@since v0.8
*/
static void setDefaultAlphaPixelFormat(Texture2D::PixelFormat format);

/** returns  alpha 通道像素格式
@since v0.8
*/
static Texture2D::PixelFormat getDefaultAlphaPixelFormat();
CC_DEPRECATED_ATTRIBUTE static Texture2D::PixelFormat defaultAlphaPixelFormat() { return Texture2D::getDefaultAlphaPixelFormat(); };

/**对待(或没有) RVR 文件,把他们当作有 alpha premultiplied。          //预乘
你不可能再运行前知道他们有没有 alpha premultiplied。          //预乘
不论他们有没有 alpha premultiplied。  他们都是可以被加载的        //预乘

默认情况下,它被禁用。

@since v0.99.5
*/
static void PVRImagesHavePremultipliedAlpha(bool haveAlphaPremultiplied);

public:
/**
* @js ctor
*/
Texture2D();
/**
* @js NA
* @lua NA
*/
virtual ~Texture2D();
/**
* @js NA
* @lua NA
*/
const char* description(void) const;

/** 这些功能都需要创建可变的 textures
* @js NA
* @lua NA
*/
void releaseData(void *data);
/**
* @js NA
* @lua NA
*/
void* keepData(void *data, unsigned int length);

/** 使用数据,初始化一个Texture2D
* @js NA
* @lua NA
*/
bool initWithData(const void *data, int dataLen, Texture2D::PixelFormat pixelFormat, unsigned int pixelsWide, unsigned int pixelsHigh, const Size& contentSize);

/** 使用 mipmaps 初始化 */
bool initWithMipmaps(MipmapInfo* mipmaps, int mipmapsNum, Texture2D::PixelFormat pixelFormat, unsigned int pixelsWide, unsigned int pixelsHigh);

/**
扩展 Texture2D 对象使它很容易的绘制一个基本矩形
这个功能需要客户端支持 GL_TEXTURE_2D 、 GL_VERTEX_ARRAY 、 GL_TEXTURE_COORD_ARRAY     */
/** 在一个给定的点绘制一个 texture */
void drawAtPoint(const Point& point);
/** 在一个矩形内绘制一个 texture */
void drawInRect(const Rect& rect);

/**
扩展 Texture2D 对象使它很容易使用一个图片初始化
*/
/**
使用一个 UIImage 对象初始化一个 texure.
调用 setDefaultAlphaPixelFormat 使用你制定的格式,转换图片然后在 texture 里面使用转换后的图片
NOTE: 他不会转换 pvr 图片文件.       //关于 pvr(图片的一种格式,像png、jpg一样) 是什么请参考 http://blog.sina.com.cn/s/blog_6fbe210701015j7z.html */
bool initWithImage(Image * image);

/** 使用一个 UIImage 对象初始化一个 texure.
图片使用我们传递过来的格式化参数格式化,然后被 texture 使用
如果你传递的是 PixelFormat::Automatic, 那么图片将自动检测图片的渲染类型,使用该类型来渲染 texture
**/
bool initWithImage(Image * image, PixelFormat format);

/**使用字符串和字符串的 长度、对齐方式、字体、字体尺寸 初始化一个 texture */
bool initWithString(const char *text,  const char *fontName, float fontSize, const Size& dimensions = Size(0, 0), TextHAlignment hAlignment = TextHAlignment::CENTER, TextVAlignment vAlignment = TextVAlignment::TOP);
/** 使用 text 初始化一个 texture */
bool initWithString(const char *text, const FontDefinition& textDefinition);

/** 为 texture 设置过滤器的最小值和磁力
如果 texture 是 NPOT (密度不是 2),那么它只能在 GL_TEXTURE_WRAP_{S,T} 里面使用 GL_CLAMP_TO_EDGE

@warning 调用此方法,可以为 texture 分配额外的内存。

@since v0.8
* @code
* 这个功能函数在 js 或者 lua 里面使用时,输入参数会改变
* In js: var setBlendFunc(var arg1, var arg2, var arg3, var arg4)
* In lua: local setBlendFunc(local arg1, local arg2, local arg3, local arg4)
* @endcode
*/
void setTexParameters(const TexParams& texParams);
/**
* @js NA
* @lua NA
*/
CC_DEPRECATED_ATTRIBUTE void setTexParameters(const TexParams* texParams) { return setTexParameters(*texParams); };

/** sets texture 的反锯齿参数:
- GL_TEXTURE_MIN_FILTER = GL_LINEAR
- GL_TEXTURE_MAG_FILTER = GL_LINEAR

@warning 调用此方法,可以为 texture 分配额外的内存。

@since v0.8
*/
void setAntiAliasTexParameters();

/** 设置 texture 参数别名:
- GL_TEXTURE_MIN_FILTER = GL_NEAREST
- GL_TEXTURE_MAG_FILTER = GL_NEAREST

@warning 调用此方法,可以分配额外的 texture 内存。

@since v0.8
*/
void setAliasTexParameters();

/** 为 texture 产生 mipmap 图片.
It only works if the texture size is POT (power of 2).      //她只在 texture 密度是2 时工作
@since v0.99.0
*/
void generateMipmap();

/** returns 像素格式.
@since v2.0
*/
const char* getStringForFormat() const;
CC_DEPRECATED_ATTRIBUTE const char* stringForFormat() const { return getStringForFormat(); };

/** return OpenGL texture每像素在内存中所占的 bit
@since v1.0
*/
unsigned int getBitsPerPixelForFormat() const;
CC_DEPRECATED_ATTRIBUTE unsigned int bitsPerPixelForFormat() const { return getBitsPerPixelForFormat(); };

/**辅助功能,对于一个给定的格式返回每像素所占bit。
@since v2.0
*/
unsigned int getBitsPerPixelForFormat(Texture2D::PixelFormat format) const;
CC_DEPRECATED_ATTRIBUTE unsigned int bitsPerPixelForFormat(Texture2D::PixelFormat format) const { return getBitsPerPixelForFormat(format); };

/** 内容尺寸 */
const Size& getContentSizeInPixels();

bool hasPremultipliedAlpha() const;
bool hasMipmaps() const;

/** Gets texture 的像素格式 */
Texture2D::PixelFormat getPixelFormat() const;

/**获取 texture 的宽度(以像素为单位)*/
unsigned int getPixelsWide() const;

/** *获取 texture 的高度(以像素为单位) */
unsigned int getPixelsHigh() const;

/** Gets texture 名字 */
GLuint getName() const;

/** Gets max S */
GLfloat getMaxS() const;
/** Sets max S */
void setMaxS(GLfloat maxS);

/** Gets max T */
GLfloat getMaxT() const;
/** Sets max T */
void setMaxT(GLfloat maxT);

Size getContentSize() const;

void setShaderProgram(GLProgram* program);
GLProgram* getShaderProgram() const;

public:
static const PixelFormatInfoMap& getPixelFormatInfoMap();

private:

转换函数

/**convert functions*/      //转换函数

/**
准换格式到你指定的格式参数,如果这个参数是, PixelFormat::Automatic,他会自动检测转换成最接近,你指定的格式参数。他会返回转换后的格式给你 如果 outData != data(输出数据不等于传入的数据),你必须手动删除
*/
static PixelFormat convertDataToFormat(const unsigned char* data, int dataLen, PixelFormat originFormat, PixelFormat format, unsigned char** outData, int* outDataLen);

static PixelFormat convertI8ToFormat(const unsigned char* data, int dataLen, PixelFormat format, unsigned char** outData, int* outDataLen);
static PixelFormat convertAI88ToFormat(const unsigned char* data, int dataLen, PixelFormat format, unsigned char** outData, int* outDataLen);
static PixelFormat convertRGB888ToFormat(const unsigned char* data, int dataLen, PixelFormat format, unsigned char** outData, int* outDataLen);
static PixelFormat convertRGBA8888ToFormat(const unsigned char* data, int dataLen, PixelFormat format, unsigned char** outData, int* outDataLen);

//I8 to XXX
static void convertI8ToRGB888(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertI8ToRGBA8888(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertI8ToRGB565(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertI8ToRGBA4444(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertI8ToRGB5A1(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertI8ToAI88(const unsigned char* data, int dataLen, unsigned char* outData);

//AI88 to XXX
static void convertAI88ToRGB888(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertAI88ToRGBA8888(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertAI88ToRGB565(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertAI88ToRGBA4444(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertAI88ToRGB5A1(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertAI88ToA8(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertAI88ToI8(const unsigned char* data, int dataLen, unsigned char* outData);

//RGB888 to XXX
static void convertRGB888ToRGBA8888(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGB888ToRGB565(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGB888ToI8(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGB888ToAI88(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGB888ToRGBA4444(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGB888ToRGB5A1(const unsigned char* data, int dataLen, unsigned char* outData);

//RGBA8888 to XXX
static void convertRGBA8888ToRGB888(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGBA8888ToRGB565(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGBA8888ToI8(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGBA8888ToA8(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGBA8888ToAI88(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGBA8888ToRGBA4444(const unsigned char* data, int dataLen, unsigned char* outData);
static void convertRGBA8888ToRGB5A1(const unsigned char* data, int dataLen, unsigned char* outData);

protected:
/**  texture 的像素格式 */
Texture2D::PixelFormat _pixelFormat;

/**宽度(像素)s */
unsigned int _pixelsWide;

/**高度(像素) */
unsigned int _pixelsHigh;

/** texture 名 */
GLuint _name;

/** texture max S */
GLfloat _maxS;

/** texture max T */
GLfloat _maxT;

/** content 尺寸 */
Size _contentSize;

/** texture 是否有他们的 Alpha premultiplied */
bool _hasPremultipliedAlpha;

bool _hasMipmaps;

/** 着色器程序在 drawAtPoint and drawInRect 里面使用*/
GLProgram* _shaderProgram;

static const PixelFormatInfoMap _pixelFormatInfoTables;
};

// end of textures group
/// @}

NS_CC_END

#endif //__CCTEXTURE2D_H__
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: