DRReturn PlanetSektor::move(float fTime, Camera* cam) { RenderPlanet* render = dynamic_cast<RenderPlanet*>(mRenderer); //mLastRelativeCameraPosition = cam->getSektorPositionAtSektor(this); if(mParent) mLastRelativeCameraPosition = mParent->getCameraPosition() - getPosition(); else mLastRelativeCameraPosition = cam->getSektorPositionAtSektor(this); mTheta = acos(mRadius/mLastRelativeCameraPosition.length())*RADTOGRAD; Unit distance = mLastRelativeCameraPosition.length()-mRadius; distance = distance.convertTo(KM); // mLastRelativeCameraPosition.print("cameraPos"); //printf("\rdistance: %.3f KM, theta: %f", static_cast<double>(distance), mTheta); std::vector<int>* ebene = GlobalRenderer::Instance().getEbenenCount(); char buffer[256]; memset(buffer, 0, 256); for(uint i = 1; i < ebene->size(); i++) sprintf(buffer, "%s %d ", buffer, (*ebene)[i]); printf("\r%s", buffer); if(EnIsButtonPressed(SDLK_k)) cam->setAxis(DRVector3(-1.0f, 0.0f, 0.0f), DRVector3(0.0f, 1.0f, 0.0f), DRVector3(0.0f, 0.0f, -1.0f)); if(isObjectInSektor(mLastRelativeCameraPosition)) { for(u32 i = 0; i < 6; i++) { //horizont culling DRVector3 camPos = mLastRelativeCameraPosition.getVector3().normalize(); double angle = acos(camPos.dot(DRVector3(mSubPlanets[i].x, mSubPlanets[i].y, mSubPlanets[i].z)))*RADTOGRAD-45.0; //printf("\r %d, angle: %f (%f Grad) ", i, angle, angle*RADTOGRAD); if(angle < mTheta) { getChild(mSubPlanets[i]*static_cast<short>(1000)); } //else //printf("\r %d, angle: %f, horizontAngle: %f", i, angle*RADTOGRAD, horizontAngle*RADTOGRAD); } } else { //removeInactiveChilds(1.0f); } removeInactiveChilds(GlobalRenderer::Instance().getTimeForInactiveChilds()); if(mRenderer) { // set player distance to renderer for sort if(render->getRenderNoisePlanetToTexture()) render->getRenderNoisePlanetToTexture()->setCurrentDistance(static_cast<DRReal>(mLastRelativeCameraPosition.length().convertTo(M))); // remove renderer, if we didn't need him if(mNotRenderSeconds >= GlobalRenderer::Instance().getTimeForInactiveChilds()) DR_SAVE_DELETE(mRenderer); } return DR_OK; }
DRReturn DRGeometrieSphere::initSphere(GLuint segmentSize) { // vertex and index calculation GLuint vertexCount = segmentSize*segmentSize; GLuint indexCount = 2*segmentSize*segmentSize-2*segmentSize; // memory allocation if(init(vertexCount, indexCount, 0, true)) LOG_ERROR("no memory allocatet for geometrie!", DR_ERROR); // generate a round line for(uint i = 0; i < segmentSize; i++) { DRReal _sin = sinf(((PI)/(float)(segmentSize-1))*(float)i); DRReal _cos = cosf(((PI)/(float)(segmentSize-1))*(float)i); mVertices[i] = DRVector3(_cos, _sin, 0.0f); } // rotate the line to make a whole sphere (rotation count = segmentSize) for(uint j = 0; j < segmentSize; j++) { // PI/segs*2 = 360° // PI/segs = 180° DRMatrix rot = DRMatrix::rotationX((PI/(segmentSize-1)*2)*j); for(uint i = 0; i < segmentSize; i++) { if(segmentSize*j + i >= vertexCount) LOG_ERROR("critical 1", DR_ERROR); mVertices[segmentSize*j + i] = mVertices[i].transformNormal(rot);//*DRRandom::rReal(1.02, 0.98f); mColors[segmentSize*j + i] = DRColor((float)i/(float)segmentSize, (float)j/(float)segmentSize, fabs((float)i/((float)j+0.001f))); } } mVertexCount = vertexCount; // generate indices to render sphere as QUAD_STRIP for(uint j = 0; j < segmentSize-1; j++) { for(uint i = 0; i < segmentSize; i++) { if(i*2+1+(segmentSize*2)*j >= indexCount) LOG_ERROR("critical 2", DR_ERROR); if(j*segmentSize + segmentSize+i >= vertexCount) LOG_ERROR("critical 3", DR_ERROR); mIndices[i*2+(segmentSize*2)*j] = j*segmentSize + segmentSize+i; mIndices[i*2+1+(segmentSize*2)*j] = j*segmentSize + i; } } mIndexCount = indexCount; mRenderMode = GL_QUAD_STRIP; return DR_OK; }
DRReturn PlanetSektor::render(float fTime, Camera* cam) { #if SDL_VERSION_ATLEAST(1,3,0) Uint8 *keystate = SDL_GetKeyboardState(NULL); #else Uint8 *keystate = SDL_GetKeyState(NULL); #endif //if(isObjectInSektor(cam->getSektorPosition())) return DR_OK; //Unit distance1 = Vector3Unit(mSektorPosition - cam->getSektorPosition()).length(); //Unit distance1 = Vector3Unit(mSektorPosition - mLastRelativeCameraPosition).length(); Unit distance1 = (-mLastRelativeCameraPosition).length(); //DRVector3 diff = Vector3Unit(mSektorPosition - cam->getSektorPosition()).convertTo(KM).getVector3(); distance1 = distance1.convertTo(mRadius.getType()); double distance2 = 200.0f; Unit radius1 = mRadius; double radius2 = ((radius1 * distance2) / distance1); //DRVector3 pos = (mSektorPosition - cam->getSektorPosition()).getVector3().normalize(); //DRVector3 pos = (mSektorPosition - mLastRelativeCameraPosition).getVector3().normalize(); DRVector3 pos = (-mLastRelativeCameraPosition).getVector3().normalize(); // DRVector3 relCameraPos = -pos*distance1/mRadius; pos *= static_cast<DRReal>(distance2); /* printf("\r %f %f %f, %.8f, %s x:%s y:%s z:%s (%f %f %f)", pos.x, pos.y, pos.z, radius2, distance1.print().data(), absCameraPosition.x.print().data(), absCameraPosition.y.print().data(), absCameraPosition.z.print().data(), diff.x, diff.y, diff.z); //*/ //glTranslatef(pos.x, pos.y, pos.z); //glScaled(radius2, radius2, radius2); mMatrix = DRMatrix::scaling(DRVector3(static_cast<DRReal>(radius2))) * DRMatrix::translation(pos) * cam->getKameraMatrixRotation(); //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); //if(mRenderer && !isObjectInSektor(cam->getSektorPosition())) //DRReturn ret = mRenderer->render(fTime, cam); if(!isObjectInSektor(mLastRelativeCameraPosition)) { mNotRenderSeconds = 0.0f; if(!mRenderer) mRenderer = new RenderPlanet(mID, getSektorPathName(), &mPlanetNoiseParameters); if(!mRenderer) LOG_ERROR("no renderer", DR_ERROR); if(radius2 > 160.0f) mRenderer->setCurrentDetail(10); else if(radius2 > 140.0f) mRenderer->setCurrentDetail(9); else if(radius2 > 120.0f) mRenderer->setCurrentDetail(8); else if(radius2 > 90.0f) mRenderer->setCurrentDetail(7); else if(radius2 > 70.0f) mRenderer->setCurrentDetail(6); else if(radius2 > 30.0f) mRenderer->setCurrentDetail(5); else if(radius2 > 25.0f) mRenderer->setCurrentDetail(4); else if(radius2 > 15.0f) mRenderer->setCurrentDetail(3); else if(radius2 > 5.0f) mRenderer->setCurrentDetail(2); else if(radius2 > 1.0f) mRenderer->setCurrentDetail(1); else mRenderer->setCurrentDetail(0); //GlobalRenderer::getSingleton().getPlanetShaderPtr()->bind(); ShaderProgram* shader = mRenderer->getShaderProgram(); if(!shader) LOG_ERROR("RenderPlanet hasn't valid shader", DR_ERROR); shader->bind(); shader->setUniformMatrix("modelview", mMatrix); shader->setUniformMatrix("projection", GlobalRenderer::Instance().getProjectionMatrix().transpose()); DRGrafikError("PlanetSektor::render"); DRReturn ret = mRenderer->render(fTime, cam); shader->unbind(); // GlobalRenderer::getSingleton().getPlanetShaderPtr()->unbind(); if(ret) LOG_ERROR("Fehler bei call planet renderer", DR_ERROR); //child didn't need to render return DR_NOT_ERROR; //return DR_OK; } else { mNotRenderSeconds += fTime; } return DR_OK; }
void test() { //tests DRMatrix m1(DRMatrix::identity()); float mat[] = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; if(memcmp(m1, mat, sizeof(float)*16) != 0) LOG_WARNING("matrix identity isn't valid"); DRMatrix m2 = m1.rotationX(30.0f); DRMatrix m3 = DRMatrix::axis(DRVector3(1.0f, 0.0f, 0.0f), DRVector3(0.0f, 1.0f, 0.0f), DRVector3(0.0f, 0.0f, 1.0)); if(memcmp(m1, m3, sizeof(float)*16) != 0) LOG_WARNING("matrix axis isn't valid"); DREngineLog.writeMatrixToLog(m1); DREngineLog.writeMatrixToLog(m2); DREngineLog.writeMatrixToLog(m3); DRVector3 rot1(1.0f, 0.0f, 0.0f); m2 = DRMatrix::rotationY(90.0f); rot1 = rot1.transformCoords(m2); DREngineLog.writeVector3ToLog(rot1, "1/0/0 90 Grad um y-Achse rotiert"); rot1 = rot1.transformCoords(m2.invert()); DREngineLog.writeVector3ToLog(rot1, "zurueckrotiert, 1/0/0 erwartet!"); DREngineLog.writeToLog("RekursionTest: %d", rekursionTest(0)); //Speicher test /* LOG_INFO("Speichertest"); std::list<void*> pointer; void* t = NULL; u32 count = 0; do { t = malloc(16384); if(t) pointer.push_back(t); count++; if(count > 192073) break; } while(t); DRLog.writeToLog("count: %d, %u kByte wurden reserviert!", count, count*16384/1024); for(std::list<void*>::iterator it = pointer.begin(); it != pointer.end(); it++) free(*it); pointer.clear(); //* */ // Unit test printf("\n"); Unit parsec(1.0, PARSEC); Unit lj = parsec.convertTo(LIGHTYEAR); DREngineLog.writeToLog("%s -> %s", parsec.print().data(), lj.print().data()); lj = Unit(1.0, LIGHTYEAR); parsec = lj.convertTo(PARSEC); DREngineLog.writeToLog("%s -> %s", lj.print().data(), parsec.print().data()); Unit ae = lj.convertTo(AE); DREngineLog.writeToLog("%s -> %s", lj.print().data(), ae.print().data()); ae = parsec.convertTo(AE); DREngineLog.writeToLog("%s -> %s", parsec.print().data(), ae.print().data()); parsec = ae.convertTo(PARSEC); DREngineLog.writeToLog("%s -> %s", ae.print().data(), parsec.print().data()); Unit m = parsec.convertTo(M); DREngineLog.writeToLog("%s -> %s", parsec.print().data(), m.print().data()); Unit kpc(1.0, KILOPARSEC); m = kpc.convertTo(M); DREngineLog.writeToLog("%s -> %s", kpc.print().data(), m.print().data()); m = Unit(1.0, M); kpc = m.convertTo(KILOPARSEC); DREngineLog.writeToLog("%s -> %s", m.print().data(), kpc.print().data()); printf("\n"); Unit aes(0.005, AE); DREngineLog.writeToLog("%s -> %s", aes.print().data(), aes.convertTo(KM).print().data()); //Vector Unit Test Vector3Unit u1(100, 200, 70, M), u2(1, 0, 0, KILOPARSEC), u3(100, 20, 17, LIGHTYEAR); u1.print("u1"); u2.print("u2"); u3.print("u3"); u1 *= Unit(20, KM); u1.print("u1* 20 km"); Vector3Unit(u1 + u2).print("u1+u2"); Vector3Unit(u2+u3).print("u2+u3"); Vector3Unit(u1*Unit(1, LIGHTYEAR)).print("u1*1 Lichtjahr"); DRVector3 v(1.0f, 7.0f, 2.0f); DREngineLog.writeVector3ToLog(v, "init"); v = v.normalize(); DREngineLog.writeVector3ToLog(v, "normalized"); v *= 7.0f; DREngineLog.writeVector3ToLog(v, "multiplikator"); // ---------------------------------- ReferenzHolder Test -------------------------------- DREngineLog.writeToLog("DRIndexReferenzHolder test"); DRIndexReferenzHolder referenzHolder(10); uint tests[10]; tests[0] = referenzHolder.getFree(); referenzHolder.add(tests[0]); tests[1] = referenzHolder.getFree(); DREngineLog.writeToLog("index1 (0): %d, index2 (1): %d", tests[0], tests[1]); referenzHolder.remove(tests[0]); tests[2] = referenzHolder.getFree(); referenzHolder.remove(tests[1]); tests[3] = referenzHolder.getFree(); DREngineLog.writeToLog("index3 (2): %d, index4 (1): %d", tests[2], tests[3]); for(int i = 0; i < 5; i++) tests[4+i] = referenzHolder.getFree(); referenzHolder.remove(tests[7]); tests[9] = referenzHolder.getFree(); DREngineLog.writeToLog("index10: (6): %d", tests[9]); DRTextureManager::Instance().test(); // Random Test }
DRReturn move(float fTime) { float fRotSpeed = 2.0f; float fSpeed = 20.0f; int numKeys = 0; //Kamera #if SDL_VERSION_ATLEAST(1,3,0) Uint8 *keystate = SDL_GetKeyboardState(&numKeys); #else Uint8 *keystate = SDL_GetKeyState(NULL); #endif /*for(uint i = 0; i < numKeys; i++) { if(keystate[i]) DRLog.writeToLog("%d button pressed: %d", i, (int)keystate[i]); } //*/ // return DR_OK; int mouseMove_x = 0, mouseMove_y = 0; // holen der Maus bewegung seit letztem frame und der bitmaks welche Tasten gedrückt sind Uint8 mousePressed = SDL_GetRelativeMouseState(&mouseMove_x, &mouseMove_y); //if(gCurrentControlMode != 0 ) //{ // die Kamera wird rotiert, gesteuert durch die Tasten w, s (x Achse, hoch/runter), <-, -> (y Achse links/rechts), e und q (z Achse seitlich) g_cam->rotateRel(DRVector3(keystate[SDLK_s]-keystate[SDLK_w], keystate[SDLK_RIGHT]-keystate[SDLK_LEFT], keystate[SDLK_q]-keystate[SDLK_e])*fTime); // wenn die rechte maustaste gedrückt ist if((mousePressed & 4) == 4) // wird die Kamera auch abhängig von der Mausposition gedreht g_cam->rotateRel(DRVector3(-mouseMove_y, -mouseMove_x, 0.0f)*fTime*fRotSpeed); //} if(gControlModes[gCurrentControlMode].mValue.getType() == M) g_cam->translateRel(DRVector3(keystate[SDLK_d]-keystate[SDLK_a], keystate[SDLK_PAGEUP]-keystate[SDLK_PAGEDOWN], keystate[SDLK_DOWN]-keystate[SDLK_UP])*fTime*gControlModes[gCurrentControlMode].mValue); else g_cam->translateRel_SektorPosition(DRVector3(keystate[SDLK_d]-keystate[SDLK_a], keystate[SDLK_PAGEUP]-keystate[SDLK_PAGEDOWN], keystate[SDLK_DOWN]-keystate[SDLK_UP])*fTime*gControlModes[gCurrentControlMode].mValue, gControlModes[gCurrentControlMode].mValue.getType()); //set control mode if(EnIsButtonPressed(SDLK_1)) gCurrentControlMode = 0; else if(EnIsButtonPressed(SDLK_2)) gCurrentControlMode = 1; else if(EnIsButtonPressed(SDLK_3)) gCurrentControlMode = 2; else if(EnIsButtonPressed(SDLK_4)) gCurrentControlMode = 3; else if(EnIsButtonPressed(SDLK_5)) gCurrentControlMode = 4; else if(EnIsButtonPressed(SDLK_6)) gCurrentControlMode = 5; else if(EnIsButtonPressed(SDLK_7)) gCurrentControlMode = 6; else if(EnIsButtonPressed(SDLK_8)) gCurrentControlMode = 7; else if(EnIsButtonPressed(SDLK_9)) gCurrentControlMode = 8; GlobalRenderer::Instance().setTimeForInactiveChild(gControlModes[gCurrentControlMode].mTime); g_Player.setCurrentSpeed(gControlModes[gCurrentControlMode].mValue); // R-Taste if(EnIsButtonPressed(SDLK_r)) wireframe = !wireframe; //if(EnIsButtonPressed(SDLK_z)) blockCount++; if(keystate[SDLK_z]) blockCount++; if(fTime == 0.0f) fTime = 0.00166f; //if(g_Player.getSektor()->moveAll(fTime, g_cam)) if(g_Player.getSektor()->moveAll(fTime, g_Player.getCamera())) LOG_ERROR("Fehler bei move sektor", DR_ERROR); return DR_OK; }