diff --git a/KREngine/Kraken.xcodeproj/project.pbxproj b/KREngine/Kraken.xcodeproj/project.pbxproj index a4fc02e..471adaa 100644 --- a/KREngine/Kraken.xcodeproj/project.pbxproj +++ b/KREngine/Kraken.xcodeproj/project.pbxproj @@ -73,6 +73,10 @@ E43B0AD715DDCA0F00A5CB9F /* KRContextObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43B0AD415DDCA0C00A5CB9F /* KRContextObject.cpp */; }; E43B0AD815DDCA0F00A5CB9F /* KRContextObject.h in Headers */ = {isa = PBXBuildFile; fileRef = E43B0AD515DDCA0D00A5CB9F /* KRContextObject.h */; settings = {ATTRIBUTES = (); }; }; E43B0AD915DDCA0F00A5CB9F /* KRContextObject.h in Headers */ = {isa = PBXBuildFile; fileRef = E43B0AD515DDCA0D00A5CB9F /* KRContextObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E43F70DC181B20E400136169 /* KRLODSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43F70DA181B20E300136169 /* KRLODSet.cpp */; }; + E43F70DD181B20E400136169 /* KRLODSet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43F70DA181B20E300136169 /* KRLODSet.cpp */; }; + E43F70DE181B20E400136169 /* KRLODSet.h in Headers */ = {isa = PBXBuildFile; fileRef = E43F70DB181B20E400136169 /* KRLODSet.h */; }; + E43F70DF181B20E400136169 /* KRLODSet.h in Headers */ = {isa = PBXBuildFile; fileRef = E43F70DB181B20E400136169 /* KRLODSet.h */; }; E4409D2916FA748700310F76 /* font.tga in Resources */ = {isa = PBXBuildFile; fileRef = E41AE1DD16B124CA00980428 /* font.tga */; }; E44F38241683B23000399B5D /* KRRenderSettings.h in Headers */ = {isa = PBXBuildFile; fileRef = E44F38231683B22C00399B5D /* KRRenderSettings.h */; settings = {ATTRIBUTES = (); }; }; E44F38251683B23000399B5D /* KRRenderSettings.h in Headers */ = {isa = PBXBuildFile; fileRef = E44F38231683B22C00399B5D /* KRRenderSettings.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -423,6 +427,8 @@ E437849716C488360037FD43 /* hrtf_kemar.krbundle */ = {isa = PBXFileReference; lastKnownFileType = file; path = hrtf_kemar.krbundle; sourceTree = ""; }; E43B0AD415DDCA0C00A5CB9F /* KRContextObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = KRContextObject.cpp; sourceTree = ""; }; E43B0AD515DDCA0D00A5CB9F /* KRContextObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KRContextObject.h; sourceTree = ""; }; + E43F70DA181B20E300136169 /* KRLODSet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = KRLODSet.cpp; sourceTree = ""; }; + E43F70DB181B20E400136169 /* KRLODSet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KRLODSet.h; sourceTree = ""; }; E44F38231683B22C00399B5D /* KRRenderSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KRRenderSettings.h; sourceTree = ""; }; E44F38271683B24400399B5D /* KRRenderSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = KRRenderSettings.cpp; sourceTree = ""; }; E450273716E0491D00FDEC5C /* KRReverbZone.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = KRReverbZone.cpp; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.cpp; }; @@ -979,6 +985,8 @@ E4AE635C1704FB0A00B460CD /* KRLODGroup.h */, E468447D17FFDF51001F1FA1 /* KRLocator.cpp */, E468447E17FFDF51001F1FA1 /* KRLocator.h */, + E43F70DA181B20E300136169 /* KRLODSet.cpp */, + E43F70DB181B20E400136169 /* KRLODSet.h */, ); name = "Scene Graph Nodes"; sourceTree = ""; @@ -1188,6 +1196,7 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + E43F70DE181B20E400136169 /* KRLODSet.h in Headers */, E491019513C99BDC0098455B /* KRMaterial.h in Headers */, E491019C13C99BDC0098455B /* KRMaterialManager.h in Headers */, E491019D13C99BDC0098455B /* KRTextureManager.h in Headers */, @@ -1299,6 +1308,7 @@ E428C312166971FF00A16EDF /* KRAnimationLayer.h in Headers */, E4AFC6B615F7C46800DDB4C8 /* KRAABB.cpp in Headers */, E428C3171669A24B00A16EDF /* KRAnimationAttribute.h in Headers */, + E43F70DF181B20E400136169 /* KRLODSet.h in Headers */, E4AFC6BE15F7C9E600DDB4C8 /* KROctreeNode.h in Headers */, E4AFC6BD15F7C9DA00DDB4C8 /* KROctree.h in Headers */, E46A6B701559EF0A000DBD37 /* KRResource+blend.h in Headers */, @@ -1546,6 +1556,7 @@ E491019A13C99BDC0098455B /* KRMeshManager.cpp in Sources */, E47C25A713F4F6AB00FF4370 /* KRShaderManager.cpp in Sources */, E47C25A913F4F6DD00FF4370 /* KRShader.cpp in Sources */, + E43F70DC181B20E400136169 /* KRLODSet.cpp in Sources */, E414BAE51435558900A668C4 /* KRModel.cpp in Sources */, E414BAE91435585A00A668C4 /* KRScene.cpp in Sources */, E48B3CC014393E30000C50E2 /* KRCamera.cpp in Sources */, @@ -1648,6 +1659,7 @@ E40BA45515EFF79500D7C3DD /* KRAABB.cpp in Sources */, E488399515F928CA00BD66D5 /* KRBundle.cpp in Sources */, E488399D15F92BE000BD66D5 /* KRBundleManager.cpp in Sources */, + E43F70DD181B20E400136169 /* KRLODSet.cpp in Sources */, E4B175AD161F5A1000B8FB80 /* KRTexture.cpp in Sources */, E4B175B3161F5FAF00B8FB80 /* KRTextureCube.cpp in Sources */, E4CA10EA1637BD2B005D9400 /* KRTexturePVR.cpp in Sources */, @@ -1713,22 +1725,21 @@ E491016913C99B9E0098455B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; CLANG_CXX_LIBRARY = "libc++"; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; - GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_C_LANGUAGE_STANDARD = c11; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_UNROLL_LOOPS = YES; - GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_VERSION = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( /usr/local/include, "$(SRCROOT)/3rdparty/**", ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; LLVM_VECTORIZE_LOOPS = YES; MACOSX_DEPLOYMENT_TARGET = 10.6; SDKROOT = iphoneos; @@ -1739,20 +1750,19 @@ E491016A13C99B9E0098455B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; CLANG_CXX_LIBRARY = "libc++"; CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; - GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_C_LANGUAGE_STANDARD = c11; GCC_OPTIMIZATION_LEVEL = fast; GCC_UNROLL_LOOPS = YES; - GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_VERSION = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( /usr/local/include, "$(SRCROOT)/3rdparty/**", ); - IPHONEOS_DEPLOYMENT_TARGET = 5.1; LLVM_VECTORIZE_LOOPS = YES; MACOSX_DEPLOYMENT_TARGET = 10.6; SDKROOT = iphoneos; @@ -1772,7 +1782,6 @@ ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "kraken_ios/Kraken-Prefix.pch"; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -1781,7 +1790,6 @@ OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = kraken; SHARED_PRECOMPS_DIR = "$(CACHE_ROOT)/SharedPrecompiledHeaders"; - SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -1798,7 +1806,6 @@ ); GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "kraken_ios/Kraken-Prefix.pch"; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -1807,7 +1814,6 @@ OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = kraken; SHARED_PRECOMPS_DIR = "$(CACHE_ROOT)/SharedPrecompiledHeaders"; - SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/KREngine/kraken/KRDataBlock.cpp b/KREngine/kraken/KRDataBlock.cpp index 05a9e94..c92a1e6 100644 --- a/KREngine/kraken/KRDataBlock.cpp +++ b/KREngine/kraken/KRDataBlock.cpp @@ -37,6 +37,7 @@ KRDataBlock::KRDataBlock() { m_data_size = 0; m_data_offset = 0; m_fdPackFile = 0; + m_fileName = ""; m_mmapData = NULL; m_fileOwnerDataBlock = NULL; m_bMalloced = false; @@ -68,6 +69,7 @@ void KRDataBlock::unload() m_data_size = 0; m_data_offset = 0; m_fdPackFile = 0; + m_fileName = ""; m_mmapData = NULL; m_fileOwnerDataBlock = NULL; m_bReadOnly = false; @@ -95,6 +97,7 @@ bool KRDataBlock::load(const std::string &path) m_fdPackFile = open(path.c_str(), O_RDONLY); if(m_fdPackFile >= 0) { m_fileOwnerDataBlock = this; + m_fileName = path; if(fstat(m_fdPackFile, &statbuf) >= 0) { m_data_size = statbuf.st_size; m_data_offset = 0; @@ -117,9 +120,9 @@ KRDataBlock *KRDataBlock::getSubBlock(int start, int length) if(m_fdPackFile) { new_block->m_fdPackFile = m_fdPackFile; new_block->m_fileOwnerDataBlock = m_fileOwnerDataBlock; - new_block->m_data_offset = start; + new_block->m_data_offset = start + m_data_offset; } else if(m_bMalloced) { - new_block->m_data = (unsigned char *)m_data + start; + new_block->m_data = (unsigned char *)m_data + start + m_data_offset; } new_block->m_bReadOnly = true; return new_block; @@ -189,16 +192,20 @@ void KRDataBlock::append(void *data, size_t size) { // Copy the entire data block to the destination pointer void KRDataBlock::copy(void *dest) { - lock(); - memcpy((unsigned char *)dest, m_data, m_data_size); - unlock(); + copy(dest, 0, m_data_size); } // Copy a range of data to the destination pointer void KRDataBlock::copy(void *dest, int start, int count) { - lock(); - memcpy((unsigned char *)dest, (unsigned char *)m_data + start, count); - unlock(); + if(m_lockCount == 0 && m_fdPackFile != 0) { + // Optimization: If we haven't mmap'ed or malloced the data already, pread() it directly from the file into the buffer + ssize_t r = pread(m_fdPackFile, dest, count, start + m_data_offset); + assert(r != -1); + } else { + lock(); + memcpy((unsigned char *)dest, (unsigned char *)m_data + start, count); + unlock(); + } } // Append data to the end of the block, increasing the size of the block and making it read-write. @@ -249,25 +256,26 @@ bool KRDataBlock::save(const std::string& path) { // Get contents as a string std::string KRDataBlock::getString() { - lock(); KRDataBlock b; b.append(*this); b.append((void *)"\0", 1); // Ensure data is null terminated, to read as a string safely b.lock(); std::string ret = std::string((char *)b.getStart()); b.unlock(); - unlock(); return ret; } // Lock the memory, forcing it to be loaded into a contiguous block of address space void KRDataBlock::lock() { + m_lockCount++; if(m_lockCount == 1) { // Memory mapped file; ensure data is mapped to ram if(m_fdPackFile) { + fprintf(stderr, "KRDataBlock::lock - \"%s\" (%i)\n", m_fileOwnerDataBlock->m_fileName.c_str(), m_lockCount); + // Round m_data_offset down to the next memory page, as required by mmap size_t alignment_offset = m_data_offset & (KRAKEN_MEM_PAGE_SIZE - 1); if ((m_mmapData = mmap(0, m_data_size + alignment_offset, m_bReadOnly ? PROT_READ : PROT_WRITE, MAP_SHARED, m_fdPackFile, m_data_offset - alignment_offset)) == (caddr_t) -1) { @@ -290,6 +298,8 @@ void KRDataBlock::unlock() // Memory mapped file; ensure data is unmapped from ram if(m_fdPackFile) { + fprintf(stderr, "KRDataBlock::unlock - \"%s\" (%i)\n", m_fileOwnerDataBlock->m_fileName.c_str(), m_lockCount); + munmap(m_mmapData, m_data_size); m_data = NULL; m_mmapData = NULL; diff --git a/KREngine/kraken/KRDataBlock.h b/KREngine/kraken/KRDataBlock.h index 13caed0..80aeb0c 100644 --- a/KREngine/kraken/KRDataBlock.h +++ b/KREngine/kraken/KRDataBlock.h @@ -97,6 +97,7 @@ private: // For memory mapped objects: int m_fdPackFile; + std::string m_fileName; KRDataBlock *m_fileOwnerDataBlock; void *m_mmapData; @@ -111,6 +112,7 @@ private: // Assert if not locked void assertLocked(); + }; #endif diff --git a/KREngine/kraken/KREngine.mm b/KREngine/kraken/KREngine.mm index cb64a3f..b5fbb11 100644 --- a/KREngine/kraken/KREngine.mm +++ b/KREngine/kraken/KREngine.mm @@ -425,7 +425,7 @@ void kraken::set_debug_text(const std::string &print_text) [self getAmbientIntensity], [self getSunTemperature], [self getSunIntensity], - _settings.dof_quality, + static_cast(_settings.dof_quality), _settings.dof_depth, _settings.dof_falloff, _settings.bEnableFlash ? 1.0f : 0.0f, @@ -445,26 +445,26 @@ void kraken::set_debug_text(const std::string &print_text) _settings.bEnableDeferredLighting ? 1.0f : 0.0f, _settings.getPerspectiveNearZ(), _settings.getPerspectiveFarZ(), - _settings.volumetric_environment_enable, - 5 - _settings.volumetric_environment_downsample, + static_cast(_settings.volumetric_environment_enable), + static_cast(5 - _settings.volumetric_environment_downsample), _settings.volumetric_environment_max_distance, _settings.volumetric_environment_quality, _settings.volumetric_environment_intensity, - _settings.fog_type, + static_cast(_settings.fog_type), _settings.fog_near, _settings.fog_far, _settings.fog_density, _settings.fog_color.x, _settings.fog_color.y, _settings.fog_color.z, - _settings.dust_particle_enable, + static_cast(_settings.dust_particle_enable), _settings.dust_particle_intensity, _settings.getLODBias(), - _settings.getEnableRealtimeOcclusion(), + static_cast(_settings.getEnableRealtimeOcclusion()), _settings.debug_display, - _settings.siren_enable, - _settings.siren_enable_reverb, - _settings.siren_enable_hrtf, + static_cast(_settings.siren_enable), + static_cast(_settings.siren_enable_reverb), + static_cast(_settings.siren_enable_hrtf), _settings.siren_reverb_max_length, _settings.max_anisotropy }; diff --git a/KREngine/kraken/KRLODGroup.h b/KREngine/kraken/KRLODGroup.h index a35daea..c394fb4 100644 --- a/KREngine/kraken/KRLODGroup.h +++ b/KREngine/kraken/KRLODGroup.h @@ -11,7 +11,6 @@ #include "KRResource.h" #include "KRNode.h" -#include "KRTexture.h" class KRLODGroup : public KRNode { public: diff --git a/KREngine/kraken/KRLODSet.cpp b/KREngine/kraken/KRLODSet.cpp new file mode 100644 index 0000000..93fe90d --- /dev/null +++ b/KREngine/kraken/KRLODSet.cpp @@ -0,0 +1,35 @@ +// +// KRLODSet.cpp +// KREngine +// +// Created by Kearwood Gilbert on 2012-12-06. +// Copyright (c) 2012 Kearwood Software. All rights reserved. +// + +#include "KRLODSet.h" +#include "KRContext.h" + +KRLODSet::KRLODSet(KRScene &scene, std::string name) : KRNode(scene, name) +{ + +} + +KRLODSet::~KRLODSet() +{ +} + +std::string KRLODSet::getElementName() { + return "lod_set"; +} + +tinyxml2::XMLElement *KRLODSet::saveXML( tinyxml2::XMLNode *parent) +{ + tinyxml2::XMLElement *e = KRNode::saveXML(parent); + + return e; +} + +void KRLODSet::loadXML(tinyxml2::XMLElement *e) +{ + KRNode::loadXML(e); +} diff --git a/KREngine/kraken/KRLODSet.h b/KREngine/kraken/KRLODSet.h new file mode 100644 index 0000000..cbb5337 --- /dev/null +++ b/KREngine/kraken/KRLODSet.h @@ -0,0 +1,26 @@ +// +// KRLODSet +// KREngine +// +// Created by Kearwood Gilbert on 2012-12-06. +// Copyright (c) 2012 Kearwood Software. All rights reserved. +// + +#ifndef KRLODSET_H +#define KRLODSET_H + +#include "KRResource.h" +#include "KRNode.h" + +class KRLODSet : public KRNode { +public: + KRLODSet(KRScene &scene, std::string name); + virtual ~KRLODSet(); + virtual std::string getElementName(); + virtual tinyxml2::XMLElement *saveXML( tinyxml2::XMLNode *parent); + virtual void loadXML(tinyxml2::XMLElement *e); + +}; + + +#endif diff --git a/KREngine/kraken/KRLocator.cpp b/KREngine/kraken/KRLocator.cpp index 13d8878..1794062 100644 --- a/KREngine/kraken/KRLocator.cpp +++ b/KREngine/kraken/KRLocator.cpp @@ -11,7 +11,7 @@ KRLocator::KRLocator(KRScene &scene, std::string name) : KRNode(scene, name) { - setScaleCompensation(true); + } KRLocator::~KRLocator() diff --git a/KREngine/kraken/KRScene.cpp b/KREngine/kraken/KRScene.cpp index 2e9c36c..87c2f66 100644 --- a/KREngine/kraken/KRScene.cpp +++ b/KREngine/kraken/KRScene.cpp @@ -404,11 +404,10 @@ bool KRScene::save(KRDataBlock &data) { KRScene *KRScene::Load(KRContext &context, const std::string &name, KRDataBlock *data) { - data->append((void *)"\0", 1); // Ensure data is null terminated, to read as a string safely + std::string xml_string = data->getString(); + delete data; tinyxml2::XMLDocument doc; - data->lock(); - doc.Parse((char *)data->getStart()); - data->unlock(); + doc.Parse(xml_string.c_str()); KRScene *new_scene = new KRScene(context, name); tinyxml2::XMLElement *scene_element = doc.RootElement(); @@ -420,7 +419,7 @@ KRScene *KRScene::Load(KRContext &context, const std::string &name, KRDataBlock new_scene->getRootNode()->addChild(n); } - delete data; + return new_scene; } diff --git a/KREngine/kraken/KRTexture2D.cpp b/KREngine/kraken/KRTexture2D.cpp index ea2a922..da79d62 100644 --- a/KREngine/kraken/KRTexture2D.cpp +++ b/KREngine/kraken/KRTexture2D.cpp @@ -36,11 +36,9 @@ KRTexture2D::KRTexture2D(KRContext &context, KRDataBlock *data, std::string name) : KRTexture(context, name) { m_current_lod_max_dim = 0; m_pData = data; - m_pData->lock(); } KRTexture2D::~KRTexture2D() { - m_pData->unlock(); delete m_pData; } diff --git a/KREngine/kraken/KRTexturePVR.cpp b/KREngine/kraken/KRTexturePVR.cpp index 63d6f4f..44d0b07 100644 --- a/KREngine/kraken/KRTexturePVR.cpp +++ b/KREngine/kraken/KRTexturePVR.cpp @@ -87,7 +87,7 @@ KRTexturePVR::KRTexturePVR(KRContext &context, KRDataBlock *data, std::string na m_iHeight = header->height; m_bHasAlpha = header->bitmaskAlpha; - uint8_t *bytes = ((uint8_t *)m_pData->getStart()) + sizeof(PVRTexHeader); + uint32_t dataStart = sizeof(PVRTexHeader); uint32_t dataLength = header->dataLength, dataOffset = 0, dataSize = 0; uint32_t width = m_iWidth, height = m_iHeight, bpp = 4; uint32_t blockSize = 0, widthBlocks = 0, heightBlocks = 0; @@ -116,7 +116,7 @@ KRTexturePVR::KRTexturePVR(KRContext &context, KRDataBlock *data, std::string na dataSize = widthBlocks * heightBlocks * ((blockSize * bpp) / 8); dataBlockStruct newBlock; - newBlock.start = bytes+dataOffset; + newBlock.start = dataStart + dataOffset; newBlock.length = dataSize; m_blocks.push_back(newBlock); @@ -245,16 +245,20 @@ bool KRTexturePVR::uploadTexture(GLenum target, int lod_max_dim, int ¤t_lo GLDEBUG(glCopyTextureLevelsAPPLE(m_iHandle, prev_handle, source_level, 1)); } else { // glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid* data); - GLDEBUG(glCompressedTexSubImage2D(target, destination_level, 0, 0, width, height, m_internalFormat, block.length, block.start)); + m_pData->lock(); + GLDEBUG(glCompressedTexSubImage2D(target, destination_level, 0, 0, width, height, m_internalFormat, block.length, (char *)m_pData->getStart() + block.start)); + m_pData->unlock(); // GLDEBUG(glCompressedTexImage2D(target, destination_level, m_internalFormat, width, height, 0, block.length, block.start)); memoryTransferred += block.length; // memoryTransferred does not include throughput of mipmap levels copied through glCopyTextureLevelsAPPLE } #else + m_pData->lock(); #if GL_EXT_texture_storage - GLDEBUG(glCompressedTexSubImage2D(target, destination_level, 0, 0, width, height, m_internalFormat, block.length, block.start)); + GLDEBUG(glCompressedTexSubImage2D(target, destination_level, 0, 0, width, height, m_internalFormat, block.length, (char *)m_pData->getStart() + block.start)); #else - GLDEBUG(glCompressedTexImage2D(target, destination_level, m_internalFormat, width, height, 0, block.length, block.start)); + GLDEBUG(glCompressedTexImage2D(target, destination_level, m_internalFormat, width, height, 0, block.length, (char *)m_pData->getStart() + block.start)); #endif + m_pData->unlock(); memoryTransferred += block.length; // memoryTransferred does not include throughput of mipmap levels copied through glCopyTextureLevelsAPPLE #endif memoryRequired += block.length; diff --git a/KREngine/kraken/KRTexturePVR.h b/KREngine/kraken/KRTexturePVR.h index db7f9c7..515387b 100644 --- a/KREngine/kraken/KRTexturePVR.h +++ b/KREngine/kraken/KRTexturePVR.h @@ -30,7 +30,7 @@ protected: bool m_bHasAlpha; struct dataBlockStruct { - void *start; + uint32_t start; uint32_t length; }; diff --git a/KREngine/kraken/KRTextureTGA.cpp b/KREngine/kraken/KRTextureTGA.cpp index 294c17b..e04d5a7 100644 --- a/KREngine/kraken/KRTextureTGA.cpp +++ b/KREngine/kraken/KRTextureTGA.cpp @@ -42,11 +42,13 @@ KRTextureTGA::~KRTextureTGA() } bool KRTextureTGA::uploadTexture(GLenum target, int lod_max_dim, int ¤t_lod_max_dim, long &textureMemUsed, int prev_lod_max_dim, GLuint prev_handle) -{ +{ + m_pData->lock(); TGA_HEADER *pHeader = (TGA_HEADER *)m_pData->getStart(); unsigned char *pData = (unsigned char *)pHeader + (long)pHeader->idlength + (long)pHeader->colourmaplength * (long)pHeader->colourmaptype + sizeof(TGA_HEADER); if(pHeader->colourmaptype != 0) { + m_pData->unlock(); return false; // Mapped colors not supported } @@ -78,6 +80,7 @@ bool KRTextureTGA::uploadTexture(GLenum target, int lod_max_dim, int ¤t_lo free(converted_image); err = glGetError(); if (err != GL_NO_ERROR) { + m_pData->unlock(); return false; } int memAllocated = pHeader->width * pHeader->height * 4; @@ -92,6 +95,7 @@ bool KRTextureTGA::uploadTexture(GLenum target, int lod_max_dim, int ¤t_lo glTexImage2D(target, 0, GL_RGBA, pHeader->width, pHeader->height, 0, GL_BGRA, GL_UNSIGNED_BYTE, (GLvoid *)pData); err = glGetError(); if (err != GL_NO_ERROR) { + m_pData->unlock(); return false; } int memAllocated = pHeader->width * pHeader->height * 4; @@ -102,13 +106,16 @@ bool KRTextureTGA::uploadTexture(GLenum target, int lod_max_dim, int ¤t_lo } break; default: + m_pData->unlock(); return false; // 16-bit images not yet supported } break; default: + m_pData->unlock(); return false; // Image type not yet supported } + m_pData->unlock(); return true; }