int result = 1;
while(result < val)
result *= 2;
-
+
return result;
}
}
void
-DrawingContext::draw_surface(const Surface* surface, const Vector& position,
+DrawingContext::draw_surface(const Surface* surface, const Vector& position,
float angle, const Color& color, const Blend& blend,
int layer)
{
assert(surface != 0);
-
+
DrawingRequest request;
request.type = SURFACE;
request.pos = transform.apply(position);
if(request.pos.x >= SCREEN_WIDTH || request.pos.y >= SCREEN_HEIGHT
- || request.pos.x + surface->get_width() < 0
+ || request.pos.x + surface->get_width() < 0
|| request.pos.y + surface->get_height() < 0)
return;
request.color = color;
request.blend = blend;
- request.request_data = const_cast<Surface*> (surface);
+ request.request_data = const_cast<Surface*> (surface);
requests->push_back(request);
}
void
-DrawingContext::draw_surface(const Surface* surface, const Vector& position,
+DrawingContext::draw_surface(const Surface* surface, const Vector& position,
int layer)
{
draw_surface(surface, position, 0.0f, Color(1.0f, 1.0f, 1.0f), Blend(), layer);
request.layer = layer;
request.drawing_effect = transform.drawing_effect;
request.alpha = transform.alpha;
-
+
SurfacePartRequest* surfacepartrequest = new SurfacePartRequest();
surfacepartrequest->size = size;
surfacepartrequest->source = source;
request.layer = layer;
request.drawing_effect = transform.drawing_effect;
- request.alpha = transform.alpha;
+ request.alpha = transform.alpha;
FillRectRequest* fillrectrequest = new FillRectRequest;
fillrectrequest->size = size;
request.layer = layer;
request.drawing_effect = transform.drawing_effect;
- request.alpha = transform.alpha;
+ request.alpha = transform.alpha;
FillRectRequest* fillrectrequest = new FillRectRequest;
fillrectrequest->size = Vector(rect.get_width(), rect.get_height());
GradientRequest* gradientrequest = (GradientRequest*) request.request_data;
const Color& top = gradientrequest->top;
const Color& bottom = gradientrequest->bottom;
-
+
glDisable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glColor4f(top.red, top.green, top.blue, top.alpha);
glDisable(GL_TEXTURE_2D);
glColor4f(fillrectrequest->color.red, fillrectrequest->color.green,
fillrectrequest->color.blue, fillrectrequest->color.alpha);
-
+
glBegin(GL_QUADS);
glVertex2f(x, y);
glVertex2f(x+w, y);
target_stack.clear();
bool use_lightmap = lightmap_requests.size() != 0;
-
+
// PART1: create lightmap
if(use_lightmap) {
glViewport(0, screen->h - lightmap_height, lightmap_width, lightmap_height);
glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
+ glLoadIdentity();
glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT);
handle_drawing_requests(lightmap_requests);
lightmap_requests.clear();
-
+
glDisable(GL_BLEND);
glBindTexture(GL_TEXTURE_2D, lightmap->get_handle());
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, screen->h - lightmap_height, lightmap_width, lightmap_height);
glViewport(0, 0, screen->w, screen->h);
glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
+ glLoadIdentity();
glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1.0, 1.0);
- glMatrixMode(GL_MODELVIEW);
+ glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_BLEND);
}
if(use_lightmap) {
// multiple the lightmap with the framebuffer
glBlendFunc(GL_DST_COLOR, GL_ZERO);
-
+
glBindTexture(GL_TEXTURE_2D, lightmap->get_handle());
glBegin(GL_QUADS);
glTexCoord2f(0, 0);
glVertex2f(0, SCREEN_HEIGHT);
-
+
glEnd();
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
DrawingContext::handle_drawing_requests(DrawingRequests& requests)
{
std::stable_sort(requests.begin(), requests.end());
-
+
for(DrawingRequests::iterator i = requests.begin();
i != requests.end(); ++i) {
switch(i->type) {
else
requests = &drawing_requests;
}
-