X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Ftile.h;h=f4dc572e7cbbe668ed2165a4df2a15c2d9c0549b;hb=a1e9732407494edb9cef3ada45cc2781a34ed60c;hp=c5c7f930346eef67859078355a41c8ae5e5b9c26;hpb=6f8d40ef5d24e26a70c7a0bdf6d2992e0bea9a63;p=dragonfireclient.git diff --git a/src/tile.h b/src/tile.h index c5c7f9303..f4dc572e7 100644 --- a/src/tile.h +++ b/src/tile.h @@ -27,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "threads.h" #include +#include class IGameDef; @@ -34,6 +35,17 @@ class IGameDef; tile.{h,cpp}: Texture handling stuff. */ +/* + Find out the full path of an image by trying different filename + extensions. + + If failed, return "". + + TODO: Should probably be moved out from here, because things needing + this function do not need anything else from this header +*/ +std::string getImagePath(std::string path); + /* Gets the path to a texture by first checking if the texture exists in texture_path and if not, using the data path. @@ -46,92 +58,55 @@ class IGameDef; */ std::string getTexturePath(const std::string &filename); -/* - Specifies a texture in an atlas. - - This is used to specify single textures also. +void clearTextureNameCache(); - This has been designed to be small enough to be thrown around a lot. +/* + ITextureSource::generateTextureFromMesh parameters */ -struct AtlasPointer +namespace irr {namespace scene {class IMesh;}} +struct TextureFromMeshParams { - u32 id; // Texture id - video::ITexture *atlas; // Atlas in where the texture is - v2f pos; // Position in atlas - v2f size; // Size in atlas - u16 tiled; // X-wise tiling count. If 0, width of atlas is width of image. - - AtlasPointer(): - id(0), - atlas(NULL), - pos(0,0), - size(1,1), - tiled(1) - {} - - AtlasPointer( - u16 id_, - video::ITexture *atlas_=NULL, - v2f pos_=v2f(0,0), - v2f size_=v2f(1,1), - u16 tiled_=1 - ): - id(id_), - atlas(atlas_), - pos(pos_), - size(size_), - tiled(tiled_) - { - } - - bool operator==(const AtlasPointer &other) const - { - return ( - id == other.id - ); - /*return ( - id == other.id && - atlas == other.atlas && - pos == other.pos && - size == other.size && - tiled == other.tiled - );*/ - } - - bool operator!=(const AtlasPointer &other) const - { - return !(*this == other); - } - - float x0(){ return pos.X; } - float x1(){ return pos.X + size.X; } - float y0(){ return pos.Y; } - float y1(){ return pos.Y + size.Y; } + scene::IMesh *mesh; + core::dimension2d dim; + std::string rtt_texture_name; + bool delete_texture_on_shutdown; + v3f camera_position; + v3f camera_lookat; + core::CMatrix4 camera_projection_matrix; + video::SColorf ambient_light; + v3f light_position; + video::SColorf light_color; + f32 light_radius; }; /* TextureSource creates and caches textures. */ -class ITextureSource +class ISimpleTextureSource +{ +public: + ISimpleTextureSource(){} + virtual ~ISimpleTextureSource(){} + virtual video::ITexture* getTexture( + const std::string &name, u32 *id = NULL) = 0; +}; + +class ITextureSource : public ISimpleTextureSource { public: ITextureSource(){} virtual ~ITextureSource(){} - virtual u32 getTextureId(const std::string &name){return 0;} - virtual u32 getTextureIdDirect(const std::string &name){return 0;} - virtual std::string getTextureName(u32 id){return "";} - virtual AtlasPointer getTexture(u32 id){return AtlasPointer(0);} - virtual AtlasPointer getTexture(const std::string &name) - {return AtlasPointer(0);} - virtual video::ITexture* getTextureRaw(const std::string &name) - {return NULL;} - virtual AtlasPointer getTextureRawAP(const AtlasPointer &ap) - {return AtlasPointer(0);} - virtual IrrlichtDevice* getDevice() - {return NULL;} - virtual void updateAP(AtlasPointer &ap){}; + virtual u32 getTextureId(const std::string &name)=0; + virtual std::string getTextureName(u32 id)=0; + virtual video::ITexture* getTexture(u32 id)=0; + virtual video::ITexture* getTexture( + const std::string &name, u32 *id = NULL)=0; + virtual IrrlichtDevice* getDevice()=0; virtual bool isKnownSourceImage(const std::string &name)=0; + virtual video::ITexture* generateTextureFromMesh( + const TextureFromMeshParams ¶ms)=0; + virtual video::ITexture* getNormalTexture(const std::string &name)=0; }; class IWritableTextureSource : public ITextureSource @@ -139,31 +114,50 @@ class IWritableTextureSource : public ITextureSource public: IWritableTextureSource(){} virtual ~IWritableTextureSource(){} - virtual u32 getTextureId(const std::string &name){return 0;} - virtual u32 getTextureIdDirect(const std::string &name){return 0;} - virtual std::string getTextureName(u32 id){return "";} - virtual AtlasPointer getTexture(u32 id){return AtlasPointer(0);} - virtual AtlasPointer getTexture(const std::string &name) - {return AtlasPointer(0);} - virtual video::ITexture* getTextureRaw(const std::string &name) - {return NULL;} - virtual IrrlichtDevice* getDevice() - {return NULL;} - virtual void updateAP(AtlasPointer &ap){}; + virtual u32 getTextureId(const std::string &name)=0; + virtual std::string getTextureName(u32 id)=0; + virtual video::ITexture* getTexture(u32 id)=0; + virtual video::ITexture* getTexture( + const std::string &name, u32 *id = NULL)=0; + virtual IrrlichtDevice* getDevice()=0; virtual bool isKnownSourceImage(const std::string &name)=0; + virtual video::ITexture* generateTextureFromMesh( + const TextureFromMeshParams ¶ms)=0; virtual void processQueue()=0; virtual void insertSourceImage(const std::string &name, video::IImage *img)=0; virtual void rebuildImagesAndTextures()=0; - virtual void buildMainAtlas(class IGameDef *gamedef)=0; + virtual video::ITexture* getNormalTexture(const std::string &name)=0; }; IWritableTextureSource* createTextureSource(IrrlichtDevice *device); +#ifdef __ANDROID__ +/** + * @param size get next npot2 value + * @return npot2 value + */ +inline unsigned int npot2(unsigned int size) +{ + if (size == 0) return 0; + unsigned int npot = 1; + + while ((size >>= 1) > 0) { + npot <<= 1; + } + return npot; +} + +video::IImage * Align2Npot2(video::IImage * image, video::IVideoDriver* driver); +#endif + enum MaterialType{ TILE_MATERIAL_BASIC, + TILE_MATERIAL_ALPHA, TILE_MATERIAL_LIQUID_TRANSPARENT, TILE_MATERIAL_LIQUID_OPAQUE, + TILE_MATERIAL_WAVING_LEAVES, + TILE_MATERIAL_WAVING_PLANTS }; // Material flags @@ -177,32 +171,49 @@ enum MaterialType{ // Animation made up by splitting the texture to vertical frames, as // defined by extra parameters #define MATERIAL_FLAG_ANIMATION_VERTICAL_FRAMES 0x08 -// Whether liquid shader should be used -#define MATERIAL_FLAG_ +#define MATERIAL_FLAG_HIGHLIGHTED 0x10 /* This fully defines the looks of a tile. The SMaterial of a tile is constructed according to this. */ +struct FrameSpec +{ + FrameSpec(): + texture_id(0), + texture(NULL), + normal_texture(NULL) + { + } + u32 texture_id; + video::ITexture *texture; + video::ITexture *normal_texture; +}; + struct TileSpec { TileSpec(): - texture(0), + texture_id(0), + texture(NULL), + normal_texture(NULL), alpha(255), material_type(TILE_MATERIAL_BASIC), material_flags( //0 // <- DEBUG, Use the one below MATERIAL_FLAG_BACKFACE_CULLING ), + shader_id(0), animation_frame_count(1), - animation_frame_length_ms(0) + animation_frame_length_ms(0), + rotation(0) { } bool operator==(const TileSpec &other) const { return ( - texture == other.texture && + texture_id == other.texture_id && + /* texture == other.texture && */ alpha == other.alpha && material_type == other.material_type && material_flags == other.material_flags && @@ -218,53 +229,51 @@ struct TileSpec // Sets everything else except the texture in the material void applyMaterialOptions(video::SMaterial &material) const { - switch(material_type){ + switch (material_type) { case TILE_MATERIAL_BASIC: material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF; break; + case TILE_MATERIAL_ALPHA: + material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; + break; case TILE_MATERIAL_LIQUID_TRANSPARENT: material.MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA; break; case TILE_MATERIAL_LIQUID_OPAQUE: material.MaterialType = video::EMT_SOLID; break; - } - material.BackfaceCulling = (material_flags & MATERIAL_FLAG_BACKFACE_CULLING) ? true : false; - } - void applyMaterialOptionsWithShaders(video::SMaterial &material, - const video::E_MATERIAL_TYPE &basic, - const video::E_MATERIAL_TYPE &liquid) const - { - switch(material_type){ - case TILE_MATERIAL_BASIC: - material.MaterialType = basic; - break; - case TILE_MATERIAL_LIQUID_TRANSPARENT: - material.MaterialType = liquid; + case TILE_MATERIAL_WAVING_LEAVES: + material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF; break; - case TILE_MATERIAL_LIQUID_OPAQUE: - material.MaterialType = liquid; + case TILE_MATERIAL_WAVING_PLANTS: + material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF; break; } - material.BackfaceCulling = (material_flags & MATERIAL_FLAG_BACKFACE_CULLING) ? true : false; + material.BackfaceCulling = (material_flags & MATERIAL_FLAG_BACKFACE_CULLING) + ? true : false; } - - // NOTE: Deprecated, i guess? - void setTexturePos(u8 tx_, u8 ty_, u8 tw_, u8 th_) + + void applyMaterialOptionsWithShaders(video::SMaterial &material) const { - texture.pos = v2f((float)tx_/256.0, (float)ty_/256.0); - texture.size = v2f(((float)tw_ + 1.0)/256.0, ((float)th_ + 1.0)/256.0); + material.BackfaceCulling = (material_flags & MATERIAL_FLAG_BACKFACE_CULLING) + ? true : false; } - AtlasPointer texture; + u32 texture_id; + video::ITexture *texture; + video::ITexture *normal_texture; + // Vertex alpha (when MATERIAL_ALPHA_VERTEX is used) u8 alpha; // Material parameters u8 material_type; u8 material_flags; + u32 shader_id; // Animation parameters u8 animation_frame_count; u16 animation_frame_length_ms; + std::map frames; + u8 rotation; };