X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fgraphics%2FTexture.cpp;h=97094bc5209c9ba34456ca4aeb7997f5487d8d40;hb=ce1e9a11c89c83356d797c8225369b711513a4da;hp=f4a0385897ec42da9108363f01be7e7fda32684e;hpb=cc3d698b8c1ad09d7a3f9e3f28bc84e0ac1735ea;p=l2e.git diff --git a/src/graphics/Texture.cpp b/src/graphics/Texture.cpp index f4a0385..97094bc 100644 --- a/src/graphics/Texture.cpp +++ b/src/graphics/Texture.cpp @@ -1,8 +1,13 @@ #include "Texture.h" +#include "../loader/Interpreter.h" +#include "../loader/TypeDescription.h" #include "../sdl/utility.h" -using geometry::Vector; +using math::Vector; +using loader::FieldDescription; +using loader::Interpreter; +using loader::TypeDescription; namespace graphics { @@ -35,24 +40,58 @@ void Texture::Render(SDL_Surface *dest, const Vector &from, const Vector total = to - from; + const Vector over = total % size; + const Vector target = from + (total - over); + + for (destRect.y = from.Y(); destRect.y < target.Y(); destRect.y += size.Y()) { + for (destRect.x = from.X(); destRect.x < target.X(); destRect.x += size.X()) { + SDL_BlitSurface(surface, &srcRect, dest, &destRect); + } + } + if (over.X() > 0) { + destRect.x = target.X(); + srcRect.w = over.X(); srcRect.h = size.Y(); - destRect.h = size.Y(); - if (destRect.y + destRect.h > to.Y()) { - srcRect.h = to.Y() - destRect.y; - destRect.h = to.Y() - destRect.y; + for (destRect.y = from.Y(); destRect.y < target.Y(); destRect.y += size.Y()) { + SDL_BlitSurface(surface, &srcRect, dest, &destRect); + } + } + if (over.Y() > 0) { + destRect.y = target.Y(); + srcRect.w = size.X(); + srcRect.h = over.Y(); + for (destRect.x = from.X(); destRect.x < target.X(); destRect.x += size.X()) { + SDL_BlitSurface(surface, &srcRect, dest, &destRect); } - for (destRect.x = from.X(); destRect.x < to.X(); destRect.x += size.X()) { - srcRect.w = size.X(); - destRect.w = size.X(); - if (destRect.x + destRect.w > to.X()) { - srcRect.w = to.X() - destRect.x; - destRect.w = to.X() - destRect.x; - } + if (over.X() > 0) { + srcRect.w = over.X(); + srcRect.h = over.Y(); + destRect.x = target.X(); + destRect.y = target.Y(); SDL_BlitSurface(surface, &srcRect, dest, &destRect); } } } + +void Texture::CreateTypeDescription() { + Texture t; + + TypeDescription &td(TypeDescription::Create(TYPE_ID, "Texture")); + td.SetConstructor(&Construct); + td.SetSize(sizeof(Texture)); + + td.AddField("image", FieldDescription(((char *)&t.surface) - ((char *)&t), Interpreter::IMAGE_ID).SetReferenced().SetDescription("image containing the texture")); + td.AddField("size", FieldDescription(((char *)&t.size) - ((char *)&t), Interpreter::VECTOR_ID).SetDescription("offset into the image in pixels")); + td.AddField("offset", FieldDescription(((char *)&t.offset) - ((char *)&t), Interpreter::VECTOR_ID).SetDescription("size of the texture in pixels")); +} + +void Texture::Construct(void *data) { + new (data) Texture; +} + }