From e191660e76a4c764e949901dcbcb1fd97e5be448 Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Sun, 5 Dec 2010 20:47:20 +0000 Subject: Avancement sur le système de dirt rectangles. Il reste à faire une vraie méthode de painting qui repeint ce qu'il faut exactement, en gérant les différentes superpositions (objects no_override, terrains, objets, lemmings, particules, curseur) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: file:///var/svn/2010-netlemmings/trunk@186 077b3477-7977-48bd-8428-443f22f7bfda --- src/netlem.c | 45 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/src/netlem.c b/src/netlem.c index b5147e7..5f3dfb2 100644 --- a/src/netlem.c +++ b/src/netlem.c @@ -435,6 +435,21 @@ void processLocalEvents(SDL_Rect *viewport, SDL_Rect *screen, SDL_Rect *terrain) //case SDLK_PAGEUP : if(decalFps>0){decalFps -=1;}break; //case SDLK_PAGEDOWN : if(decalFps<(FPS-1)){decalFps +=1;}break; //case SDLK_w : paint_stencil = (paint_stencil==0)? 1 : 0 ; break; +// case SDLK_x : switchMiniMapMode= (switchMiniMapMode==0)? 1 : ((switchMiniMapMode==1)? 2 : ((switchMiniMapMode==2)? 3 : 0)) ;permission=0;break; +// case SDLK_p :{ +// zoomX=((zoomX >= 1. )? zoomX + 1. : zoomX + 0.1 ); +// zoomY=((zoomY >= 1. )? zoomY + 1. : zoomY + 0.1 ); +// if(zoomX > 10.) {zoomX=10.;} +// if(zoomY > 10.) {zoomY=10.;} +// break; +// } +// case SDLK_m :{ +// zoomX=((zoomX > 1. )? zoomX - 1. : zoomX - 0.1 ); +// zoomY=((zoomY > 1. )? zoomY - 1. : zoomY - 0.1 ); +// if(zoomX <= 0.) {zoomX=0.1;} +// if(zoomY <= 0.) {zoomY=0.1;} +// break; +// } case SDLK_ESCAPE : changeState(eEnd); break; default:break; } @@ -476,7 +491,7 @@ void processLocalEvents(SDL_Rect *viewport, SDL_Rect *screen, SDL_Rect *terrain) } int updateGraphics(gameGraphics_t *gGraph) { - int res; + int i, res; static SDL_Rect lastViewport= {-1,-1,-1,-1}; //TODO : modifier les calques @@ -485,21 +500,39 @@ int updateGraphics(gameGraphics_t *gGraph) { break; case eMultiGame: // If we had a camera movement, we have to refesh all the screen -// if ( memcmp(&lastViewport, &(gGraph->viewport), sizeof(SDL_Rect)) != 0) { + // if ( memcmp(&lastViewport, &(gGraph->viewport), sizeof(SDL_Rect)) != 0) { if ( lastViewport.x != gGraph->viewport.x ) { //lastViewport=gGraph->viewport; lastViewport.x=gGraph->viewport.x; -printf("viewport.x==%i\n", gGraph->viewport.x); + printf("viewport.x==%i\n", gGraph->viewport.x); + if ( gGraph->dirtRectsCount > 0 ) { + free(gGraph->dirtRects); + } + gGraph->dirtRects=malloc(1*sizeof(SDL_Rect)); + gGraph->dirtRects[0].x=0; + gGraph->dirtRects[0].y=0; + gGraph->dirtRects[0].w=0; + gGraph->dirtRects[0].h=0; + gGraph->dirtRectsCount=1; + } + // We use a dirt rectangle method for performance + + for(i=0; idirtRectsCount; i++) { + //FIXME : faire une vrai procedure qui va chercher les objets sur une zone donnée, qui paint tout dans l'ordre res=SDL_BlitSurface(gGraph->terrain, &lastViewport, gGraph->screen, NULL); if ( res!=0 ) { logs2(LOG_DEBUG, "updateGraphics(), SDL_BlitSurface()", SDL_GetError()); return res; } - SDL_UpdateRect(gGraph->screen, 0,0,0,0); - } else { - // Else, we use a dirt rectangle method for performance + SDL_UpdateRect(gGraph->screen, + gGraph->dirtRects[i].x, + gGraph->dirtRects[i].y, + gGraph->dirtRects[i].w, + gGraph->dirtRects[i].h); } + gGraph->dirtRectsCount=0; + free(gGraph->dirtRects); break; default: break; -- cgit v1.2.3