From 49796e6cc2385aea989d7c44c789b406190f2bf7 Mon Sep 17 00:00:00 2001 From: Ingo Ruhnke Date: Mon, 3 Jul 2006 17:29:29 +0000 Subject: [PATCH] - added sprite rotation - some spotlight stuff SVN-Revision: 3854 --- data/images/objects/spotlight/lightcone.png | Bin 16732 -> 33325 bytes data/images/objects/spotlight/lightcone.sprite | 1 + .../images/objects/spotlight/spotlight_base.sprite | 1 + .../objects/spotlight/spotlight_center.sprite | 1 + .../objects/spotlight/spotlight_lights.sprite | 1 + data/levels/test/light.stl | 10 +--- src/object/spotlight.cpp | 19 +++++-- src/object/spotlight.hpp | 1 + src/sprite/sprite.cpp | 21 ++++++-- src/sprite/sprite.hpp | 13 +++-- src/video/drawing_context.cpp | 17 +++++-- src/video/drawing_context.hpp | 12 ++++- src/video/surface.cpp | 56 +++++++++++++++++++++ src/video/surface.hpp | 1 + 14 files changed, 130 insertions(+), 24 deletions(-) diff --git a/data/images/objects/spotlight/lightcone.png b/data/images/objects/spotlight/lightcone.png index 6a7e89d52ef5220dc8ccff919ac7cd6b24155821..63393e8c422b8de612f30a184983ba50274ac436 100644 GIT binary patch literal 33325 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
  • 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 N002ovPDHLkV1i)obG-ln literal 16732 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

    Tx7 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

    961nD~jv(im-g{&A+x^%8KH;y(BpO>-`n1 zD6ZRe!|C732fm`XZr2E=e|sPCisHIm4pYB=cxn6p?MA)_w%R7^00000NkvXXu0mjf DQrb0@ diff --git a/data/images/objects/spotlight/lightcone.sprite b/data/images/objects/spotlight/lightcone.sprite index f38f20867..2ec345cac 100644 --- a/data/images/objects/spotlight/lightcone.sprite +++ b/data/images/objects/spotlight/lightcone.sprite @@ -2,5 +2,6 @@ (action (name "default") (images "lightcone.png") + (hitbox 430 93 0 0) ) ) diff --git a/data/images/objects/spotlight/spotlight_base.sprite b/data/images/objects/spotlight/spotlight_base.sprite index 7901be0e2..b4ce25a74 100644 --- a/data/images/objects/spotlight/spotlight_base.sprite +++ b/data/images/objects/spotlight/spotlight_base.sprite @@ -2,5 +2,6 @@ (action (name "default") (images "spotlight_base.png") + (hitbox 32 32 0 0) ) ) diff --git a/data/images/objects/spotlight/spotlight_center.sprite b/data/images/objects/spotlight/spotlight_center.sprite index 996fd4446..96ccda2ef 100644 --- a/data/images/objects/spotlight/spotlight_center.sprite +++ b/data/images/objects/spotlight/spotlight_center.sprite @@ -2,5 +2,6 @@ (action (name "default") (images "spotlight_center.png") + (hitbox 32 32 0 0) ) ) diff --git a/data/images/objects/spotlight/spotlight_lights.sprite b/data/images/objects/spotlight/spotlight_lights.sprite index 3ba02bbd8..03491bc65 100644 --- a/data/images/objects/spotlight/spotlight_lights.sprite +++ b/data/images/objects/spotlight/spotlight_lights.sprite @@ -2,5 +2,6 @@ (action (name "default") (images "spotlight_lights.png") + (hitbox 32 32 0 0) ) ) diff --git a/data/levels/test/light.stl b/data/levels/test/light.stl index 15807cf10..77473f13f 100644 --- a/data/levels/test/light.stl +++ b/data/levels/test/light.stl @@ -70,14 +70,6 @@ (reset-points ) (objects - (light ) - (mriceblock (x 666) (y 68) (stay-on-platform #f)) - (mriceblock (x 892) (y 70) (stay-on-platform #f)) - (mriceblock (x 1146) (y 69) (stay-on-platform #f)) - (mriceblock (x 1363) (y 58) (stay-on-platform #f)) - (mriceblock (x 1180) (y 15) (stay-on-platform #f)) - (mriceblock (x 939) (y 22) (stay-on-platform #f)) - (mriceblock (x 703) (y 25) (stay-on-platform #f)) - (stalactite (x 322) (y 288) (stay-on-platform #f)) + (spotlight ) ) ) diff --git a/src/object/spotlight.cpp b/src/object/spotlight.cpp index 5778b9e94..e15cdf371 100644 --- a/src/object/spotlight.cpp +++ b/src/object/spotlight.cpp @@ -33,6 +33,8 @@ Spotlight::Spotlight(const lisp::Lisp& ) base = sprite_manager->create("images/objects/spotlight/spotlight_base.sprite"); lights = sprite_manager->create("images/objects/spotlight/spotlight_lights.sprite"); lightcone = sprite_manager->create("images/objects/spotlight/lightcone.sprite"); + + angle = 0.0f; } Spotlight::~Spotlight() @@ -44,24 +46,33 @@ Spotlight::~Spotlight() } void -Spotlight::update(float ) +Spotlight::update(float delta) { - // FIXME: add rotation code + angle += delta * 50.0f; } void Spotlight::draw(DrawingContext& context) { - context.push_target(); + context.push_target(); context.set_target(DrawingContext::LIGHTMAP); Vector pos(100, 300); + + lightcone->set_angle(angle); lightcone->draw(context, pos, 0); - // rotate this one 180 degree + + lightcone->set_angle(angle + 180.0f); lightcone->draw(context, pos, 0); context.set_target(DrawingContext::NORMAL); + + lights->set_angle(angle); + lights->draw(context, pos, 0); + + base->set_angle(angle); base->draw(context, pos, 0); + center->draw(context, pos, 0); context.pop_target(); diff --git a/src/object/spotlight.hpp b/src/object/spotlight.hpp index 4948fb674..520ad1a21 100644 --- a/src/object/spotlight.hpp +++ b/src/object/spotlight.hpp @@ -35,6 +35,7 @@ public: void draw(DrawingContext& context); private: + float angle; Sprite* center; Sprite* base; Sprite* lights; diff --git a/src/sprite/sprite.cpp b/src/sprite/sprite.cpp index 7a32c3fee..e14621f80 100644 --- a/src/sprite/sprite.cpp +++ b/src/sprite/sprite.cpp @@ -24,13 +24,15 @@ #include #include + +#include "video/surface.hpp" #include "sprite.hpp" #include "video/drawing_context.hpp" #include "log.hpp" #include "timer.hpp" Sprite::Sprite(SpriteData& newdata) - : data(newdata), frame(0), animation_loops(-1) + : data(newdata), frame(0), animation_loops(-1), angle(0.0f) { action = data.get_action("normal"); if(!action) @@ -103,8 +105,9 @@ Sprite::draw(DrawingContext& context, const Vector& pos, int layer) log_warning << "frame out of range: " << (int)frame << "/" << get_frames() << " at " << get_name() << "/" << get_action() << std::endl; else context.draw_surface(action->surfaces[(int)frame], - pos - Vector(action->x_offset, action->y_offset), - layer + action->z_order); + pos - Vector(action->x_offset, action->y_offset), + angle, + layer + action->z_order); } void @@ -178,4 +181,16 @@ Sprite::set_fps(float new_fps) action->fps = new_fps; } +void +Sprite::set_angle(float a) +{ + angle = a; +} + +float +Sprite::get_angle() const +{ + return angle; +} +/* EOF */ diff --git a/src/sprite/sprite.hpp b/src/sprite/sprite.hpp index df0f9c718..b97b65cde 100644 --- a/src/sprite/sprite.hpp +++ b/src/sprite/sprite.hpp @@ -24,11 +24,11 @@ #include #include -#include "video/surface.hpp" #include "math/vector.hpp" #include "math/rect.hpp" #include "sprite_data.hpp" +class Surface; class DrawingContext; class Sprite @@ -86,6 +86,12 @@ public: /** return current action's hitbox, relative to 0,0 */ Rect get_current_hitbox() const; + /** Set the angle of the sprite rotation in degree */ + void set_angle(float angle); + + /** Get the angle of the sprite rotation in degree */ + float get_angle() const; + /** Get current frame */ int get_frame() const { return (int)frame; } @@ -106,9 +112,10 @@ private: SpriteData& data; float frame; - int animation_loops; + int animation_loops; float last_ticks; - + float angle; + SpriteData::Action* action; }; diff --git a/src/video/drawing_context.cpp b/src/video/drawing_context.cpp index 8abfdc0c4..5dbad1869 100644 --- a/src/video/drawing_context.cpp +++ b/src/video/drawing_context.cpp @@ -70,7 +70,7 @@ DrawingContext::~DrawingContext() } void -DrawingContext::draw_surface(const Surface* surface, const Vector& position, +DrawingContext::draw_surface(const Surface* surface, const Vector& position, float angle, int layer) { assert(surface != 0); @@ -88,12 +88,20 @@ DrawingContext::draw_surface(const Surface* surface, const Vector& position, request.layer = layer; request.drawing_effect = transform.drawing_effect; request.alpha = transform.alpha; + request.angle = angle; request.request_data = const_cast (surface); requests->push_back(request); } void +DrawingContext::draw_surface(const Surface* surface, const Vector& position, + int layer) +{ + draw_surface(surface, position, 0.0f, layer); +} + +void DrawingContext::draw_surface_part(const Surface* surface, const Vector& source, const Vector& size, const Vector& dest, int layer) { @@ -319,7 +327,7 @@ DrawingContext::do_drawing() glLoadIdentity(); // FIXME: Add ambient light support here - glClearColor(0, 0, 0, 1); + glClearColor(0.5, 0.5, 0.5, 1); glClear(GL_COLOR_BUFFER_BIT); handle_drawing_requests(lightmap_requests); lightmap_requests.clear(); @@ -381,7 +389,10 @@ DrawingContext::handle_drawing_requests(DrawingRequests& requests) case SURFACE: { const Surface* surface = (const Surface*) i->request_data; - surface->draw(i->pos.x, i->pos.y, i->alpha, i->drawing_effect); + if (i->angle == 0.0f) + surface->draw(i->pos.x, i->pos.y, i->alpha, i->drawing_effect); + else + surface->draw(i->pos.x, i->pos.y, i->alpha, i->angle, i->drawing_effect); break; } case SURFACE_PART: diff --git a/src/video/drawing_context.hpp b/src/video/drawing_context.hpp index c65e0fb8f..4ed280688 100644 --- a/src/video/drawing_context.hpp +++ b/src/video/drawing_context.hpp @@ -61,9 +61,12 @@ class DrawingContext public: DrawingContext(); ~DrawingContext(); - + + /// Adds a drawing request for a surface into the request list. + void draw_surface(const Surface* surface, const Vector& position, + int layer); /// Adds a drawing request for a surface into the request list. - void draw_surface(const Surface* surface, const Vector& position, + void draw_surface(const Surface* surface, const Vector& position, float angle, int layer); /// Adds a drawing request for part of a surface. void draw_surface_part(const Surface* surface, const Vector& source, @@ -187,8 +190,13 @@ private: DrawingEffect drawing_effect; float alpha; Blend blend; + float angle; void* request_data; + + DrawingRequest() + : angle(0.0f) + {} bool operator<(const DrawingRequest& other) const { diff --git a/src/video/surface.cpp b/src/video/surface.cpp index 7414564bc..799372b27 100644 --- a/src/video/surface.cpp +++ b/src/video/surface.cpp @@ -130,6 +130,62 @@ static inline void intern_draw(float left, float top, float right, float bottom, glEnd(); } +static inline void intern_draw2(float left, float top, float right, float bottom, + float uv_left, float uv_top, + float uv_right, float uv_bottom, + float angle, + DrawingEffect effect) +{ + if(effect & HORIZONTAL_FLIP) + std::swap(uv_left, uv_right); + if(effect & VERTICAL_FLIP) { + std::swap(uv_top, uv_bottom); + } + + float center_x = (left + right) / 2; + float center_y = (top + bottom) / 2; + + float sa = sinf(angle/180.0f*M_PI); + float ca = cosf(angle/180.0f*M_PI); + + left -= center_x; + right -= center_x; + + top -= center_y; + bottom -= center_y; + + glBegin(GL_QUADS); + glTexCoord2f(uv_left, uv_top); + glVertex2f(left*ca - top*sa + center_x, + left*sa + top*ca + center_y); + + glTexCoord2f(uv_right, uv_top); + glVertex2f(right*ca - top*sa + center_x, + right*sa + top*ca + center_y); + + glTexCoord2f(uv_right, uv_bottom); + glVertex2f(right*ca - bottom*sa + center_x, + right*sa + bottom*ca + center_y); + + glTexCoord2f(uv_left, uv_bottom); + glVertex2f(left*ca - bottom*sa + center_x, + left*sa + bottom*ca + center_y); + glEnd(); +} + +void +Surface::draw(float x, float y, float alpha, float angle, DrawingEffect effect) const +{ + glColor4f(1.0f, 1.0f, 1.0f, alpha); + glBindTexture(GL_TEXTURE_2D, texture->get_handle()); + + intern_draw2(x, y, + x + width, y + height, + uv_left, uv_top, uv_right, uv_bottom, + angle, + effect); +} + void Surface::draw(float x, float y, float alpha, DrawingEffect effect) const { diff --git a/src/video/surface.hpp b/src/video/surface.hpp index c1de2993c..8961606ed 100644 --- a/src/video/surface.hpp +++ b/src/video/surface.hpp @@ -51,6 +51,7 @@ private: float uv_right; float uv_bottom; + void draw(float x, float y, float alpha, float angle, DrawingEffect effect) const; void draw(float x, float y, float alpha, DrawingEffect effect) const; void draw_part(float src_x, float src_y, float dst_x, float dst_y, float width, float height, -- 2.11.0