Commit 8873015b authored by Ruben Jesus Garcia Hernandez's avatar Ruben Jesus Garcia Hernandez
Browse files

Fix screenshot saving bug

Fix display of trajectories of atoms in large systems.
parent 85c755ae
......@@ -49,7 +49,7 @@ GLenum atomTexture(GLuint t)
//WARNING: This should be called after SetupAtoms
//This means that numAtoms now has the cummulative distribution!
//This should be called after the atom texture is prepared, and therefore has the atomscaling pre-multiplied
GLenum SetupAtomsNoTess (GLuint **AtomVAO /*[3]*/, GLuint **AtomVertBuffer/*[2]*/, GLuint **AtomIndexBuffer/*[3]*/)
GLenum SetupAtomsNoTess (GLuint **AtomVAO /*[4]*/, GLuint **AtomVertBuffer/*[3]*/, GLuint **AtomIndexBuffer/*[2]*/)
//atoms, cloned atoms
//rgh: FIXME: add AtomVAO[2] for atom trajectories
{
......@@ -71,13 +71,13 @@ if (!solid) {
int totalatoms=numAtoms[getAtomTimesteps() -1];
//eprintf ("SetupAtomsNoTess 2");
*AtomVAO = new GLuint[3]; //atoms, cloned atoms, unused (bonds use Tess atom positions)
*AtomVAO = new GLuint[4]; //atoms, cloned atoms, unused (bonds use Tess atom positions), trajectories
*AtomIndexBuffer= new GLuint[3];//atoms, cloned atoms, bonds
*AtomVertBuffer = new GLuint[2];//atoms, cloned atoms
*AtomVertBuffer = new GLuint[3];//atoms, cloned atoms, trajectories
glGenVertexArrays(3, *AtomVAO);
glGenVertexArrays(4, *AtomVAO);
glGenBuffers(2, *AtomIndexBuffer);
glGenBuffers(2, *AtomVertBuffer);
glGenBuffers(3, *AtomVertBuffer);
//eprintf ("SetupAtomsNoTess 3");
glBindVertexArray((*AtomVAO)[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, (*AtomIndexBuffer)[0]);
......@@ -218,7 +218,7 @@ if (!solid) {
} //SetupAtomsNoTess
GLenum SetupAtoms(GLuint **AtomVAO /*[3]*/, GLuint **AtomVertBuffer /*[2]*/, GLuint *BondIndices)
GLenum SetupAtoms(GLuint **AtomVAO /*[4]*/, GLuint **AtomVertBuffer /*[3]*/, GLuint *BondIndices)
{
if (!numAtoms)
return glGetError();
......@@ -234,11 +234,11 @@ GLenum SetupAtoms(GLuint **AtomVAO /*[3]*/, GLuint **AtomVertBuffer /*[2]*/, GLu
}
eprintf("SetupAtoms: totalatoms=%d", totalatoms);
*AtomVAO = new GLuint[3]; //atoms, cloned atoms, bonds //rgh fixme: for trajectories, we want to create another vao
*AtomVertBuffer = new GLuint[2];
*AtomVAO = new GLuint[4]; //atoms, cloned atoms, bonds, trajectories
*AtomVertBuffer = new GLuint[3]; //atoms, cloned atoms, trajectories
glGenVertexArrays(3, *AtomVAO);
glGenBuffers(2, *AtomVertBuffer);
glGenVertexArrays(4, *AtomVAO);
glGenBuffers(3, *AtomVertBuffer);
glGenBuffers(1, BondIndices);
glBindVertexArray((*AtomVAO)[0]);
......@@ -355,6 +355,29 @@ GLenum SetupAtoms(GLuint **AtomVAO /*[3]*/, GLuint **AtomVertBuffer /*[2]*/, GLu
}
atomtrajectoryrestarts[t].push_back(getAtomTimesteps() );
}
//need to setup a specific buffer because of GL_MAX_VERTEX_ATTRIB_STRIDE
//only need xyz, not atom size
//rgh FIXME: If we use index buffer instead, GPU storage is 1/3 of this
float *traj = new float[atomtrajectories.size()*TIMESTEPS*3];
for (unsigned int t = 0; t < atomtrajectories.size(); t++) {
for (int i=0;i<TIMESTEPS;i++)
for (int j = 0; j < 3; j++) {
traj[t*TIMESTEPS * 3 + i * 3 + j] = tmp[i*numAtoms[0]*4+
+atomtrajectories[t]*4
+j];
}
}
glBindVertexArray((*AtomVAO)[3]);
glBindBuffer(GL_ARRAY_BUFFER, (*AtomVertBuffer)[2]);
glBufferData(GL_ARRAY_BUFFER, sizeof(float) *atomtrajectories.size()*TIMESTEPS * 3, traj,
GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (const void *)(0));
glEnableVertexAttribArray(0);
e = glGetError();
if ((e = glGetError()) != GL_NO_ERROR)
eprintf("opengl error %d, creating atom trajectories, l %d\n", e, __LINE__);
delete[] traj;
}
delete[] tmp;
//bonds
......
//========= Copyright Valve Corporation ============//
//========= Copyright Valve Corporaion ============//
#define NOMINMAX
#define _CRTDBG_MAP_ALLOC
......@@ -1928,7 +1928,7 @@ glReadPixels(0, 0, m_nRenderWidth, m_nRenderHeight, GL_RGB, GL_UNSIGNED_BYTE, pi
//little endian machine, R and B are flipped
if (screenshotdownscaling==1) {
s = SDL_CreateRGBSurfaceFrom(pixels, x, y, 24, 3 * y, 0xff, 0xff00, 0xff0000, 0);
s = SDL_CreateRGBSurfaceFrom(pixels, x, y, 24, 3 * x, 0xff, 0xff00, 0xff0000, 0);
} else {
for (int i=0;i<x;i++)
for (int j=0;j<y;j++) {
......@@ -1940,9 +1940,9 @@ glReadPixels(0, 0, m_nRenderWidth, m_nRenderHeight, GL_RGB, GL_UNSIGNED_BYTE, pi
for (int m=0;m<3;m++)
pixels2[i*3+j*3*m_nRenderWidth/screenshotdownscaling+m]=rgb[m]/screenshotdownscaling/screenshotdownscaling;
}
s = SDL_CreateRGBSurfaceFrom(pixels2, x, y, 24, 3 * y, 0xff, 0xff00, 0xff0000, 0);
s = SDL_CreateRGBSurfaceFrom(pixels2, x, y, 24, 3 * x, 0xff, 0xff00, 0xff0000, 0);
}
SDL_SaveBMP(s, name);
SDL_SaveBMP(s, name);
}
......@@ -2181,7 +2181,18 @@ if (markers && p[0]==0 &&p[1]==0 &&p[2]==0) {
if (!showTrajectories)
return;
glBindVertexArray(m_unAtomVAO[0]);
/* //rgh: old rendering method using one buffer with all atoms
int maxstride;
glGetIntegerv(GL_MAX_VERTEX_ATTRIB_STRIDE, &maxstride);
for (int i = 0; i < atomtrajectories.size(); i++) {
if (maxstride<4 * sizeof(float)*numAtoms[0]) {
showTrajectories = false;
dprintf("OpenGL does not allow rendering of trajectories with currently implemented method (MAX_VERTEX_ATTRIB_STRIDE), disabling");
return;
}
}*/
glBindVertexArray(m_unAtomVAO[3]);
glUseProgram(m_unUnitCellProgramID);
glUniformMatrix4fv(m_nUnitCellMatrixLocation, 1, GL_FALSE, transform.get());
float color2[4]={1,0,0,1};
......@@ -2192,13 +2203,18 @@ if ((e = glGetError()) != GL_NO_ERROR)
glEnableVertexAttribArray(0);
glDisableVertexAttribArray(1);
if ((e = glGetError()) != GL_NO_ERROR)
dprintf("Gl error after Render Atom trajectories timestep =%d: %d, %s\n", currentset, e, gluErrorString(e));
dprintf("Gl error before Render Atom trajectories timestep =%d: %d, %s\n", currentset, e, gluErrorString(e));
for (int i=0;i<atomtrajectories.size();i++) {
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 4 * sizeof(float)*numAtoms[0], (const void *)(0+4*sizeof(float)*atomtrajectories[i]));
//glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 4 * sizeof(float)*numAtoms[0], (const void *)(0+4*sizeof(float)*atomtrajectories[i]));
//if ((e = glGetError()) != GL_NO_ERROR)
// dprintf("Gl error after Render Atom trajectories vertexAttribPointer timestep =%d: %d, %s\n", currentset, e, gluErrorString(e));
for (int j=1;j<atomtrajectoryrestarts[i].size();j++) {
int orig=atomtrajectoryrestarts[i][j-1];
int orig=atomtrajectoryrestarts[i][j-1]+TIMESTEPS*i;
int count=atomtrajectoryrestarts[i][j]-atomtrajectoryrestarts[i][j-1];
glDrawArrays(GL_LINE_STRIP, orig, count);
if ((e = glGetError()) != GL_NO_ERROR)
dprintf("Gl error after Render Atom trajectories DrawArrays timestep =%d: %d, %s\n", currentset, e, gluErrorString(e));
}
if ((e = glGetError()) != GL_NO_ERROR)
dprintf("Gl error after Render Atom trajectories timestep =%d: %d, %s\n", currentset, e, gluErrorString(e));
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment