本文整理汇总了C++中OGRE_EXCEPT函数的典型用法代码示例。如果您正苦于以下问题:C++ OGRE_EXCEPT函数的具体用法?C++ OGRE_EXCEPT怎么用?C++ OGRE_EXCEPT使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了OGRE_EXCEPT函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: getParameterByContent
//-----------------------------------------------------------------------------
ParameterPtr Function::resolveInputParameter(Parameter::Semantic semantic,
int index,
const Parameter::Content content,
GpuConstantType type)
{
ParameterPtr param;
// Check if desired parameter already defined.
param = getParameterByContent(mInputParameters, content, type);
if (param.get() != NULL)
return param;
// Case we have to create new parameter.
if (index == -1)
{
index = 0;
// Find the next available index of the target semantic.
ShaderParameterIterator it;
for (it = mInputParameters.begin(); it != mInputParameters.end(); ++it)
{
if ((*it)->getSemantic() == semantic)
{
index++;
}
}
}
else
{
// Check if desired parameter already defined.
param = getParameterBySemantic(mInputParameters, semantic, index);
if (param.get() != NULL && param->getContent() == content)
{
if (param->getType() == type)
{
return param;
}
else
{
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS,
"Can not resolve parameter - semantic: " + StringConverter::toString(semantic) + " - index: " + StringConverter::toString(index) + " due to type mismatch. Function <" + getName() + ">",
"Function::resolveInputParameter" );
}
}
}
// No parameter found -> create new one.
switch (semantic)
{
case Parameter::SPS_POSITION:
assert(type == GCT_FLOAT4);
param = ParameterFactory::createInPosition(index);
break;
case Parameter::SPS_BLEND_WEIGHTS:
case Parameter::SPS_BLEND_INDICES:
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS,
"Can not resolve parameter - semantic: " + StringConverter::toString(semantic) + " - index: " + StringConverter::toString(index) + " since support in it is not implemented yet. Function <" + getName() + ">",
"Function::resolveInputParameter" );
break;
case Parameter::SPS_NORMAL:
assert(type == GCT_FLOAT3);
param = ParameterFactory::createInNormal(index);
break;
case Parameter::SPS_COLOR:
assert(type == GCT_FLOAT4);
param = ParameterFactory::createInColor(index);
break;
case Parameter::SPS_TEXTURE_COORDINATES:
param = ParameterFactory::createInTexcoord(type, index, content);
break;
case Parameter::SPS_BINORMAL:
assert(type == GCT_FLOAT3);
param = ParameterFactory::createInBiNormal(index);
break;
case Parameter::SPS_TANGENT:
assert(type == GCT_FLOAT3);
param = ParameterFactory::createInTangent(index);
break;
case Parameter::SPS_UNKNOWN:
break;
}
if (param.get() != NULL)
addInputParameter(param);
return param;
}
示例2: while
//---------------------------------------------------------------------
size_t DeflateStream::read(void* buf, size_t count)
{
if (!mIsCompressedValid)
{
return mCompressedStream->read(buf, count);
}
if (getAccessMode() & WRITE)
{
return mTmpWriteStream->read(buf, count);
}
else
{
size_t restorePoint = mCompressedStream->tell();
// read from cache first
size_t cachereads = mReadCache.read(buf, count);
size_t newReadUncompressed = 0;
if (cachereads < count)
{
mZStream->avail_out = count - cachereads;
mZStream->next_out = (Bytef*)buf + cachereads;
while (mZStream->avail_out)
{
// Pull next chunk of compressed data from the underlying stream
if (!mZStream->avail_in && !mCompressedStream->eof())
{
mZStream->avail_in = mCompressedStream->read(mTmp, OGRE_DEFLATE_TMP_SIZE);
mZStream->next_in = mTmp;
}
if (mZStream->avail_in)
{
int availpre = mZStream->avail_out;
int status = inflate(mZStream, Z_SYNC_FLUSH);
size_t readUncompressed = availpre - mZStream->avail_out;
newReadUncompressed += readUncompressed;
if (status != Z_OK)
{
// End of data, or error
if (status != Z_STREAM_END)
{
mCompressedStream->seek(restorePoint);
OGRE_EXCEPT(Exception::ERR_INVALID_STATE,
"Error in compressed stream",
"DeflateStrea::read");
}
else
{
// back up the stream so that it can be used from the end onwards
long unusedCompressed = mZStream->avail_in;
mCompressedStream->skip(-unusedCompressed);
}
break;
}
}
}
}
// Cache the last bytes read
mReadCache.cacheData((char*)buf + cachereads, newReadUncompressed);
mCurrentPos += newReadUncompressed + cachereads;
return newReadUncompressed + cachereads;
}
}
示例3: OGRE_ALLOC_T
//---------------------------------------------------------------------
void DeflateStream::init()
{
mZStream = OGRE_ALLOC_T(z_stream, 1, MEMCATEGORY_GENERAL);
mZStream->zalloc = OgreZalloc;
mZStream->zfree = OgreZfree;
if (getAccessMode() == READ)
{
mTmp = (unsigned char*)OGRE_MALLOC(OGRE_DEFLATE_TMP_SIZE, MEMCATEGORY_GENERAL);
size_t restorePoint = mCompressedStream->tell();
// read early chunk
mZStream->next_in = mTmp;
mZStream->avail_in = mCompressedStream->read(mTmp, OGRE_DEFLATE_TMP_SIZE);
if (inflateInit(mZStream) != Z_OK)
{
mIsCompressedValid = false;
}
else
mIsCompressedValid = true;
if (mIsCompressedValid)
{
// in fact, inflateInit on some implementations doesn't try to read
// anything. We need to at least read something to test
Bytef testOut[4];
size_t savedIn = mZStream->avail_in;
mZStream->avail_out = 4;
mZStream->next_out = testOut;
if (inflate(mZStream, Z_SYNC_FLUSH) != Z_OK)
mIsCompressedValid = false;
// restore for reading
mZStream->avail_in = savedIn;
mZStream->next_in = mTmp;
inflateReset(mZStream);
}
if (!mIsCompressedValid)
{
// Not compressed data!
// Fail gracefully, fall back on reading the underlying stream direct
destroy();
mCompressedStream->seek(restorePoint);
}
}
else
{
if(mTempFileName.empty())
{
// Write to temp file
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
char* tmpname = _tempnam(".", "ogre");
if (!tmpname)
{
// Having no file name here will cause various problems later.
OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Temporary file name generation failed.", "DeflateStream::init");
}
else
{
mTempFileName = tmpname;
free(tmpname);
}
#else
char tmpname[L_tmpnam];
tmpnam(tmpname);
mTempFileName = tmpname;
#endif
}
std::fstream *f = OGRE_NEW_T(std::fstream, MEMCATEGORY_GENERAL)();
f->open(mTempFileName.c_str(), std::ios::binary | std::ios::out);
mTmpWriteStream = DataStreamPtr(OGRE_NEW FileStreamDataStream(f));
}
}
示例4: OGRE_EXCEPT
RenderTexture *HardwarePixelBuffer::getRenderTarget(size_t)
{
OGRE_EXCEPT(Exception::ERR_NOT_IMPLEMENTED,
"Not yet implemented for this rendersystem.",
"HardwarePixelBuffer::getRenderTarget");
}
示例5: OGRE_EXCEPT
//-----------------------------------------------------------------------------
ManualObject::ManualObjectSection* ManualObject::end(void)
{
if (!mCurrentSection)
{
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS,
"You cannot call end() until after you call begin()",
"ManualObject::end");
}
if (mTempVertexPending)
{
// bake current vertex
copyTempVertexToBuffer();
}
// pointer that will be returned
ManualObjectSection* result = NULL;
RenderOperation* rop = mCurrentSection->getRenderOperation();
// Check for empty content
if (rop->vertexData->vertexCount == 0 ||
(rop->useIndexes && rop->indexData->indexCount == 0))
{
// You're wasting my time sonny
if (mCurrentUpdating)
{
// Can't just undo / remove since may be in the middle
// Just allow counts to be 0, will not be issued to renderer
// return the finished section (though it has zero vertices)
result = mCurrentSection;
}
else
{
// First creation, can really undo
// Has already been added to section list end, so remove
mSectionList.pop_back();
OGRE_DELETE mCurrentSection;
}
}
else // not an empty section
{
// Bake the real buffers
HardwareVertexBufferSharedPtr vbuf;
// Check buffer sizes
bool vbufNeedsCreating = true;
bool ibufNeedsCreating = rop->useIndexes;
// Work out if we require 16 or 32-bit index buffers
HardwareIndexBuffer::IndexType indexType = mCurrentSection->get32BitIndices()?
HardwareIndexBuffer::IT_32BIT : HardwareIndexBuffer::IT_16BIT;
if (mCurrentUpdating)
{
// May be able to reuse buffers, check sizes
vbuf = rop->vertexData->vertexBufferBinding->getBuffer(0);
if (vbuf->getNumVertices() >= rop->vertexData->vertexCount)
vbufNeedsCreating = false;
if (rop->useIndexes)
{
if ((rop->indexData->indexBuffer->getNumIndexes() >= rop->indexData->indexCount) &&
(indexType == rop->indexData->indexBuffer->getType()))
ibufNeedsCreating = false;
}
}
if (vbufNeedsCreating)
{
// Make the vertex buffer larger if estimated vertex count higher
// to allow for user-configured growth area
size_t vertexCount = std::max(rop->vertexData->vertexCount,
mEstVertexCount);
vbuf =
HardwareBufferManager::getSingleton().createVertexBuffer(
mDeclSize,
vertexCount,
mDynamic? HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY :
HardwareBuffer::HBU_STATIC_WRITE_ONLY);
rop->vertexData->vertexBufferBinding->setBinding(0, vbuf);
}
if (ibufNeedsCreating)
{
// Make the index buffer larger if estimated index count higher
// to allow for user-configured growth area
size_t indexCount = std::max(rop->indexData->indexCount,
mEstIndexCount);
rop->indexData->indexBuffer =
HardwareBufferManager::getSingleton().createIndexBuffer(
indexType,
indexCount,
mDynamic? HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY :
HardwareBuffer::HBU_STATIC_WRITE_ONLY);
}
// Write vertex data
vbuf->writeData(
0, rop->vertexData->vertexCount * vbuf->getVertexSize(),
mTempVertexBuffer, true);
// Write index data
if(rop->useIndexes)
//.........这里部分代码省略.........
示例6: OGRE_EXCEPT
void RenderTarget::getCustomAttribute(const String& name, void* pData)
{
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Attribute not found.", "RenderTarget::getCustomAttribute");
}
示例7: OGRE_EXCEPT
void EGLWindow::copyContentsToMemory(const PixelBox &dst, FrameBuffer buffer)
{
if ((dst.left < 0) || (dst.right > mWidth) ||
(dst.top < 0) || (dst.bottom > mHeight) ||
(dst.front != 0) || (dst.back != 1))
{
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS,
"Invalid box.",
"Win32Window::copyContentsToMemory" );
}
if (buffer == FB_AUTO)
{
buffer = mIsFullScreen? FB_FRONT : FB_BACK;
}
GLenum format = GLESPixelUtil::getGLOriginFormat(dst.format);
GLenum type = GLESPixelUtil::getGLOriginDataType(dst.format);
if ((format == 0) || (type == 0))
{
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS,
"Unsupported format.",
"GtkEGLWindow::copyContentsToMemory" );
}
// Switch context if different from current one
RenderSystem* rsys = Root::getSingleton().getRenderSystem();
rsys->_setViewport(this->getViewport(0));
// Must change the packing to ensure no overruns!
glPixelStorei(GL_PACK_ALIGNMENT, 1);
//glReadBuffer((buffer == FB_FRONT)? GL_FRONT : GL_BACK);
glReadPixels((GLint)dst.left, (GLint)dst.top,
(GLsizei)dst.getWidth(), (GLsizei)dst.getHeight(),
format, type, dst.data);
// restore default alignment
glPixelStorei(GL_PACK_ALIGNMENT, 4);
//vertical flip
{
size_t rowSpan = dst.getWidth() * PixelUtil::getNumElemBytes(dst.format);
size_t height = dst.getHeight();
uchar *tmpData = new uchar[rowSpan * height];
uchar *srcRow = (uchar *)dst.data, *tmpRow = tmpData + (height - 1) * rowSpan;
while (tmpRow >= tmpData)
{
memcpy(tmpRow, srcRow, rowSpan);
srcRow += rowSpan;
tmpRow -= rowSpan;
}
memcpy(dst.data, tmpData, rowSpan * height);
delete [] tmpData;
}
}
示例8: OGRE_EXCEPT
Ogre::DataStreamPtr MTGACodec::code(Ogre::MemoryDataStreamPtr& input, Ogre::Codec::CodecDataPtr& pData) const
{
OGRE_EXCEPT(Ogre::Exception::ERR_NOT_IMPLEMENTED,
"MTGA encoding not supported",
"MTGACodec::code" ) ;
}
示例9: sizeof
Ogre::Codec::DecodeResult MTGACodec::decode(Ogre::DataStreamPtr& stream) const
{
// Read 4 character code
mtga_header_s hdr;
//uint32 fileType;
stream->read(&hdr, sizeof(hdr));
if (LodResource_Bitmap != hdr.magic)
{
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS,
"This is not a MTGA file!", "MTGACodec::decode");
}
mtga_pal_s pal[256];
assert(stream->size() == sizeof(hdr)+hdr.uncompressedSize + sizeof(pal));
stream->seek(sizeof(mtga_header_s)+hdr.uncompressedSize);
stream->read(pal,sizeof(pal));
bool isTransparent = false;
mtga_pal_s& clr = pal[0];
if( (clr.r == 0 && clr.g >250 && clr.b > 250) || (clr.r > 250 && clr.g ==0 && clr.b > 250))
isTransparent = true;
Ogre::ImageCodec::ImageData* imgData = OGRE_NEW Ogre::ImageCodec::ImageData();
imgData->format = PF_BYTE_BGRA;
imgData->width = hdr.width;
imgData->height = hdr.height;
imgData->num_mipmaps = 3;
imgData->depth = 1;
imgData->size = Image::calculateSize(imgData->num_mipmaps, 1,
imgData->width, imgData->height, imgData->depth, imgData->format);
Ogre::MemoryDataStreamPtr pixelData;
pixelData.bind(OGRE_NEW MemoryDataStream(imgData->size));
// Now deal with the data
unsigned char* destPtr = pixelData->getPtr();
stream->seek(sizeof(mtga_header_s));
size_t width = hdr.width;
size_t height = hdr.height;
for(size_t mip = 0; mip <= imgData->num_mipmaps; ++mip)
{
for (size_t y = 0; y < height; y ++)
{
for (size_t x = 0; x < width; x ++)
{
unsigned char idx;
stream->read(&idx,1);
mtga_pal_s& clr = pal[idx];
assert(destPtr-pixelData->getPtr() < imgData->size);
*destPtr++ = clr.b;
*destPtr++ = clr.g;
*destPtr++ = clr.r;
*destPtr++ = (idx == 0 && isTransparent)?0:255;
}
}
width /=2;
height /=2;
}
DecodeResult ret;
ret.first = pixelData;
ret.second = CodecDataPtr(imgData);
return ret;
}
示例10: OGRE_EXCEPT
void* GL3PlusHardwareIndexBuffer::lockImpl(size_t offset,
size_t length,
LockOptions options)
{
if(mIsLocked)
{
OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR,
"Invalid attempt to lock an index buffer that has already been locked",
"GL3PlusHardwareIndexBuffer::lock");
}
void* retPtr = 0;
GLenum access = 0;
// GL3PlusHardwareBufferManager* glBufManager = static_cast<GL3PlusHardwareBufferManager*>(HardwareBufferManager::getSingletonPtr());
//
// // Try to use scratch buffers for smaller buffers
// if(length < glBufManager->getGLMapBufferThreshold())
// {
// retPtr = glBufManager->allocateScratch((uint32)length);
// if (retPtr)
// {
// mLockedToScratch = true;
// mScratchOffset = offset;
// mScratchSize = length;
// mScratchPtr = retPtr;
// mScratchUploadOnUnlock = (options != HBL_READ_ONLY);
//
// if (options != HBL_DISCARD)
// {
// // have to read back the data before returning the pointer
// readData(offset, length, retPtr);
// }
// }
// }
if (!retPtr)
{
OGRE_CHECK_GL_ERROR(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mBufferId));
// Use glMapBuffer
if (mUsage & HBU_WRITE_ONLY)
{
access |= GL_MAP_WRITE_BIT;
access |= GL_MAP_FLUSH_EXPLICIT_BIT;
if(options == HBL_DISCARD || options == HBL_NO_OVERWRITE)
{
// Discard the buffer
access |= GL_MAP_INVALIDATE_RANGE_BIT;
}
// We explicitly flush when the buffer is unlocked
access |= GL_MAP_UNSYNCHRONIZED_BIT;
}
else if (options == HBL_READ_ONLY)
access |= GL_MAP_READ_BIT;
else
access |= GL_MAP_READ_BIT | GL_MAP_WRITE_BIT;
void* pBuffer;
OGRE_CHECK_GL_ERROR(pBuffer = glMapBufferRange(GL_ELEMENT_ARRAY_BUFFER, offset, length, access));
if(pBuffer == 0)
{
OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR,
"Index Buffer: Out of memory",
"GL3PlusHardwareIndexBuffer::lock");
}
// return offsetted
retPtr = static_cast<void*>(static_cast<unsigned char*>(pBuffer) + offset);
mLockedToScratch = false;
}
mIsLocked = true;
return retPtr;
}
示例11: while
//-----------------------------------------------------------------------
void Compositor::createGlobalTextures()
{
static size_t dummyCounter = 0;
if (mSupportedTechniques.empty())
return;
//To make sure that we are consistent, it is demanded that all composition
//techniques define the same set of global textures.
typedef std::set<String> StringSet;
StringSet globalTextureNames;
//Initialize global textures from first supported technique
CompositionTechnique* firstTechnique = mSupportedTechniques[0];
CompositionTechnique::TextureDefinitionIterator texDefIt =
firstTechnique->getTextureDefinitionIterator();
while (texDefIt.hasMoreElements())
{
CompositionTechnique::TextureDefinition* def = texDefIt.getNext();
if (def->scope == CompositionTechnique::TS_GLOBAL)
{
//Check that this is a legit global texture
if (!def->refCompName.empty())
{
OGRE_EXCEPT(Exception::ERR_INVALID_STATE,
"Global compositor texture definition can not be a reference",
"Compositor::createGlobalTextures");
}
if (def->width == 0 || def->height == 0)
{
OGRE_EXCEPT(Exception::ERR_INVALID_STATE,
"Global compositor texture definition must have absolute size",
"Compositor::createGlobalTextures");
}
if (def->pooled)
{
LogManager::getSingleton().logMessage(
"Pooling global compositor textures has no effect");
}
globalTextureNames.insert(def->name);
//TODO GSOC : Heavy copy-pasting from CompositorInstance. How to we solve it?
/// Make the tetxure
RenderTarget* rendTarget;
if (def->formatList.size() > 1)
{
String MRTbaseName = "c" + StringConverter::toString(dummyCounter++) +
"/" + mName + "/" + def->name;
MultiRenderTarget* mrt =
Root::getSingleton().getRenderSystem()->createMultiRenderTarget(MRTbaseName);
mGlobalMRTs[def->name] = mrt;
// create and bind individual surfaces
size_t atch = 0;
for (PixelFormatList::iterator p = def->formatList.begin();
p != def->formatList.end(); ++p, ++atch)
{
String texname = MRTbaseName + "/" + StringConverter::toString(atch);
TexturePtr tex;
tex = TextureManager::getSingleton().createManual(
texname,
ResourceGroupManager::INTERNAL_RESOURCE_GROUP_NAME, TEX_TYPE_2D,
(uint)def->width, (uint)def->height, 0, *p, TU_RENDERTARGET, 0,
def->hwGammaWrite && !PixelUtil::isFloatingPoint(*p), def->fsaa);
RenderTexture* rt = tex->getBuffer()->getRenderTarget();
rt->setAutoUpdated(false);
mrt->bindSurface(atch, rt);
// Also add to local textures so we can look up
String mrtLocalName = getMRTTexLocalName(def->name, atch);
mGlobalTextures[mrtLocalName] = tex;
}
rendTarget = mrt;
}
else
{
String texName = "c" + StringConverter::toString(dummyCounter++) +
"/" + mName + "/" + def->name;
// space in the name mixup the cegui in the compositor demo
// this is an auto generated name - so no spaces can't hart us.
std::replace( texName.begin(), texName.end(), ' ', '_' );
TexturePtr tex;
tex = TextureManager::getSingleton().createManual(
texName,
ResourceGroupManager::INTERNAL_RESOURCE_GROUP_NAME, TEX_TYPE_2D,
(uint)def->width, (uint)def->height, 0, def->formatList[0], TU_RENDERTARGET, 0,
def->hwGammaWrite && !PixelUtil::isFloatingPoint(def->formatList[0]), def->fsaa);
rendTarget = tex->getBuffer()->getRenderTarget();
//.........这里部分代码省略.........
示例12: OGRE_EXCEPT
Ogre::RenderToVertexBufferSharedPtr GLES2DefaultHardwareBufferManagerBase::createRenderToVertexBuffer( void )
{
OGRE_EXCEPT(Exception::ERR_RENDERINGAPI_ERROR,
"Cannot create RenderToVertexBuffer in GLES2DefaultHardwareBufferManagerBase",
"GLES2DefaultHardwareBufferManagerBase::createRenderToVertexBuffer");
}
示例13: concatenate_path
//-----------------------------------------------------------------------
DataStreamPtr FileSystemArchive::open(const String& filename, bool readOnly) const
{
String full_path = concatenate_path(mName, filename);
// Use filesystem to determine size
// (quicker than streaming to the end and back)
struct stat tagStat;
int ret = stat(full_path.c_str(), &tagStat);
assert(ret == 0 && "Problem getting file size" );
(void)ret; // Silence warning
// Always open in binary mode
// Also, always include reading
std::ios::openmode mode = std::ios::in | std::ios::binary;
std::istream* baseStream = 0;
std::ifstream* roStream = 0;
std::fstream* rwStream = 0;
if (!readOnly && isReadOnly())
{
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS,
"Cannot open a file in read-write mode in a read-only archive",
"FileSystemArchive::open");
}
if (!readOnly)
{
mode |= std::ios::out;
rwStream = OGRE_NEW_T(std::fstream, MEMCATEGORY_GENERAL)();
rwStream->open(full_path.c_str(), mode);
baseStream = rwStream;
}
else
{
roStream = OGRE_NEW_T(std::ifstream, MEMCATEGORY_GENERAL)();
roStream->open(full_path.c_str(), mode);
baseStream = roStream;
}
// Should check ensure open succeeded, in case fail for some reason.
if (baseStream->fail())
{
OGRE_DELETE_T(roStream, basic_ifstream, MEMCATEGORY_GENERAL);
OGRE_DELETE_T(rwStream, basic_fstream, MEMCATEGORY_GENERAL);
OGRE_EXCEPT(Exception::ERR_FILE_NOT_FOUND,
"Cannot open file: " + filename,
"FileSystemArchive::open");
}
/// Construct return stream, tell it to delete on destroy
FileStreamDataStream* stream = 0;
if (rwStream)
{
// use the writeable stream
stream = OGRE_NEW FileStreamDataStream(filename,
rwStream, (size_t)tagStat.st_size, true);
}
else
{
// read-only stream
stream = OGRE_NEW FileStreamDataStream(filename,
roStream, (size_t)tagStat.st_size, true);
}
return DataStreamPtr(stream);
}
示例14: OGRE_EXCEPT
void TreeLoader2D::addTree(Entity *entity, const Vector3 &position, Degree yaw, Real scale, void* userData)
{
//First convert the coordinate to PagedGeometry's local system
#ifdef PAGEDGEOMETRY_ALTERNATE_COORDSYSTEM
Vector3 pos = geom->_convertToLocal(position);
#else
Vector3 pos = position;
#endif
//Check that the tree is within bounds (DEBUG)
#ifdef _DEBUG
const Real smallVal = 0.01f;
if (pos.x < actualBounds.left-smallVal || pos.x > actualBounds.right+smallVal || pos.z < actualBounds.top-smallVal || pos.z > actualBounds.bottom+smallVal)
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Tree position is out of bounds", "TreeLoader::addTree()");
if (scale < minimumScale || scale > maximumScale)
OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS, "Tree scale out of range", "TreeLoader::addTree()");
#endif
//If the tree is slightly out of bounds (due to imprecise coordinate conversion), fix it
if (pos.x < actualBounds.left)
pos.x = actualBounds.left;
else if (pos.x > actualBounds.right)
pos.x = actualBounds.right;
if (pos.z < actualBounds.top)
pos.z = actualBounds.top;
else if (pos.z > actualBounds.bottom)
pos.z = actualBounds.bottom;
//Real x = pos.x;
//Real z = pos.z;
std::vector<TreeDef> *pageGrid = 0;
//Find the appropriate page grid for the entity
PageGridListIterator i = pageGridList.find(entity);
if (i != pageGridList.end())
pageGrid = i->second; // If it exists, get the page grid
else
{
// If it does not exist, create a new page grid
pageGrid = new std::vector<TreeDef>[pageGridX * pageGridZ];
// Register the new page grid in the pageGridList for later retrieval
pageGridList.insert(PageGridListValue(entity, pageGrid));
}
//Calculate the gridbounds-relative position of the tree
Real xrel = pos.x - gridBounds.left;
Real zrel = pos.z - gridBounds.top;
//Get the appropriate grid element based on the new tree's position
int pageX = (int)Math::Floor(xrel / pageSize); // bad perfomance float --> int
int pageZ = (int)Math::Floor(zrel / pageSize); // bad perfomance float --> int
std::vector<TreeDef> &treeList = _getGridPage(pageGrid, pageX, pageZ);
//Create the new tree
TreeDef tree;
tree.xPos = static_cast<uint16>(0xFFFF * (xrel - (pageX * pageSize)) / pageSize);
tree.zPos = static_cast<uint16>(0xFFFF * (zrel - (pageZ * pageSize)) / pageSize);
tree.rotation = static_cast<uint8>(Ogre::Real(0.708) * yaw.valueDegrees()); // 0.708 ~= 255 / 360
tree.scale = static_cast<uint8>(Ogre::Real(255.) * ((scale - minimumScale) / maximumScale));
#ifdef PAGEDGEOMETRY_USER_DATA
tree.userData = userData;
#endif
//Add it to the tree list
treeList.push_back(tree);
//Rebuild geometry if necessary
geom->reloadGeometryPage(Vector3(pos.x, 0, pos.z));
}
示例15: switch
//Changed the constructor to a member function so that the
//native constructor would be called first. This member
//function is then called from the native constructor.
void EGLPBuffer::initEGLPBuffer()
{
// These are now initialized in the native constructors.
// mGLSupport = glsupport;
// mGlDisplay = mGLSupport->getGLDisplay();
mEglDrawable = 0;
::EGLConfig glConfig = 0;
bool isFloat = false;
int bits = 0;
switch (mFormat)
{
case PCT_BYTE:
bits = 8;
break;
case PCT_SHORT:
case PCT_FLOAT16:
bits = 16;
break;
case PCT_FLOAT32:
bits = 32;
break;
default:
break;
}
if (mFormat == PCT_FLOAT16 || mFormat == PCT_FLOAT32)
{
OGRE_EXCEPT(Exception::ERR_NOT_IMPLEMENTED,
"No support for Floating point PBuffers",
"EGLRenderTexture::initEGLPBuffer");
}
EGLint minAttribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT | EGL_PBUFFER_BIT,
EGL_DEPTH_SIZE, 16,
EGL_NONE
};
EGLint maxAttribs[] = {
EGL_RED_SIZE, bits,
EGL_GREEN_SIZE, bits,
EGL_BLUE_SIZE, bits,
EGL_ALPHA_SIZE, bits,
EGL_STENCIL_SIZE, INT_MAX,
EGL_NONE
};
EGLint pBufferAttribs[] = {
// First we specify the width of the surface...
EGL_WIDTH, mWidth,
// ...then the height of the surface...
EGL_HEIGHT, mHeight,
/* ... then we specify the target for the texture
that will be created when the pbuffer is created...*/
EGL_TEXTURE_TARGET, EGL_TEXTURE_2D,
/*..then the format of the texture that will be created
when the pBuffer is bound to a texture...*/
EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGB,
// The final thing is EGL_NONE which signifies the end.
EGL_NONE
};
glConfig = mGLSupport->selectGLConfig(minAttribs, maxAttribs);
EGL_CHECK_ERROR;
mEglDrawable = eglCreatePbufferSurface(mGlDisplay, glConfig, pBufferAttribs);
EGL_CHECK_ERROR;
if (!glConfig || !mEglDrawable)
{
OGRE_EXCEPT(Exception::ERR_RENDERINGAPI_ERROR,
"Unable to create Pbuffer",
"EGLPBuffer::EGLPBuffer");
}
EGLint glConfigID;
EGLint iWidth, iHeight;
eglGetConfigAttrib(mGlDisplay, glConfig, EGL_CONFIG_ID, &glConfigID);
EGL_CHECK_ERROR;
eglQuerySurface(mGlDisplay, mEglDrawable, EGL_WIDTH, &iWidth);
EGL_CHECK_ERROR;
eglQuerySurface(mGlDisplay, mEglDrawable, EGL_HEIGHT, &iHeight);
EGL_CHECK_ERROR;
mWidth = iWidth;
mHeight = iHeight;
LogManager::getSingleton().logMessage(LML_NORMAL, "EGLPBuffer::create used final dimensions " + StringConverter::toString(mWidth) + " x " + StringConverter::toString(mHeight));
LogManager::getSingleton().logMessage("EGLPBuffer::create used FBConfigID " + StringConverter::toString(glConfigID));
}