void GLUTGame::Reshape(int width, int height) { glViewport(0, 0, width, height); if (m_is2D) gluOrtho2D(0, 1, 1, 0); else UpdatePerspective(camera.FOV); }
//--------------------------------------------------------------------------- void CFabAtHomeView::OnSize(UINT nType, int cx, int cy) //--------------------------------------------------------------------------- { CView::OnSize(nType, cx, cy); if(cy > 0) { wglMakeCurrent(m_pDC->GetSafeHdc(), hrc); glViewport(0, 0, cx, cy); if((m_oldRect.right > cx) || (m_oldRect.bottom > cy)) RedrawWindow(); m_oldRect.right = cx; m_oldRect.bottom = cy; UpdatePerspective(); } }
int main(int argc, char *argv[]) { // Engine init ENGINE_INIT(argc, argv); MapName="terrain_map.xml"; look_in_mouse=false; k_MouseClick=false; if (!ENGINE) { fprintf(stderr,"Can't load main Engine module! Exiting...\n"); return 1; }; printf("Welcome to AmberSkyNet ( %s %d )\n",__FILE__,__LINE__); // Load world FILER->AddPath("samples/TerrainTest/", false); ENGINE->LoadDataFile(MapName.c_str()); myWorld = ENGINE->GetWorld(); if (!myWorld) { printf("Can't get world! Exiting... :(\n"); return 1; }; printf("World loaded.\n"); // Camera myCam = myWorld->GetCamera( myWorld->AddCamera("CameraSimple") ); myCam->SetScreen(0,0,1,1/*0.5*/); // ? FOV=initFOV; UpdatePerspective(); // Camera Walker listener IEventListener *myList = EVENTER->AddEventListener( "EvListCamWalker" ); if (!myList) { printf("Class EvListCamWalker can't found :(\n"); return 1; } myList->SetPtrParam("Camera",myCam); myList->SetParam("step", camStep); printf("Camera walker created.\n"); // Camera Looker listener myList = EVENTER->AddEventListener( "EvListCamLooker" ); if (!myList) { printf("Class EvListCamWalker can't found :(\n"); return 1; } myList->SetPtrParam("Camera",myCam); printf("Camera looker created.\n"); // Camera position myCam->SetPos( CVector(5,128,0) ); myCam->SetRotY( 0 ); // Search terrains myWorld->FindChildrenByInterface("ASNITerrain", &Terrains); for (int i=0; i<Terrains.nums; i++) TerrainInterfaces.push_back((ASNITerrain*)(Terrains.getItem(i)->GetInterface("ASNITerrain"))); // ? int evt; bool non_exit=true; ENGINE->SetPtrParam("UpdateCallback",(void*)UpdateCallback); ENGINE->SetPtrParam("DrawCallback",(void*)DrawCallback); // Main loop ENGINE->EngineStart(); // End of work clearPtrList(&Terrains); printf("----End----\n"); return 0; };
// Update-функция, если возвратит true- произойдет выход из цикла Engine int UpdateCallback(void *Params) { groundMoveLock(); // Read first event int evt=EVENTER->GetInput(); // цикл - пока не прочитали все события /*LOGGER->LogMsg("UpdateCallback evt cycle begin");*/ while (evt!=ASN_EVNT_EMPTY) { if (evt==ASN_MOUSE_WHEEL_UP) { FOV+=FOVStep; UpdatePerspective(); } else if (evt==ASN_MOUSE_WHEEL_DOWN) { FOV-=FOVStep; UpdatePerspective(); } if (evt==ASN_EVNT_KEYPRESSED) { //если событие - нажатие клавиши, то... // если мы нажали Esc - устанавливаем признак выхода в true if (EVENTER->GetLastKey()==27) { return true; } else if (EVENTER->GetLastKey()==ASNK_SPACE) { gravity_on=!(gravity_on);/*LoadMap(); ProceedCustomMap(); UploadCustomMap();*/ } if (EVENTER->GetLastKey()==ASNK_F5) { printf("SaveWorld\n"); std::string worldFilePath=std::string(ENGINE->GetEnvParam("[Paths]DataPath"))+"World.xml"; ENGINE->SaveDataFile(worldFilePath.c_str()); } if (EVENTER->GetLastKey()==ASNK_F6) { printf("LoadWorld\n"); ENGINE->LoadDataFile("World.xml"); myWorld = ENGINE->GetWorld(); } // если мы нажали PrtSrc - делаем скриншот с именем screenshotXXX else if (EVENTER->GetLastKey()==316) { DEVICER->MakeScreenshot("screenshot"); printf("Shoot!\n"); } // Нажатие табуляции - захват/освобождение мыши else if (EVENTER->GetLastKey()==9) { look_in_mouse=!look_in_mouse; DEVICER->CenterMouse(!look_in_mouse); } // Ирригация и мелиорация else if ((EVENTER->GetLastKey()==ASNK_KP_PLUS)|| (EVENTER->GetLastKey()==ASNK_KP_MINUS)) { //beep(); for (UINT i=0; i<Terrains.nums; i++){ INode *n = Terrains.getItem(i); double currentHeight = n->GetDoubleParam("WaterHeight"); if (EVENTER->GetLastKey()==ASNK_KP_PLUS) currentHeight+=waterStep; else currentHeight-=waterStep; n->SetParam("WaterHeight", currentHeight); }; } // Гравитация else if (EVENTER->GetLastKey()=='g') { gravity_on = !gravity_on; } } else if (evt==ASN_EVNT_MOUSEDOWN) { k_MouseClick=true; //FindMousePointer(DEVICER->mouse_x,DEVICER->mouse_y); } evt=EVENTER->GetInput(); } LOGGER->LogMsg("UpdateCallback evt cycle end"); return false; };
bool CRenderer::Init(int width, int height, int bpp, int fullscreen) { m_width = width; m_height = height; UpdatePerspective(); glLoadIdentity(); // identity for modelview matrix // Vertex Lighting float mat_specular[] = {1,1,1,1}; float mat_shininess[] = { 50 }; float mat_diff[] = { 0.5f, 0.5f, 0.5f, 1.0f }; float light_pos[] = { 0, 1, 1, 1 }; float white_light[] = {1,1,1,1}; float lmodel_ambient[] = { 0.8f, 0.8f, 0.8f, 1.0f }; glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diff); glLightfv(GL_LIGHT0, GL_POSITION, light_pos); glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light); glLightfv(GL_LIGHT0, GL_SPECULAR, white_light); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); if(m_shaderactive) { bool shader = InitShader(); if(!shader) { fprintf(stderr, "Init shader failed\n"); return false; } fprintf(stderr, "GLSL shader loaded\n"); if(!glewIsSupported("GL_EXT_framebuffer_object")) { fprintf(stderr, "No framebuffer support\n"); m_useShadows = false; } if(m_useShadows && !CreateShadowFBO()) { fprintf(stderr, "Init shadow mapping failed\n"); m_useShadows = false; } else { fprintf(stderr, "Shadow mapping active\n"); } } else { fprintf(stderr, "Shader disabled\n"); m_useShadows = false; } // loading the crosshair std::string pathcross = CLynx::GetBaseDirTexture() + "crosshair.tga"; m_crosshair = m_world->GetResourceManager()->GetTexture(pathcross); if(m_crosshair == 0) fprintf(stderr, "No crosshair found: %s\n", pathcross.c_str()); m_world->GetResourceManager()->GetTextureDimension(pathcross, &m_crosshair_width, &m_crosshair_height); // loading the font if(!m_font.Init("font.png", 16, 24, m_world->GetResourceManager())) return false; return true; }
void CRenderer::PrepareShadowMap(const vec3_t& lightpos, const quaternion_t& lightrot, CWorld* world, int localctrlid) { CFrustum frustum; vec3_t dir, up, side; matrix_t mviewlight; mviewlight.SetCamTransform(lightpos, lightrot); mviewlight.GetVec3Cam(&dir, &up, &side); dir = -dir; frustum.Setup(lightpos, dir, up, side, RENDERER_FOV, (float)m_width/(float)m_height, PLANE_NEAR, PLANE_FAR); glViewport(0, 0, (int)(m_width * SHADOW_MAP_RATIO), (int)(m_height * SHADOW_MAP_RATIO)); float projection[16]; glMatrixMode(GL_PROJECTION); // Shadow mapping with ortho projection can be useful //const float lightDistance = PLANE_FAR*0.1f; //glLoadIdentity(); //glOrtho(-35.0f, 35.0f, -35.0f, 35.0f, 0.0f, PLANE_FAR*0.1f); // dimension: light area in m glGetFloatv(GL_PROJECTION_MATRIX, projection); glMatrixMode(GL_MODELVIEW); glLoadMatrixf(mviewlight.pm); // set camera to light pos glMatrixMode(GL_TEXTURE); glActiveTexture(GL_TEXTURE7); glLoadMatrixf(g_shadowBias); // to map from -1..1 to 0..1 glMultMatrixf(projection); glMultMatrixf(mviewlight.pm); glMatrixMode(GL_MODELVIEW); // Render to FBO glBindFramebuffer(GL_FRAMEBUFFER, m_fboId); glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); glDisable(GL_LIGHTING); glDisable(GL_BLEND); #ifndef DRAW_SHADOWMAP glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); #endif //glCullFace(GL_FRONT); glPolygonOffset( 1.1f, 4.0f ); glEnable(GL_POLYGON_OFFSET_FILL); DrawScene(frustum, world, localctrlid, true); glDisable(GL_POLYGON_OFFSET_FILL); glBindFramebuffer(GL_FRAMEBUFFER, 0); glViewport(0, 0, m_width, m_height); #ifndef DRAW_SHADOWMAP glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); #endif //glCullFace(GL_BACK); glEnable(GL_LIGHTING); glEnable(GL_BLEND); UpdatePerspective(); // restore standard projection }
void View::Update () { UpdatePerspective(); damage->Repair(); }