| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- #include "BsVertexDeclaration.h"
- #include "BsVertexDeclarationRTTI.h"
- #include "BsHardwareBufferManager.h"
- #include "BsRenderAPI.h"
- namespace BansheeEngine
- {
- VertexElement::VertexElement(UINT16 source, UINT32 offset,
- VertexElementType theType, VertexElementSemantic semantic, UINT16 index)
- : mSource(source), mOffset(offset), mType(theType), mSemantic(semantic), mIndex(index)
- {
- }
- UINT32 VertexElement::getSize(void) const
- {
- return getTypeSize(mType);
- }
- UINT32 VertexElement::getTypeSize(VertexElementType etype)
- {
- switch(etype)
- {
- case VET_COLOR:
- case VET_COLOR_ABGR:
- case VET_COLOR_ARGB:
- return sizeof(RGBA);
- case VET_FLOAT1:
- return sizeof(float);
- case VET_FLOAT2:
- return sizeof(float)*2;
- case VET_FLOAT3:
- return sizeof(float)*3;
- case VET_FLOAT4:
- return sizeof(float)*4;
- case VET_SHORT1:
- return sizeof(short);
- case VET_SHORT2:
- return sizeof(short)*2;
- case VET_SHORT3:
- return sizeof(short)*3;
- case VET_SHORT4:
- return sizeof(short)*4;
- case VET_UBYTE4:
- return sizeof(unsigned char)*4;
- }
- return 0;
- }
- unsigned short VertexElement::getTypeCount(VertexElementType etype)
- {
- switch (etype)
- {
- case VET_COLOR:
- case VET_COLOR_ABGR:
- case VET_COLOR_ARGB:
- return 4;
- case VET_FLOAT1:
- return 1;
- case VET_FLOAT2:
- return 2;
- case VET_FLOAT3:
- return 3;
- case VET_FLOAT4:
- return 4;
- case VET_SHORT1:
- return 1;
- case VET_SHORT2:
- return 2;
- case VET_SHORT3:
- return 3;
- case VET_SHORT4:
- return 4;
- case VET_UBYTE4:
- return 4;
- }
- BS_EXCEPT(InvalidParametersException, "Invalid type");
- }
- VertexElementType VertexElement::getBestColorVertexElementType()
- {
- // Use the current render system to determine if possible
- if (BansheeEngine::RenderAPICore::instancePtr())
- {
- return BansheeEngine::RenderAPICore::instancePtr()->getColorVertexElementType();
- }
- else
- {
- // We can't know the specific type right now, so pick a type
- // based on platform
- #if BS_PLATFORM == BS_PLATFORM_WIN32
- return VET_COLOR_ARGB; // prefer D3D format on windows
- #else
- return VET_COLOR_ABGR; // prefer GL format on everything else
- #endif
- }
- }
- bool VertexElement::operator== (const VertexElement& rhs) const
- {
- if (mType != rhs.mType || mIndex != rhs.mIndex || mOffset != rhs.mOffset ||
- mSemantic != rhs.mSemantic || mSource != rhs.mSource)
- {
- return false;
- }
- else
- return true;
- }
- bool VertexElement::operator!= (const VertexElement& rhs) const
- {
- return !(*this == rhs);
- }
- VertexDeclarationProperties::VertexDeclarationProperties(const List<VertexElement>& elements)
- {
- for (auto& elem : elements)
- {
- VertexElementType type = elem.getType();
- if (elem.getType() == VET_COLOR)
- type = VertexElement::getBestColorVertexElementType();
- mElementList.push_back(VertexElement(elem.getStreamIdx(), elem.getOffset(), type, elem.getSemantic(), elem.getSemanticIdx()));
- }
- }
- bool VertexDeclarationProperties::operator== (const VertexDeclarationProperties& rhs) const
- {
- if (mElementList.size() != rhs.mElementList.size())
- return false;
- auto myIter = mElementList.begin();
- auto theirIter = rhs.mElementList.begin();
- for (; myIter != mElementList.end() && theirIter != rhs.mElementList.end(); ++myIter, ++theirIter)
- {
- if (!(*myIter == *theirIter))
- return false;
- }
- return true;
- }
- bool VertexDeclarationProperties::operator!= (const VertexDeclarationProperties& rhs) const
- {
- return !(*this == rhs);
- }
- const VertexElement* VertexDeclarationProperties::getElement(UINT16 index) const
- {
- assert(index < mElementList.size() && "Index out of bounds");
- auto iter = mElementList.begin();
- for (UINT16 i = 0; i < index; ++i)
- ++iter;
- return &(*iter);
- }
-
- const VertexElement* VertexDeclarationProperties::findElementBySemantic(VertexElementSemantic sem, UINT16 index) const
- {
- for (auto& elem : mElementList)
- {
- if (elem.getSemantic() == sem && elem.getSemanticIdx() == index)
- {
- return &elem;
- }
- }
- return nullptr;
- }
- List<VertexElement> VertexDeclarationProperties::findElementsBySource(UINT16 source) const
- {
- List<VertexElement> retList;
- for (auto& elem : mElementList)
- {
- if (elem.getStreamIdx() == source)
- {
- retList.push_back(elem);
- }
- }
- return retList;
- }
- UINT32 VertexDeclarationProperties::getVertexSize(UINT16 source) const
- {
- UINT32 size = 0;
- for (auto& elem : mElementList)
- {
- if (elem.getStreamIdx() == source)
- {
- size += elem.getSize();
- }
- }
- return size;
- }
- UINT32 VertexDeclarationCore::NextFreeId = 0;
- VertexDeclarationCore::VertexDeclarationCore(const List<VertexElement>& elements)
- :mProperties(elements)
- {
-
- }
- void VertexDeclarationCore::initialize()
- {
- mId = NextFreeId++;
- CoreObjectCore::initialize();
- }
- bool VertexDeclarationCore::isCompatible(const SPtr<VertexDeclarationCore>& shaderDecl)
- {
- const List<VertexElement>& shaderElems = shaderDecl->getProperties().getElements();
- const List<VertexElement>& bufferElems = getProperties().getElements();
- for (auto shaderIter = shaderElems.begin(); shaderIter != shaderElems.end(); ++shaderIter)
- {
- const VertexElement* foundElement = nullptr;
- for (auto bufferIter = bufferElems.begin(); bufferIter != bufferElems.end(); ++bufferIter)
- {
- if (shaderIter->getSemantic() == bufferIter->getSemantic() && shaderIter->getSemanticIdx() == bufferIter->getSemanticIdx())
- {
- foundElement = &(*bufferIter);
- break;
- }
- }
- if (foundElement == nullptr)
- return false;
- }
- return true;
- }
- Vector<VertexElement> VertexDeclarationCore::getMissingElements(const SPtr<VertexDeclarationCore>& shaderDecl)
- {
- Vector<VertexElement> missingElements;
- const List<VertexElement>& shaderElems = shaderDecl->getProperties().getElements();
- const List<VertexElement>& bufferElems = getProperties().getElements();
- for (auto shaderIter = shaderElems.begin(); shaderIter != shaderElems.end(); ++shaderIter)
- {
- const VertexElement* foundElement = nullptr;
- for (auto bufferIter = bufferElems.begin(); bufferIter != bufferElems.end(); ++bufferIter)
- {
- if (shaderIter->getSemantic() == bufferIter->getSemantic() && shaderIter->getSemanticIdx() == bufferIter->getSemanticIdx())
- {
- foundElement = &(*bufferIter);
- break;
- }
- }
- if (foundElement == nullptr)
- missingElements.push_back(*shaderIter);
- }
- return missingElements;
- }
- VertexDeclaration::VertexDeclaration(const List<VertexElement>& elements)
- :mProperties(elements)
- {
- }
- SPtr<VertexDeclarationCore> VertexDeclaration::getCore() const
- {
- return std::static_pointer_cast<VertexDeclarationCore>(mCoreSpecific);
- }
- SPtr<CoreObjectCore> VertexDeclaration::createCore() const
- {
- return HardwareBufferCoreManager::instance().createVertexDeclarationInternal(mProperties.mElementList);
- }
- VertexDeclarationPtr VertexDeclaration::createVertexDeclaration(const List<VertexElement>& elements)
- {
- return HardwareBufferManager::instance().createVertexDeclaration(elements);
- }
- /************************************************************************/
- /* SERIALIZATION */
- /************************************************************************/
- RTTITypeBase* VertexDeclaration::getRTTIStatic()
- {
- return VertexDeclarationRTTI::instance();
- }
- RTTITypeBase* VertexDeclaration::getRTTI() const
- {
- return getRTTIStatic();
- }
- String toString(const VertexElementSemantic& val)
- {
- switch (val)
- {
- case VES_POSITION:
- return "POSITION";
- case VES_BLEND_WEIGHTS:
- return "BLEND_WEIGHTS";
- case VES_BLEND_INDICES:
- return "BLEND_INDICES";
- case VES_NORMAL:
- return "NORMAL";
- case VES_COLOR:
- return "COLOR";
- case VES_TEXCOORD:
- return "TEXCOORD";
- case VES_BITANGENT:
- return "BITANGENT";
- case VES_TANGENT:
- return "TANGENT";
- case VES_POSITIONT:
- return "POSITIONT";
- case VES_PSIZE:
- return "PSIZE";
- }
- return "";
- }
- WString toWString(const VertexElementSemantic& val)
- {
- return toWString(toString(val));
- }
- }
|