void Viewer::init() { glewInit(); //shader_vert="toon.vert"; shader_frag = "toon.frag"; //shader_vert="vertexshader.txt"; shader_frag = "fragmentshader.txt"; //InitializeProgram(); //initShader_ter(); restoreStateFromFile(); glEnable (GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_LIGHTING); glEnable(GL_NORMALIZE); glCullFace(GL_BACK); glEnable(GL_CULL_FACE); glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glEnable(GL_COLOR_MATERIAL); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // 4-byte pixel alignment // pretty rendering // fast rendering glEnable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); light.setLight(); mat.setMaterial(); mySky.Set( 0,0,0, 300000.0f ); mySky.LoadTextures(":sky"); emit updateTasklabel(QString::number(curTerr+1)+"/"+QString::number(terrains.size())); initShader_phong(); QVector4D ltmp(light.position[0],light.position[1],light.position[2],light.position[3]); ltmp.normalize(); GLfloat lpos[4] = {ltmp.x(),ltmp.y(),ltmp.z(),ltmp.w()}; glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, 1, lpos); //QVector<QString> tlist; //tlist.push_back("CD.ter"); //tlist.push_back("terr_gcut.ter"); // /addTerrain("CD.ter"); //addTerrain("terr_gcut.ter"); help(); //DrawInit(); //qWarning("start drawing"); }
vector<int> searchRange(vector<int>& nums, int target) { vector<int> res{-1, -1}; if (nums.empty() || nums[0] > target || nums[nums.size()-1] < target) return res; int l = 0, r = nums.size() - 1, mid = 0; int start = -1, end = -1; while (l < r) { mid = (l + r) / 2 + 1; if (nums[mid] == target) { vector<int> ltmp(nums.begin() + l, nums.begin() + mid); vector<int> rtmp(nums.begin()+mid+1, nums.begin()+r+1); auto lvec = searchRange(ltmp, target), rvec = searchRange(rtmp, target); if (lvec != res) start = lvec[0] + l; else start = mid; if (rvec != res) end = rvec[1] + mid + 1; else end = mid; break; } else if (nums[mid] < target) l = mid + 1; else r = mid - 1; } if (start == -1 && end == -1 && nums[l] == target && l == r) start = end = l; res[0] = start; res[1] = end; return res; }
void Viewer::draw() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClearColor(backgroundCol.x(), backgroundCol.y(), backgroundCol.z(), 1.0f); if (mySky.wantSky()) mySky.Render( ); glEnable(GL_LIGHTING); if (applyGLSL) { glEnable(GL_VERTEX_PROGRAM_ARB); glEnable(GL_FRAGMENT_PROGRAM_ARB); light.position[3] = 1; light.setLight(); } else{ light.position[3] = 0; light.setLight(); } QVector4D ltmp(light.position[0],light.position[1],light.position[2],light.position[3]); ltmp.normalize(); GLfloat lpos[4] = {ltmp.x(),ltmp.y(),ltmp.z(),ltmp.w()}; glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, 1, lpos); // Draws a terrain if (curTerr>=0 && curTerr<terrains.size()){ Terrain * terrain = terrains[curTerr]; if (applyTexture) glBindTexture( GL_TEXTURE_2D, terrain->texid ); else glBindTexture( GL_TEXTURE_2D, 0); terrain->Draw(); //glLineWidth(10.0); //glPointSize(10.0); //glColor3f(1.0f,0.0f,0.0f); for (int i=0; i<terrain->artifacts.size(); i++){ glColor3f(terrain->severity[i]/2.2f, 0.0f, 0.0f); drawFlag(terrain->artifacts[i]); } } glDisable(GL_VERTEX_PROGRAM_ARB); glDisable(GL_FRAGMENT_PROGRAM_ARB); glDisable(GL_LIGHTING); //glLineWidth(1.0); //glPointSize(1.0); }