mirror of https://github.com/axmolengine/axmol.git
original version of PrimitiveCommand
This commit is contained in:
parent
a5add07fb5
commit
f269d7345e
|
@ -1256,6 +1256,8 @@
|
||||||
B257B44F1989D5E800D9A687 /* CCPrimitive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B257B44C1989D5E800D9A687 /* CCPrimitive.cpp */; };
|
B257B44F1989D5E800D9A687 /* CCPrimitive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B257B44C1989D5E800D9A687 /* CCPrimitive.cpp */; };
|
||||||
B257B4501989D5E800D9A687 /* CCPrimitive.h in Headers */ = {isa = PBXBuildFile; fileRef = B257B44D1989D5E800D9A687 /* CCPrimitive.h */; };
|
B257B4501989D5E800D9A687 /* CCPrimitive.h in Headers */ = {isa = PBXBuildFile; fileRef = B257B44D1989D5E800D9A687 /* CCPrimitive.h */; };
|
||||||
B257B4511989D5E800D9A687 /* CCPrimitive.h in Headers */ = {isa = PBXBuildFile; fileRef = B257B44D1989D5E800D9A687 /* CCPrimitive.h */; };
|
B257B4511989D5E800D9A687 /* CCPrimitive.h in Headers */ = {isa = PBXBuildFile; fileRef = B257B44D1989D5E800D9A687 /* CCPrimitive.h */; };
|
||||||
|
B257B460198A353E00D9A687 /* CCPrimitiveCommand.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B257B45E198A353E00D9A687 /* CCPrimitiveCommand.cpp */; };
|
||||||
|
B257B461198A353E00D9A687 /* CCPrimitiveCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = B257B45F198A353E00D9A687 /* CCPrimitiveCommand.h */; };
|
||||||
B276EF5F1988D1D500CD400F /* CCVertexIndexData.h in Headers */ = {isa = PBXBuildFile; fileRef = B276EF5B1988D1D500CD400F /* CCVertexIndexData.h */; };
|
B276EF5F1988D1D500CD400F /* CCVertexIndexData.h in Headers */ = {isa = PBXBuildFile; fileRef = B276EF5B1988D1D500CD400F /* CCVertexIndexData.h */; };
|
||||||
B276EF601988D1D500CD400F /* CCVertexIndexData.h in Headers */ = {isa = PBXBuildFile; fileRef = B276EF5B1988D1D500CD400F /* CCVertexIndexData.h */; };
|
B276EF601988D1D500CD400F /* CCVertexIndexData.h in Headers */ = {isa = PBXBuildFile; fileRef = B276EF5B1988D1D500CD400F /* CCVertexIndexData.h */; };
|
||||||
B276EF611988D1D500CD400F /* CCVertexIndexData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B276EF5C1988D1D500CD400F /* CCVertexIndexData.cpp */; };
|
B276EF611988D1D500CD400F /* CCVertexIndexData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B276EF5C1988D1D500CD400F /* CCVertexIndexData.cpp */; };
|
||||||
|
@ -2992,6 +2994,8 @@
|
||||||
B24EEA8619775EF3004493CC /* libnetwork iOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libnetwork iOS.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
B24EEA8619775EF3004493CC /* libnetwork iOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libnetwork iOS.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
B257B44C1989D5E800D9A687 /* CCPrimitive.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCPrimitive.cpp; sourceTree = "<group>"; };
|
B257B44C1989D5E800D9A687 /* CCPrimitive.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCPrimitive.cpp; sourceTree = "<group>"; };
|
||||||
B257B44D1989D5E800D9A687 /* CCPrimitive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCPrimitive.h; sourceTree = "<group>"; };
|
B257B44D1989D5E800D9A687 /* CCPrimitive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCPrimitive.h; sourceTree = "<group>"; };
|
||||||
|
B257B45E198A353E00D9A687 /* CCPrimitiveCommand.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCPrimitiveCommand.cpp; sourceTree = "<group>"; };
|
||||||
|
B257B45F198A353E00D9A687 /* CCPrimitiveCommand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCPrimitiveCommand.h; sourceTree = "<group>"; };
|
||||||
B276EF5B1988D1D500CD400F /* CCVertexIndexData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCVertexIndexData.h; sourceTree = "<group>"; };
|
B276EF5B1988D1D500CD400F /* CCVertexIndexData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCVertexIndexData.h; sourceTree = "<group>"; };
|
||||||
B276EF5C1988D1D500CD400F /* CCVertexIndexData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCVertexIndexData.cpp; sourceTree = "<group>"; };
|
B276EF5C1988D1D500CD400F /* CCVertexIndexData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CCVertexIndexData.cpp; sourceTree = "<group>"; };
|
||||||
B276EF5D1988D1D500CD400F /* CCVertexIndexBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCVertexIndexBuffer.h; sourceTree = "<group>"; };
|
B276EF5D1988D1D500CD400F /* CCVertexIndexBuffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CCVertexIndexBuffer.h; sourceTree = "<group>"; };
|
||||||
|
@ -4922,6 +4926,8 @@
|
||||||
50ABBD821925AB4100A911A9 /* CCTextureCache.h */,
|
50ABBD821925AB4100A911A9 /* CCTextureCache.h */,
|
||||||
B257B44C1989D5E800D9A687 /* CCPrimitive.cpp */,
|
B257B44C1989D5E800D9A687 /* CCPrimitive.cpp */,
|
||||||
B257B44D1989D5E800D9A687 /* CCPrimitive.h */,
|
B257B44D1989D5E800D9A687 /* CCPrimitive.h */,
|
||||||
|
B257B45E198A353E00D9A687 /* CCPrimitiveCommand.cpp */,
|
||||||
|
B257B45F198A353E00D9A687 /* CCPrimitiveCommand.h */,
|
||||||
5034CA5D191D591900CE6051 /* shaders */,
|
5034CA5D191D591900CE6051 /* shaders */,
|
||||||
);
|
);
|
||||||
name = renderer;
|
name = renderer;
|
||||||
|
@ -5379,6 +5385,7 @@
|
||||||
5034CA35191D591100CE6051 /* ccShader_PositionTexture.frag in Headers */,
|
5034CA35191D591100CE6051 /* ccShader_PositionTexture.frag in Headers */,
|
||||||
50ABBE6F1925AB6F00A911A9 /* CCEventListenerKeyboard.h in Headers */,
|
50ABBE6F1925AB6F00A911A9 /* CCEventListenerKeyboard.h in Headers */,
|
||||||
50ABBE9D1925AB6F00A911A9 /* CCRefPtr.h in Headers */,
|
50ABBE9D1925AB6F00A911A9 /* CCRefPtr.h in Headers */,
|
||||||
|
B257B461198A353E00D9A687 /* CCPrimitiveCommand.h in Headers */,
|
||||||
5034CA31191D591100CE6051 /* ccShader_PositionTexture_uColor.vert in Headers */,
|
5034CA31191D591100CE6051 /* ccShader_PositionTexture_uColor.vert in Headers */,
|
||||||
50ABBE7B1925AB6F00A911A9 /* CCEventMouse.h in Headers */,
|
50ABBE7B1925AB6F00A911A9 /* CCEventMouse.h in Headers */,
|
||||||
503DD8F91926B0DB00CD74DD /* CCIMEDispatcher.h in Headers */,
|
503DD8F91926B0DB00CD74DD /* CCIMEDispatcher.h in Headers */,
|
||||||
|
@ -6753,6 +6760,7 @@
|
||||||
50ABBEBF1925AB6F00A911A9 /* CCValue.cpp in Sources */,
|
50ABBEBF1925AB6F00A911A9 /* CCValue.cpp in Sources */,
|
||||||
1A570098180BC5C10088DEC7 /* CCAtlasNode.cpp in Sources */,
|
1A570098180BC5C10088DEC7 /* CCAtlasNode.cpp in Sources */,
|
||||||
1A57009E180BC5D20088DEC7 /* CCNode.cpp in Sources */,
|
1A57009E180BC5D20088DEC7 /* CCNode.cpp in Sources */,
|
||||||
|
B257B460198A353E00D9A687 /* CCPrimitiveCommand.cpp in Sources */,
|
||||||
50ABBE651925AB6F00A911A9 /* CCEventListenerCustom.cpp in Sources */,
|
50ABBE651925AB6F00A911A9 /* CCEventListenerCustom.cpp in Sources */,
|
||||||
B37510781823AC9F00B3BA6A /* CCPhysicsShapeInfo_chipmunk.cpp in Sources */,
|
B37510781823AC9F00B3BA6A /* CCPhysicsShapeInfo_chipmunk.cpp in Sources */,
|
||||||
50ABBE391925AB6F00A911A9 /* CCData.cpp in Sources */,
|
50ABBE391925AB6F00A911A9 /* CCData.cpp in Sources */,
|
||||||
|
|
|
@ -87,4 +87,53 @@ bool Primitive::init(VertexData* verts, IndexData* indices, PrimitiveType type)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Primitive::draw()
|
||||||
|
{
|
||||||
|
if(_verts && _indices)
|
||||||
|
{
|
||||||
|
_verts->use();
|
||||||
|
switch (_type) {
|
||||||
|
case PrimitiveType::POINTS:
|
||||||
|
if(_indices->getIndexBuffer() != nullptr)
|
||||||
|
{
|
||||||
|
GLenum type = (_indices->getIndexBuffer()->getType() == IndexBuffer::IndexType::INDEX_TYPE_SHORT_16) ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT;
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indices->getIndexBuffer()->getVBO());
|
||||||
|
glDrawElements(GL_POINTS, _indices->getCount(), type, (GLvoid*)_indices->getStart());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
glDrawArrays(GL_POINTS, _indices->getStart(), _indices->getCount());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PrimitiveType::LINES:
|
||||||
|
if(_indices->getIndexBuffer() != nullptr)
|
||||||
|
{
|
||||||
|
GLenum type = (_indices->getIndexBuffer()->getType() == IndexBuffer::IndexType::INDEX_TYPE_SHORT_16) ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT;
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indices->getIndexBuffer()->getVBO());
|
||||||
|
glDrawElements(GL_LINES, _indices->getCount(), type, (GLvoid*)_indices->getStart());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
glDrawArrays(GL_LINES, _indices->getStart(), _indices->getCount());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PrimitiveType::TRIANGLES:
|
||||||
|
if(_indices->getIndexBuffer() != nullptr)
|
||||||
|
{
|
||||||
|
GLenum type = (_indices->getIndexBuffer()->getType() == IndexBuffer::IndexType::INDEX_TYPE_SHORT_16) ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT;
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indices->getIndexBuffer()->getVBO());
|
||||||
|
glDrawElements(GL_TRIANGLES, _indices->getCount(), type, (GLvoid*)_indices->getStart());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
glDrawArrays(GL_TRIANGLES, _indices->getStart(), _indices->getCount());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
CC_ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
NS_CC_END
|
NS_CC_END
|
||||||
|
|
|
@ -48,6 +48,9 @@ public:
|
||||||
IndexData* getIndexData();
|
IndexData* getIndexData();
|
||||||
|
|
||||||
PrimitiveType getType() const { return _type; }
|
PrimitiveType getType() const { return _type; }
|
||||||
|
|
||||||
|
//called by rendering framework
|
||||||
|
void draw();
|
||||||
protected:
|
protected:
|
||||||
Primitive();
|
Primitive();
|
||||||
virtual ~Primitive();
|
virtual ~Primitive();
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
/****************************************************************************
|
||||||
|
Copyright (c) 2008-2010 Ricardo Quesada
|
||||||
|
Copyright (c) 2010-2012 cocos2d-x.org
|
||||||
|
Copyright (c) 2011 Zynga Inc.
|
||||||
|
Copyright (c) 2013-2014 Chukong Technologies Inc.
|
||||||
|
|
||||||
|
http://www.cocos2d-x.org
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "CCPrimitiveCommand.h"
|
||||||
|
|
||||||
|
#include "renderer/ccGLStateCache.h"
|
||||||
|
#include "renderer/CCGLProgram.h"
|
||||||
|
#include "renderer/CCGLProgramState.h"
|
||||||
|
#include "xxhash.h"
|
||||||
|
|
||||||
|
NS_CC_BEGIN
|
||||||
|
|
||||||
|
PrimitiveCommand::PrimitiveCommand()
|
||||||
|
: _materialID(0)
|
||||||
|
, _textureID(0)
|
||||||
|
, _glProgramState(nullptr)
|
||||||
|
, _blendType(BlendFunc::DISABLE)
|
||||||
|
, _primitive(nullptr)
|
||||||
|
{
|
||||||
|
_type = RenderCommand::Type::PRIMITIVE_COMMAND;
|
||||||
|
}
|
||||||
|
|
||||||
|
PrimitiveCommand::~PrimitiveCommand()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrimitiveCommand::init(float globalOrder, GLuint textureID, GLProgramState* glProgramState, BlendFunc blendType, Primitive* primitive,const Mat4& mv)
|
||||||
|
{
|
||||||
|
CCASSERT(glProgramState, "Invalid GLProgramState");
|
||||||
|
CCASSERT(glProgramState->getVertexAttribsFlags() == 0, "No custom attributes are supported in PrimitiveCommand");
|
||||||
|
CCASSERT(primitive != nullptr, "Could not render null primitive");
|
||||||
|
|
||||||
|
_globalOrder = globalOrder;
|
||||||
|
|
||||||
|
_primitive = primitive;
|
||||||
|
|
||||||
|
_mv = mv;
|
||||||
|
|
||||||
|
if( _textureID != textureID || _blendType.src != blendType.src || _blendType.dst != blendType.dst || _glProgramState != glProgramState) {
|
||||||
|
|
||||||
|
_textureID = textureID;
|
||||||
|
_blendType = blendType;
|
||||||
|
_glProgramState = glProgramState;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrimitiveCommand::execute() const
|
||||||
|
{
|
||||||
|
//Set texture
|
||||||
|
GL::bindTexture2D(_textureID);
|
||||||
|
|
||||||
|
//set blend mode
|
||||||
|
GL::blendFunc(_blendType.src, _blendType.dst);
|
||||||
|
|
||||||
|
_glProgramState->apply(_mv);
|
||||||
|
|
||||||
|
_primitive->draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_CC_END
|
|
@ -0,0 +1,63 @@
|
||||||
|
/****************************************************************************
|
||||||
|
Copyright (c) 2008-2010 Ricardo Quesada
|
||||||
|
Copyright (c) 2010-2012 cocos2d-x.org
|
||||||
|
Copyright (c) 2011 Zynga Inc.
|
||||||
|
Copyright (c) 2013-2014 Chukong Technologies Inc.
|
||||||
|
|
||||||
|
http://www.cocos2d-x.org
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _CC_PRIMITIVE_COMMAND_H__
|
||||||
|
#define _CC_PRIMITIVE_COMMAND_H__
|
||||||
|
|
||||||
|
#include "renderer/CCPrimitive.h"
|
||||||
|
#include "renderer/CCRenderCommand.h"
|
||||||
|
|
||||||
|
NS_CC_BEGIN
|
||||||
|
class GLProgramState;
|
||||||
|
class PrimitiveCommand : public RenderCommand
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PrimitiveCommand();
|
||||||
|
~PrimitiveCommand();
|
||||||
|
|
||||||
|
void init(float globalOrder, GLuint textureID, GLProgramState* glProgramState, BlendFunc blendType, Primitive* primitive,const Mat4& mv);
|
||||||
|
|
||||||
|
inline uint32_t getMaterialID() const { return _materialID; }
|
||||||
|
inline GLuint getTextureID() const { return _textureID; }
|
||||||
|
inline GLProgramState* getGLProgramState() const { return _glProgramState; }
|
||||||
|
inline BlendFunc getBlendType() const { return _blendType; }
|
||||||
|
inline const Mat4& getModelView() const { return _mv; }
|
||||||
|
|
||||||
|
void execute() const;
|
||||||
|
protected:
|
||||||
|
|
||||||
|
uint32_t _materialID;
|
||||||
|
GLuint _textureID;
|
||||||
|
GLProgramState* _glProgramState;
|
||||||
|
BlendFunc _blendType;
|
||||||
|
Primitive* _primitive;
|
||||||
|
Mat4 _mv;
|
||||||
|
};
|
||||||
|
|
||||||
|
NS_CC_END
|
||||||
|
|
||||||
|
#endif //_CC_PRIMITIVE_COMMAND_H__
|
|
@ -49,6 +49,7 @@ public:
|
||||||
BATCH_COMMAND,
|
BATCH_COMMAND,
|
||||||
GROUP_COMMAND,
|
GROUP_COMMAND,
|
||||||
MESH_COMMAND,
|
MESH_COMMAND,
|
||||||
|
PRIMITIVE_COMMAND,
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Get Render Command Id */
|
/** Get Render Command Id */
|
||||||
|
|
|
@ -45,6 +45,8 @@ public:
|
||||||
|
|
||||||
int getSize() const;
|
int getSize() const;
|
||||||
|
|
||||||
|
GLuint getVBO() const { return _vbo; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
VertexBuffer();
|
VertexBuffer();
|
||||||
virtual ~VertexBuffer();
|
virtual ~VertexBuffer();
|
||||||
|
@ -76,6 +78,8 @@ public:
|
||||||
//bool getIndices(void* indices, int count, int begin);
|
//bool getIndices(void* indices, int count, int begin);
|
||||||
|
|
||||||
int getSize() const;
|
int getSize() const;
|
||||||
|
|
||||||
|
GLuint getVBO() const { return _vbo; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
IndexBuffer();
|
IndexBuffer();
|
||||||
|
|
|
@ -46,15 +46,14 @@ size_t VertexData::getVertexStreamCount() const
|
||||||
return _vertexStreams.size();
|
return _vertexStreams.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool VertexData::setStream(int index, VertexBuffer* buffer, const VertexStreamAttribute& stream)
|
bool VertexData::setStream(VertexBuffer* buffer, const VertexStreamAttribute& stream)
|
||||||
{
|
{
|
||||||
if( buffer == nullptr ) return false;
|
if( buffer == nullptr ) return false;
|
||||||
|
auto iter = _vertexStreams.find(stream._semantic);
|
||||||
auto iter = _vertexStreams.find(index);
|
|
||||||
if(iter == _vertexStreams.end())
|
if(iter == _vertexStreams.end())
|
||||||
{
|
{
|
||||||
buffer->retain();
|
buffer->retain();
|
||||||
auto& bufferAttribute = _vertexStreams[index];
|
auto& bufferAttribute = _vertexStreams[stream._semantic];
|
||||||
bufferAttribute._buffer = buffer;
|
bufferAttribute._buffer = buffer;
|
||||||
bufferAttribute._stream = stream;
|
bufferAttribute._stream = stream;
|
||||||
}
|
}
|
||||||
|
@ -69,9 +68,9 @@ bool VertexData::setStream(int index, VertexBuffer* buffer, const VertexStreamAt
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VertexData::removeStream(int index)
|
void VertexData::removeStream(VertexSemantic semantic)
|
||||||
{
|
{
|
||||||
auto iter = _vertexStreams.find(index);
|
auto iter = _vertexStreams.find(semantic);
|
||||||
if(iter != _vertexStreams.end())
|
if(iter != _vertexStreams.end())
|
||||||
{
|
{
|
||||||
iter->second._buffer->release();
|
iter->second._buffer->release();
|
||||||
|
@ -79,23 +78,23 @@ void VertexData::removeStream(int index)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const VertexStreamAttribute* VertexData::getStreamAttribute(int index) const
|
const VertexStreamAttribute* VertexData::getStreamAttribute(VertexSemantic semantic) const
|
||||||
{
|
{
|
||||||
auto iter = _vertexStreams.find(index);
|
auto iter = _vertexStreams.find(semantic);
|
||||||
if(iter == _vertexStreams.end()) return nullptr;
|
if(iter == _vertexStreams.end()) return nullptr;
|
||||||
else return &iter->second._stream;
|
else return &iter->second._stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
VertexStreamAttribute* VertexData::getStreamAttribute(int index)
|
VertexStreamAttribute* VertexData::getStreamAttribute(VertexSemantic semantic)
|
||||||
{
|
{
|
||||||
auto iter = _vertexStreams.find(index);
|
auto iter = _vertexStreams.find(semantic);
|
||||||
if(iter == _vertexStreams.end()) return nullptr;
|
if(iter == _vertexStreams.end()) return nullptr;
|
||||||
else return &iter->second._stream;
|
else return &iter->second._stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
VertexBuffer* VertexData::getStreamBuffer(int index) const
|
VertexBuffer* VertexData::getStreamBuffer(VertexSemantic semantic) const
|
||||||
{
|
{
|
||||||
auto iter = _vertexStreams.find(index);
|
auto iter = _vertexStreams.find(semantic);
|
||||||
if(iter == _vertexStreams.end()) return nullptr;
|
if(iter == _vertexStreams.end()) return nullptr;
|
||||||
else return iter->second._buffer;
|
else return iter->second._buffer;
|
||||||
}
|
}
|
||||||
|
@ -114,6 +113,55 @@ VertexData::~VertexData()
|
||||||
_vertexStreams.clear();
|
_vertexStreams.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GLint VertexData::getGLSize(VertexType type)
|
||||||
|
{
|
||||||
|
if(VertexType::FLOAT1 == type)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if(VertexType::FLOAT2 == type)
|
||||||
|
{
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
else if(VertexType::FLOAT3 == type)
|
||||||
|
{
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GLenum VertexData::getGLType(VertexType type)
|
||||||
|
{
|
||||||
|
if(VertexType::BYTE4 == type)
|
||||||
|
{
|
||||||
|
return GL_UNSIGNED_BYTE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return GL_FLOAT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GLint VertexData::getGLSemanticBinding(VertexSemantic semantic)
|
||||||
|
{
|
||||||
|
return GLint(semantic);
|
||||||
|
}
|
||||||
|
|
||||||
|
void VertexData::use()
|
||||||
|
{
|
||||||
|
for(auto& element : _vertexStreams)
|
||||||
|
{
|
||||||
|
glEnableVertexAttribArray(getGLSemanticBinding(element.second._stream._semantic));
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, element.second._buffer->getVBO());
|
||||||
|
glVertexAttribPointer(getGLSemanticBinding(element.second._stream._semantic),getGLSize(element.second._stream._type),
|
||||||
|
getGLType(element.second._stream._type),false, element.second._buffer->getSizePerVertex(), (GLvoid*)element.second._stream._offset);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
IndexData* IndexData::create(IndexBuffer* buffer, int start, int count)
|
IndexData* IndexData::create(IndexBuffer* buffer, int start, int count)
|
||||||
{
|
{
|
||||||
IndexData* result = new (std::nothrow) IndexData();
|
IndexData* result = new (std::nothrow) IndexData();
|
||||||
|
@ -143,7 +191,7 @@ IndexData::~IndexData()
|
||||||
|
|
||||||
bool IndexData::init(IndexBuffer* buffer, int start, int count)
|
bool IndexData::init(IndexBuffer* buffer, int start, int count)
|
||||||
{
|
{
|
||||||
if(count == 0)return false;
|
if(count == 0) return false;
|
||||||
if(_buffer != buffer)
|
if(_buffer != buffer)
|
||||||
{
|
{
|
||||||
CC_SAFE_RELEASE_NULL(_buffer);
|
CC_SAFE_RELEASE_NULL(_buffer);
|
||||||
|
|
|
@ -37,9 +37,9 @@ NS_CC_BEGIN
|
||||||
|
|
||||||
class VertexBuffer;
|
class VertexBuffer;
|
||||||
|
|
||||||
enum class VertexSemantic
|
enum VertexSemantic
|
||||||
{
|
{
|
||||||
UNKNOWN,
|
UNKNOWN = -1,
|
||||||
POSITION,
|
POSITION,
|
||||||
COLOR,
|
COLOR,
|
||||||
NORMAL,
|
NORMAL,
|
||||||
|
@ -64,10 +64,9 @@ enum class VertexType
|
||||||
struct VertexStreamAttribute
|
struct VertexStreamAttribute
|
||||||
{
|
{
|
||||||
VertexStreamAttribute()
|
VertexStreamAttribute()
|
||||||
: _index(-1), _offset(0),_semantic(VertexSemantic::UNKNOWN),_type(VertexType::UNKNOWN)
|
: _offset(0),_semantic(VertexSemantic::UNKNOWN),_type(VertexType::UNKNOWN)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
int _index;
|
|
||||||
int _offset;
|
int _offset;
|
||||||
VertexSemantic _semantic;
|
VertexSemantic _semantic;
|
||||||
VertexType _type;
|
VertexType _type;
|
||||||
|
@ -79,13 +78,14 @@ public:
|
||||||
static VertexData* create();
|
static VertexData* create();
|
||||||
|
|
||||||
size_t getVertexStreamCount() const;
|
size_t getVertexStreamCount() const;
|
||||||
bool setStream(int index, VertexBuffer* buffer, const VertexStreamAttribute& stream);
|
bool setStream(VertexBuffer* buffer, const VertexStreamAttribute& stream);
|
||||||
void removeStream(int index);
|
void removeStream(VertexSemantic semantic);
|
||||||
const VertexStreamAttribute* getStreamAttribute(int index) const;
|
const VertexStreamAttribute* getStreamAttribute(VertexSemantic semantic) const;
|
||||||
VertexStreamAttribute* getStreamAttribute(int index);
|
VertexStreamAttribute* getStreamAttribute(VertexSemantic semantic);
|
||||||
|
|
||||||
VertexBuffer* getStreamBuffer(int index) const;
|
VertexBuffer* getStreamBuffer(VertexSemantic semantic) const;
|
||||||
|
|
||||||
|
void use();
|
||||||
protected:
|
protected:
|
||||||
VertexData();
|
VertexData();
|
||||||
virtual ~VertexData();
|
virtual ~VertexData();
|
||||||
|
@ -96,8 +96,11 @@ protected:
|
||||||
VertexStreamAttribute _stream;
|
VertexStreamAttribute _stream;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::map<int, BufferAttribute> _vertexStreams;
|
std::map<VertexSemantic, BufferAttribute> _vertexStreams;
|
||||||
|
protected:
|
||||||
|
static GLint getGLSize(VertexType type);
|
||||||
|
static GLenum getGLType(VertexType type);
|
||||||
|
static GLint getGLSemanticBinding(VertexSemantic semantic);
|
||||||
};
|
};
|
||||||
|
|
||||||
class IndexData : public Ref
|
class IndexData : public Ref
|
||||||
|
@ -108,6 +111,7 @@ public:
|
||||||
IndexBuffer* getIndexBuffer() const { return _buffer; }
|
IndexBuffer* getIndexBuffer() const { return _buffer; }
|
||||||
int getStart() const { return _start; }
|
int getStart() const { return _start; }
|
||||||
int getCount() const { return _count; }
|
int getCount() const { return _count; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
IndexData();
|
IndexData();
|
||||||
virtual ~IndexData();
|
virtual ~IndexData();
|
||||||
|
|
Loading…
Reference in New Issue