Index: engine/rendergl.cpp
===================================================================
--- engine/rendergl.cpp (revision 4089)
+++ engine/rendergl.cpp (working copy)
@@ -1717,6 +1717,8 @@
VARP(motionblurmillis, 1, 5, 1000);
FVARP(motionblurscale, 0, 0.5f, 1);
+extern int subframe;
+
void addmotionblur()
{
if(!motionblur || !hasTR || max(screen->w, screen->h) > hwtexsize) return;
@@ -1732,6 +1734,8 @@
createtexture(motiontex, motionw, motionh, NULL, 3, 0, GL_RGB, GL_TEXTURE_RECTANGLE_ARB);
}
+ if (subframe == 1) {
+
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, motiontex);
glMatrixMode(GL_PROJECTION);
@@ -1750,12 +1754,14 @@
rectshader->set();
- glColor4f(1, 1, 1, lastmotion ? pow(motionblurscale, max(float(lastmillis - lastmotion)/motionblurmillis, 1.0f)) : 0);
+// fprintf(stderr,"%f",lastmotion ? pow(motionblurscale, max(float(lastmillis - lastmotion)/motionblurmillis, 1.0f)) : 0);
+// glColor4f(1, 1, 1, lastmotion ? pow(motionblurscale, max(float(lastmillis - lastmotion)/motionblurmillis, 1.0f)) : 0);
+ glColor4f(1, 1, 1, 0.5);
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f( 0, 0); glVertex2f(-1, -1);
glTexCoord2f(motionw, 0); glVertex2f( 1, -1);
glTexCoord2f( 0, motionh); glVertex2f(-1, 1);
- glTexCoord2f(motionw, motionh); glVertex2f( 1, 1);
+// glTexCoord2f(motionw, motionh); glVertex2f( 1, 1);
glEnd();
glDisable(GL_TEXTURE_RECTANGLE_ARB);
@@ -1768,13 +1774,16 @@
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
+
+ fprintf(stderr,"_");
+ }
- if(lastmillis - lastmotion >= motionblurmillis)
- {
- lastmotion = lastmillis - lastmillis%motionblurmillis;
+// if(lastmillis - lastmotion >= motionblurmillis)
+// {
+// lastmotion = lastmillis - lastmillis%motionblurmillis;
glCopyTexSubImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, 0, 0, screen->w, screen->h);
- }
+// }
}
bool dopostfx = false;
Index: engine/main.cpp
===================================================================
--- engine/main.cpp (revision 4089)
+++ engine/main.cpp (working copy)
@@ -993,6 +993,18 @@
return max(millis, totalmillis);
}
+long long int getclockmicros()
+{
+ struct timeval timestamp;
+ gettimeofday(×tamp,NULL);
+ return timestamp.tv_sec*1000000ll+timestamp.tv_usec;
+}
+
+
+int subframe = 0;
+long long int lastrealframemicros = getclockmicros();
+
+
int main(int argc, char **argv)
{
#ifdef WIN32
@@ -1188,11 +1200,22 @@
inputgrab(grabinput = true);
ignoremousemotion();
+ lastrealframemicros = getclockmicros();
+
for(;;)
{
static int frames = 0;
int millis = getclockmillis();
- limitfps(millis, totalmillis);
+// limitfps(millis, totalmillis);
+// long long int currentsubframemicros = getclockmicros();
+
+ fprintf(stderr,"|%i:",subframe);
+// if (!mainmenu) {
+// long long int subframestart = lastrealframemicros + 1000000ll*(subframe)/120;
+// int delay = (subframestart - getclockmicros())/1000;
+// if (delay>0 && subframe>0) SDL_Delay(delay);
+// }
+
int elapsed = millis-totalmillis;
if(multiplayer(false)) curtime = game::ispaused() ? 0 : elapsed;
else
@@ -1232,8 +1255,29 @@
inbetweenframes = false;
if(mainmenu) gl_drawmainmenu(screen->w, screen->h);
else gl_drawframe(screen->w, screen->h);
- swapbuffers();
+// swapbuffers();
renderedframe = inbetweenframes = true;
+
+// glFinish();
+// glFlush();
+ long long int now = getclockmicros();
+ bool slowsubframe = 0;//(now - lastrealframemicros) > (1000000*(subframe+1)/120);
+ if (slowsubframe) {
+ fprintf(stderr,"s:");
+ }
+ fprintf(stderr,"%lli ",(now - lastrealframemicros)/1000);
+ if (subframe == 1 && slowsubframe) fprintf(stderr,"o");
+ if ((subframe == 0 && slowsubframe) || (subframe == 1 && !slowsubframe)) {
+ long long int j = getclockmicros();
+ swapbuffers();
+ glFinish();
+ long long int i = getclockmicros();
+ fprintf(stderr," w:%lli S:%lli\n",(i-j)/1000,(i-lastrealframemicros)/1000);
+ lastrealframemicros = i;
+ }
+ if (!(subframe == 0 && slowsubframe))
+ subframe = !subframe;
+
}
ASSERT(0);