void SpriteManager::exit() { if(!mInitalized) return; mSprites.clear(); SDL_LockMutex(mGetSpriteMutex); LOG_WARNING_SDL(); SDL_UnlockMutex(mGetSpriteMutex); LOG_WARNING_SDL(); SDL_DestroyMutex(mGetSpriteMutex); LOG_WARNING_SDL(); LOG_INFO("SpriteManager closed"); mInitalized = false; }
SpritePtr SpriteManager::getSprite(const char* filename) { DHASH id = DRMakeFilenameHash(filename); SDL_LockMutex(mGetSpriteMutex); LOG_WARNING_SDL(); if(mSprites.find(id) != mSprites.end()) { SDL_UnlockMutex(mGetSpriteMutex); LOG_WARNING_SDL(); return mSprites[id]; } SpritePtr sprite(new Sprite(filename)); mSprites.insert(SPRITE_PAIR(id, sprite)); SDL_UnlockMutex(mGetSpriteMutex); LOG_WARNING_SDL(); return sprite; }
void HeightMapTexture::copyPixelData(u8* data, DRVector2i size) { if(!mPixelHeightData || mSize != size) { DR_SAVE_DELETE_ARRAY(mPixelHeightData); mSize = size; mMaxGradient = -10.0f; mMaxHeight = -10.0f; mPixelHeightData = new float[size.x*size.y]; } if(sizeof(float) != sizeof(u8)*4) LOG_ERROR_VOID("datatypes not like expected"); //memcpy(mPixelHeightData, data, 4*size.x*size.y*sizeof(u8)); for(uint y = 0; y < size.y; y++) { for(uint x = 0; x < size.x; x++) { int i = x+y*size.x; int ix = x-1+y*size.x; int iy = x+(y-1)*size.x; float red = static_cast<float>(data[i*4+2]); float green = static_cast<float>(data[i*4+1]); float blue = static_cast<float>(data[i*4]); mPixelHeightData[i] = ((red+green*256.0f + (blue*256.0f*256.0f))/(256.0f*256.0f*256.0f))*2.0f-1.0f; if(mPixelHeightData[i] > mMaxHeight) mMaxHeight = mPixelHeightData[i]; if(x > 0) { float xGradient = fabs(mPixelHeightData[i] - mPixelHeightData[ix]); if(xGradient > mMaxGradient) mMaxGradient = xGradient; } if(y > 0) { float yGradient = fabs(mPixelHeightData[i] - mPixelHeightData[iy]); if(yGradient > mMaxGradient) mMaxGradient = yGradient; } } } //DREngineLog.writeToLog("[HeightMapTexture::copyPixelData]: maxHeight: %f, maxGradient: %f", mMaxHeight, mMaxGradient); SDL_LockMutex(mPixelCopyMutex); LOG_WARNING_SDL(); mState++; SDL_UnlockMutex(mPixelCopyMutex); LOG_WARNING_SDL(); }
HeightMapTexture::HeightMapTexture(int stepSize) : mPixelHeightData(NULL), mLoadStepSize(stepSize), mSize(0), mState(0), mPixelCopyMutex(NULL), mMaxHeight(0.0f), mMaxGradient(0.0f) { mPixelCopyMutex = SDL_CreateMutex(); LOG_WARNING_SDL(); }
DRThread::DRThread(const char* threadName/* = NULL*/) : mutex(NULL), thread(NULL), condition(NULL), semaphore(NULL), exitCalled(false) { semaphore = SDL_CreateSemaphore(1); if(!semaphore) LOG_WARNING_SDL(); condition = SDL_CreateCond(); if(!condition) LOG_WARNING_SDL(); if(SDL_SemWait(semaphore)) LOG_WARNING_SDL(); mutex = SDL_CreateMutex(); if(!mutex) LOG_WARNING_SDL(); #if SDL_VERSION_ATLEAST(1,3,0) thread = SDL_CreateThread(Thread, threadName, this); #else thread = SDL_CreateThread(Thread, this); #endif }
DRReturn SpriteManager::init() { if(mInitalized) return DR_OK; mSpriteGeometrie = DRSpriteGeometriePtr(new SpriteGeometrie); mGetSpriteMutex = SDL_CreateMutex(); LOG_WARNING_SDL(); LOG_INFO("SpriteManager initalized"); mInitalized = true; return DR_OK; }
DRThread::~DRThread() { if(thread) { //Post Exit to Stream Thread exitCalled = true; if(SDL_SemPost(semaphore)) LOG_WARNING_SDL(); condSignal(); //kill TextureLoad Thread after 1/2 second SDL_Delay(500); // SDL_KillThread(thread); SDL_WaitThread(thread, NULL); //LOG_WARNING_SDL(); thread = NULL; SDL_DestroySemaphore(semaphore); SDL_DestroyMutex(mutex); SDL_DestroyCond(condition); } }
DRReturn load() { if(EnInit_Simple()) return DR_ERROR; DRFileManager::Instance().addOrdner("data/blockView"); DRFileManager::Instance().addOrdner("data/shader"); test(); sizeOfClasses(); //Steuerung u16 i = 0; gControlModes[i++] = ControlMode(Unit(20, M), 120.0f); gControlModes[i++] = ControlMode(Unit(0.100, KM), 100.0f); gControlModes[i++] = ControlMode(Unit(10, KM), 80.0f); gControlModes[i++] = ControlMode(Unit(100, KM), 60.0f); gControlModes[i++] = ControlMode(Unit(1000, KM), 30.0f); gControlModes[i++] = ControlMode(Unit(20000, KM), 10.0f); gControlModes[i++] = ControlMode(Unit(400000, KM), 4.0f); gControlModes[i++] = ControlMode(Unit(0.1, AE), 1.0f); gControlModes[i++] = ControlMode(Unit(1, AE), 1.0f); //gControlModes[i++] = ControlMode(Unit(10, AE), 1.0f); gControlModes[i++] = ControlMode(Unit(500, AE), 1.0f); //if(EnInit_OpenGL(1.0f, DRVideoConfig(800, 600), "Space Craft - Techdemo")) if(EnInit_INI("data/config.ini")) LOG_ERROR("Fehler bei init OpenGL", DR_ERROR); LOG_WARNING_SDL(); //check maximal multitextures int textureCount = 0; glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &textureCount); if(textureCount < 4) LOG_ERROR("Multitexturing mit mindestens 4 Texturen wird nicht unterstuetzt!", DR_ERROR); DREngineLog.writeToLog("Multitexturing supported up to: %d textures\n", textureCount); g_Font = new DRFont(); g_Font->init("data/MalgunGothic.tga", "data/MalgunGothic.tbf"); DREngineLog.writeToLog("CPU-Count: %d", g_CPU_Count); // glShadeModel(GL_SMOOTH); // glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do // glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations //Reseten der Matrixen glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(40.0f, (GLfloat)XWIDTH/(GLfloat)YHEIGHT, 0.1f, 2000.0f); glMatrixMode(GL_MODELVIEW); // Select the modelview matrix glLoadIdentity(); // Reset (init) the modelview matrix glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glShadeModel(GL_SMOOTH); // Enable smooth shading glClearDepth(1.0f); // Clear depth buffer glEnable(GL_DEPTH_TEST); // Enables depth test glDepthFunc(GL_LEQUAL); // Type of depth test to perform glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glLineWidth(1.0f); glEnable(GL_NORMALIZE); // Enhances image quality glColor3f(0.5f, 0.5f, 1.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glDisable(GL_LIGHTING); //glEnable(GL_LIGHTING); glDisable(GL_FOG); if(GlobalRenderer::getSingleton().init("data/config.ini")) LOG_ERROR("error by init GlobalRenderer", DR_ERROR); if(ShaderManager::getSingleton().init()) LOG_ERROR("error by init ShaderManager", DR_ERROR); if(DRGeometrieManager::getSingleton().init()) LOG_ERROR("error by init DRGeometrieManager", DR_ERROR); if(g_Player.init()) LOG_ERROR("Fehler bei Player::init", DR_ERROR); g_cam = g_Player.getCamera(); if(g_RenderBlockLoader.init()) LOG_ERROR("Fehler bei RenderBloockLoader::init", DR_ERROR); Uint32 start = SDL_GetTicks(); //g_terrain = new DRTextur("data/terrainsurface.bmp", GL_NEAREST, GL_NEAREST); DREngineLog.writeToLog("%.0f Sekunden fuer Planeten laden/generieren", ((float)SDL_GetTicks()-start)/1000.0f); return DR_OK; }
HeightMapTexture::~HeightMapTexture() { DR_SAVE_DELETE_ARRAY(mPixelHeightData); SDL_LockMutex(mPixelCopyMutex); SDL_UnlockMutex(mPixelCopyMutex); SDL_DestroyMutex(mPixelCopyMutex); LOG_WARNING_SDL(); }