[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Pingus-CVS] r3823 - trunk/pingus/src/display
From: |
grumbel at BerliOS |
Subject: |
[Pingus-CVS] r3823 - trunk/pingus/src/display |
Date: |
Mon, 14 Jul 2008 20:41:52 +0200 |
Author: grumbel
Date: 2008-07-14 20:41:52 +0200 (Mon, 14 Jul 2008)
New Revision: 3823
Modified:
trunk/pingus/src/display/
trunk/pingus/src/display/delta_framebuffer.cpp
trunk/pingus/src/display/rect_merger.cpp
trunk/pingus/src/display/sdl_framebuffer.cpp
trunk/pingus/src/display/sdl_framebuffer.hpp
Log:
Switched from SDL_Rect to Rect in some functions, also hooked up the
rect_merger (crashes sometimes, not finished)
Property changes on: trunk/pingus/src/display
___________________________________________________________________
Name: svn:ignore
- .sconsign
semantic.cache
+ rect_merger
.sconsign
semantic.cache
Modified: trunk/pingus/src/display/delta_framebuffer.cpp
===================================================================
--- trunk/pingus/src/display/delta_framebuffer.cpp 2008-07-14 18:31:45 UTC
(rev 3822)
+++ trunk/pingus/src/display/delta_framebuffer.cpp 2008-07-14 18:41:52 UTC
(rev 3823)
@@ -16,6 +16,7 @@
#include <iostream>
#include "../math.hpp"
+#include "rect_merger.hpp"
#include "sdl_framebuffer.hpp"
#include "delta_framebuffer.hpp"
@@ -28,30 +29,17 @@
fb.draw_surface(surface, rect, pos);
}
- SDL_Rect get_region() const {
- SDL_Rect sdl_rect;
- sdl_rect.x = pos.x;
- sdl_rect.y = pos.y;
- sdl_rect.w = rect.get_width();
- sdl_rect.h = rect.get_height();
- return sdl_rect;
+ Rect get_region() const {
+ return Rect(pos, rect.get_size());
}
};
-void merge_rectangles(const std::vector<SDL_Rect>& rects_in,
std::vector<SDL_Rect>& rects_out)
+int calculate_region(const std::vector<Rect>& rects)
{
- for(std::vector<SDL_Rect>::const_iterator i = rects_in.begin(); i !=
rects_in.end(); ++i)
- {
- rects_out.push_back(*i);
- }
-}
-
-int calculate_region(const std::vector<SDL_Rect>& rects)
-{
int area = 0;
- for(std::vector<SDL_Rect>::const_iterator i = rects.begin(); i !=
rects.end(); ++i)
+ for(std::vector<Rect>::const_iterator i = rects.begin(); i != rects.end();
++i)
{
- area += i->w * i->h;
+ area += i->get_width() * i->get_height();
}
return area;
}
@@ -75,14 +63,14 @@
for(DrawOps::iterator i = draw_obs.begin(); i != draw_obs.end(); ++i)
if (op.surface == i->surface &&
op.pos == i->pos &&
- op.rect == op.rect)
+ op.rect == i->rect)
return true;
return false;
}
void render(SDLFramebuffer& fb, DrawOpBuffer& frontbuffer)
{
- std::vector<SDL_Rect> changed_regions;
+ std::vector<Rect> changed_regions;
// Find all regions that need updating
for(DrawOps::iterator i = draw_obs.begin(); i != draw_obs.end(); ++i)
@@ -95,42 +83,44 @@
// Clip things to the screen
Size screen_size = fb.get_size();
- for(std::vector<SDL_Rect>::iterator i = changed_regions.begin(); i !=
changed_regions.end(); ++i)
- {
- i->w = Math::clamp(0, int(i->w), Math::max(0, screen_size.width -
i->x));
- i->h = Math::clamp(0, int(i->h), Math::max(0, screen_size.height -
i->y));
+ for(std::vector<Rect>::iterator i = changed_regions.begin(); i !=
changed_regions.end(); ++i)
+ {
+ // FIXME: It might be a good idea to remove empty rectangles here, so
that merge_rectangles() can work smoother
+ i->left = Math::clamp(0, int(i->left), screen_size.width);
+ i->top = Math::clamp(0, int(i->top), screen_size.height);
- i->x = Math::clamp(0, int(i->x), screen_size.width);
- i->y = Math::clamp(0, int(i->y), screen_size.height);
+ i->right = Math::clamp(0, int(i->right), screen_size.width);
+ i->bottom = Math::clamp(0, int(i->bottom), screen_size.height);
}
- // Merge rectangles
- std::vector<SDL_Rect> update_rects;
- merge_rectangles(changed_regions, update_rects);
+ if (!changed_regions.empty())
+ {
+ // Merge rectangles
+ std::vector<Rect> update_rects;
+ merge_rectangles(changed_regions, update_rects);
+ //update_rects = changed_regions;
- int area = calculate_region(update_rects);
+ int area = calculate_region(update_rects);
- if (area == 0)
- { // No screen update needed
- }
- else if (area < fb.get_size().get_area()*75/100) // FIXME: Random Magic
ratio, need benchmarking to find proper value
- { // Update all regions that need update
- for(std::vector<SDL_Rect>::iterator i = update_rects.begin(); i !=
update_rects.end(); ++i)
- {
- fb.push_cliprect(Rect(Vector2i(i->x, i->y), Size(i->w, i->h)));
+ if (area < fb.get_size().get_area()*75/100) // FIXME: Random Magic
ratio, need benchmarking to find proper value
+ { // Update all regions that need update
+ for(std::vector<Rect>::iterator i = update_rects.begin(); i !=
update_rects.end(); ++i)
+ {
+ fb.push_cliprect(*i);
+ for(DrawOps::iterator j = draw_obs.begin(); j !=
draw_obs.end(); ++j)
+ j->render(fb);
+ fb.pop_cliprect();
+ }
+
+ fb.update_rects(update_rects);
+ }
+ else
+ { // Update the whole screen at once, since we have to many rects
for(DrawOps::iterator j = draw_obs.begin(); j != draw_obs.end();
++j)
j->render(fb);
- fb.pop_cliprect();
+ fb.flip();
}
-
- fb.update_rects(update_rects);
}
- else
- { // Update the whole screen at once, since we have to many rects
- for(DrawOps::iterator j = draw_obs.begin(); j != draw_obs.end(); ++j)
- j->render(fb);
- fb.flip();
- }
}
void add(const SurfaceDrawOp& op) {
Modified: trunk/pingus/src/display/rect_merger.cpp
===================================================================
--- trunk/pingus/src/display/rect_merger.cpp 2008-07-14 18:31:45 UTC (rev
3822)
+++ trunk/pingus/src/display/rect_merger.cpp 2008-07-14 18:41:52 UTC (rev
3823)
@@ -146,12 +146,13 @@
std::vector<Rect>::const_iterator rect = rects.begin();
for(std::vector<Row>::iterator row = rows.begin(); row != rows.end() && rect
!= rects.end(); ++row)
{
+ // FIXME: Crash Bug here, maybe
for(; rect->top == row->top; ++rect)
{
Mark start(Mark::START_MARK, rect->left);
Mark end (Mark::END_MARK, rect->right);
- // Add the gives rectangle to all rows it overlaps
+ // Add the given rectangle to all rows it overlaps
std::vector<Row>::iterator this_row = row;
do
{
Modified: trunk/pingus/src/display/sdl_framebuffer.cpp
===================================================================
--- trunk/pingus/src/display/sdl_framebuffer.cpp 2008-07-14 18:31:45 UTC
(rev 3822)
+++ trunk/pingus/src/display/sdl_framebuffer.cpp 2008-07-14 18:41:52 UTC
(rev 3823)
@@ -376,9 +376,21 @@
}
void
-SDLFramebuffer::update_rects(const std::vector<SDL_Rect>& rects)
+SDLFramebuffer::update_rects(const std::vector<Rect>& rects)
{
- SDL_UpdateRects(screen, rects.size(),
const_cast<SDL_Rect*>(&*rects.begin()));
+ std::vector<SDL_Rect> sdl_rects;
+
+ for(std::vector<Rect>::const_iterator i = rects.begin(); i != rects.end();
++i)
+ {
+ SDL_Rect sdl_rect;
+ sdl_rect.x = i->left;
+ sdl_rect.y = i->top;
+ sdl_rect.w = i->get_width();
+ sdl_rect.h = i->get_height();
+ sdl_rects.push_back(sdl_rect);
+ }
+
+ SDL_UpdateRects(screen, sdl_rects.size(),
const_cast<SDL_Rect*>(&*sdl_rects.begin()));
}
Size
Modified: trunk/pingus/src/display/sdl_framebuffer.hpp
===================================================================
--- trunk/pingus/src/display/sdl_framebuffer.hpp 2008-07-14 18:31:45 UTC
(rev 3822)
+++ trunk/pingus/src/display/sdl_framebuffer.hpp 2008-07-14 18:41:52 UTC
(rev 3823)
@@ -36,7 +36,7 @@
void set_video_mode(const Size& size, bool fullscreen);
void flip();
- void update_rects(const std::vector<SDL_Rect>& rects);
+ void update_rects(const std::vector<Rect>& rects);
void push_cliprect(const Rect&);
void pop_cliprect();
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Pingus-CVS] r3823 - trunk/pingus/src/display,
grumbel at BerliOS <=