From: <da...@us...> - 2006-10-04 20:31:09
|
Revision: 52 http://svn.sourceforge.net/freepv/?rev=52&view=rev Author: dangelo Date: 2006-10-04 13:31:04 -0700 (Wed, 04 Oct 2006) Log Message: ----------- use partial textures instead of rescaling textures that do not have 2^n width Modified Paths: -------------- freepv/trunk/src/libfreepv/OpenGLRenderer.cpp Modified: freepv/trunk/src/libfreepv/OpenGLRenderer.cpp =================================================================== --- freepv/trunk/src/libfreepv/OpenGLRenderer.cpp 2006-10-04 12:57:02 UTC (rev 51) +++ freepv/trunk/src/libfreepv/OpenGLRenderer.cpp 2006-10-04 20:31:04 UTC (rev 52) @@ -94,22 +94,30 @@ break; } } - // TODO: remove this hack + // TODO: remove this hack, but 6 4096 by 4096 textures are a bit large.. if (m_tex_size > 2048) m_tex_size = 2048; if (m_tex_size < pano->m_size.w) { fprintf(stderr, "Warning: reducing cube size. Your graphics card only supports %d by %d pixels textures\n", m_tex_size, m_tex_size); } + + m_srcSize = pano->m_size.w; m_enabledCubefaces = 0; update(pano, doMipMap); } void update(CubicPano * pano, bool doMipMap) { - unsigned char * scaled=0; + Image * scaled = 0; if (m_tex_size != pano->m_size.w) { // allocate memory for rescaled image - scaled = new unsigned char[m_tex_size*m_tex_size*3]; + scaled = new Image(Size2D(m_tex_size, m_tex_size)); + if (m_tex_size > pano->m_size.w) { + memset(scaled->getData(),0, 3*m_tex_size*m_tex_size); + DEBUG_DEBUG("using partial face texture, " << m_srcSize << " to " << m_tex_size); + } else { + DEBUG_DEBUG("downsizing face image, " << m_srcSize << " to " << m_tex_size); + } } for (int i=0; i < 6; i++) { if (pano->m_images[i] == 0 || m_enabledCubefaces & (1 << i) ) { @@ -119,17 +127,22 @@ m_enabledCubefaces |= (1<<i); glBindTexture(GL_TEXTURE_2D, m_textures[i]); if (m_tex_size != pano->m_images[i]->size().w) { - gluScaleImage(GL_RGB, pano->m_size.w, pano->m_size.w, - GL_UNSIGNED_BYTE, pano->m_images[i]->getData(), - m_tex_size, m_tex_size, GL_UNSIGNED_BYTE, scaled); + if (m_tex_size > pano->m_images[i]->size().w) { + copyImgToTexImg(scaled, Point2D(0,0), pano->m_images[i]); + scaled->writePPM( "/tmp/test.ppm"); + } else { + gluScaleImage(GL_RGB, pano->m_size.w, pano->m_size.w, + GL_UNSIGNED_BYTE, pano->m_images[i]->getData(), + m_tex_size, m_tex_size, GL_UNSIGNED_BYTE, scaled->getData()); + } if (doMipMap) { gluBuild2DMipmaps(GL_TEXTURE_2D, 3, m_tex_size, m_tex_size, - GL_RGB, GL_UNSIGNED_BYTE, scaled); + GL_RGB, GL_UNSIGNED_BYTE, scaled->getData()); } else { glTexImage2D(GL_TEXTURE_2D, 0, 3, m_tex_size, m_tex_size, 0, - GL_RGB, GL_UNSIGNED_BYTE, scaled); + GL_RGB, GL_UNSIGNED_BYTE, scaled->getData()); } } else { if (doMipMap) { @@ -154,7 +167,7 @@ } } if (scaled) { - delete[] scaled; + delete scaled; } m_init = true; } @@ -226,6 +239,10 @@ GLfloat u,v; u = uvs[i][j].u; v = uvs[i][j].v; + if (m_srcSize < m_tex_size) { + u *= (m_srcSize-1.0f)/(float)m_tex_size; + v *= (m_srcSize-1.0f)/(float)m_tex_size; + } glTexCoord2f(u, v); glVertex3fv((GLfloat *)&coords[i][j]); } @@ -239,6 +256,7 @@ GLuint m_textures[6]; int m_enabledCubefaces; int m_tex_size; + int m_srcSize; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |