X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fclient%2Ftile.h;h=fcdc46460ccfe542e1c9d0b830d7317e1ad2b4e1;hb=a049e8267fabd101cb5c6528b3270214cb0647f0;hp=45280480104943456d55e591e714e17d96979587;hpb=523f0e8c5bce0cb58215dc1f9d027cf32394e3c3;p=dragonfireclient.git diff --git a/src/client/tile.h b/src/client/tile.h index 452804801..fcdc46460 100644 --- a/src/client/tile.h +++ b/src/client/tile.h @@ -17,22 +17,27 @@ with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#ifndef TILE_HEADER -#define TILE_HEADER +#pragma once #include "irrlichttypes.h" #include "irr_v3d.h" #include -#include -#include "threads.h" #include #include +#include #include "util/numeric.h" +#include "config.h" + +#if ENABLE_GLES +#include +#endif class IGameDef; struct TileSpec; struct TileDef; +typedef std::vector Palette; + /* tile.{h,cpp}: Texture handling stuff. */ @@ -58,29 +63,10 @@ std::string getImagePath(std::string path); Utilizes a thread-safe cache. */ -std::string getTexturePath(const std::string &filename); +std::string getTexturePath(const std::string &filename, bool *is_base_pack = nullptr); void clearTextureNameCache(); -/* - ITextureSource::generateTextureFromMesh parameters -*/ -namespace irr {namespace scene {class IMesh;}} -struct TextureFromMeshParams -{ - 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. */ @@ -88,28 +74,36 @@ struct TextureFromMeshParams class ISimpleTextureSource { public: - ISimpleTextureSource(){} - virtual ~ISimpleTextureSource(){} + ISimpleTextureSource() = default; + + virtual ~ISimpleTextureSource() = default; + virtual video::ITexture* getTexture( - const std::string &name, u32 *id = NULL) = 0; + const std::string &name, u32 *id = nullptr) = 0; }; class ITextureSource : public ISimpleTextureSource { public: - ITextureSource(){} - virtual ~ITextureSource(){} + ITextureSource() = default; + + virtual ~ITextureSource() = default; + 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; + const std::string &name, u32 *id = nullptr)=0; virtual video::ITexture* getTextureForMesh( - const std::string &name, u32 *id = NULL) = 0; - virtual IrrlichtDevice* getDevice()=0; + const std::string &name, u32 *id = nullptr) = 0; + /*! + * Returns a palette from the given texture name. + * The pointer is valid until the texture source is + * destructed. + * Should be called from the main thread. + */ + virtual Palette* getPalette(const std::string &name) = 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; virtual video::SColor getTextureAverageColor(const std::string &name)=0; virtual video::ITexture *getShaderFlagsTexture(bool normalmap_present)=0; @@ -118,17 +112,16 @@ class ITextureSource : public ISimpleTextureSource class IWritableTextureSource : public ITextureSource { public: - IWritableTextureSource(){} - virtual ~IWritableTextureSource(){} + IWritableTextureSource() = default; + + virtual ~IWritableTextureSource() = default; + 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; + const std::string &name, u32 *id = nullptr)=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; @@ -138,10 +131,10 @@ class IWritableTextureSource : public ITextureSource virtual video::ITexture *getShaderFlagsTexture(bool normalmap_present)=0; }; -IWritableTextureSource* createTextureSource(IrrlichtDevice *device); +IWritableTextureSource *createTextureSource(); -#ifdef __ANDROID__ -video::IImage * Align2Npot2(video::IImage * image, video::IVideoDriver* driver); +#if ENABLE_GLES +video::IImage *Align2Npot2(video::IImage *image, video::IVideoDriver *driver); #endif enum MaterialType{ @@ -150,7 +143,13 @@ enum MaterialType{ TILE_MATERIAL_LIQUID_TRANSPARENT, TILE_MATERIAL_LIQUID_OPAQUE, TILE_MATERIAL_WAVING_LEAVES, - TILE_MATERIAL_WAVING_PLANTS + TILE_MATERIAL_WAVING_PLANTS, + TILE_MATERIAL_OPAQUE, + TILE_MATERIAL_WAVING_LIQUID_BASIC, + TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT, + TILE_MATERIAL_WAVING_LIQUID_OPAQUE, + TILE_MATERIAL_PLAIN, + TILE_MATERIAL_PLAIN_ALPHA }; // Material flags @@ -162,7 +161,7 @@ enum MaterialType{ // Ignored if MATERIAL_FLAG_CRACK is not set. #define MATERIAL_FLAG_CRACK_OVERLAY 0x04 #define MATERIAL_FLAG_ANIMATION 0x08 -#define MATERIAL_FLAG_HIGHLIGHTED 0x10 +//#define MATERIAL_FLAG_HIGHLIGHTED 0x10 #define MATERIAL_FLAG_TILEABLE_HORIZONTAL 0x20 #define MATERIAL_FLAG_TILEABLE_VERTICAL 0x40 @@ -172,81 +171,67 @@ enum MaterialType{ */ struct FrameSpec { - FrameSpec(): - texture_id(0), - texture(NULL), - normal_texture(NULL), - flags_texture(NULL) - { - } - u32 texture_id; - video::ITexture *texture; - video::ITexture *normal_texture; - video::ITexture *flags_texture; + FrameSpec() = default; + + u32 texture_id = 0; + video::ITexture *texture = nullptr; + video::ITexture *normal_texture = nullptr; + video::ITexture *flags_texture = nullptr; }; -struct TileSpec +#define MAX_TILE_LAYERS 2 + +//! Defines a layer of a tile. +struct TileLayer { - TileSpec(): - texture_id(0), - texture(NULL), - normal_texture(NULL), - flags_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), - rotation(0) - { - } + TileLayer() = default; - bool operator==(const TileSpec &other) const + /*! + * Two layers are equal if they can be merged. + */ + bool operator==(const TileLayer &other) const { - return ( + return texture_id == other.texture_id && - /* texture == other.texture && */ - alpha == other.alpha && material_type == other.material_type && material_flags == other.material_flags && - rotation == other.rotation - ); + color == other.color && + scale == other.scale; } - bool operator!=(const TileSpec &other) const + /*! + * Two tiles are not equal if they must have different vertices. + */ + bool operator!=(const TileLayer &other) const { return !(*this == other); } - + // Sets everything else except the texture in the material void applyMaterialOptions(video::SMaterial &material) const { 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_OPAQUE: case TILE_MATERIAL_LIQUID_OPAQUE: + case TILE_MATERIAL_WAVING_LIQUID_OPAQUE: material.MaterialType = video::EMT_SOLID; break; + case TILE_MATERIAL_BASIC: case TILE_MATERIAL_WAVING_LEAVES: - material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF; - break; case TILE_MATERIAL_WAVING_PLANTS: + case TILE_MATERIAL_WAVING_LIQUID_BASIC: + material.MaterialTypeParam = 0.5; material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF; break; + case TILE_MATERIAL_ALPHA: + case TILE_MATERIAL_LIQUID_TRANSPARENT: + case TILE_MATERIAL_WAVING_LIQUID_TRANSPARENT: + material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; + break; + default: + break; } - material.BackfaceCulling = (material_flags & MATERIAL_FLAG_BACKFACE_CULLING) - ? true : false; + material.BackfaceCulling = (material_flags & MATERIAL_FLAG_BACKFACE_CULLING) != 0; if (!(material_flags & MATERIAL_FLAG_TILEABLE_HORIZONTAL)) { material.TextureLayer[0].TextureWrapU = video::ETC_CLAMP_TO_EDGE; } @@ -257,8 +242,7 @@ struct TileSpec void applyMaterialOptionsWithShaders(video::SMaterial &material) const { - material.BackfaceCulling = (material_flags & MATERIAL_FLAG_BACKFACE_CULLING) - ? true : false; + material.BackfaceCulling = (material_flags & MATERIAL_FLAG_BACKFACE_CULLING) != 0; if (!(material_flags & MATERIAL_FLAG_TILEABLE_HORIZONTAL)) { material.TextureLayer[0].TextureWrapU = video::ETC_CLAMP_TO_EDGE; material.TextureLayer[1].TextureWrapU = video::ETC_CLAMP_TO_EDGE; @@ -268,23 +252,77 @@ struct TileSpec material.TextureLayer[1].TextureWrapV = video::ETC_CLAMP_TO_EDGE; } } - - u32 texture_id; - video::ITexture *texture; - video::ITexture *normal_texture; - video::ITexture *flags_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::vector frames; - - u8 rotation; + + bool isTileable() const + { + return (material_flags & MATERIAL_FLAG_TILEABLE_HORIZONTAL) + && (material_flags & MATERIAL_FLAG_TILEABLE_VERTICAL); + } + + // Ordered for size, please do not reorder + + video::ITexture *texture = nullptr; + video::ITexture *normal_texture = nullptr; + video::ITexture *flags_texture = nullptr; + + u32 shader_id = 0; + + u32 texture_id = 0; + + u16 animation_frame_length_ms = 0; + u16 animation_frame_count = 1; + + u8 material_type = TILE_MATERIAL_BASIC; + u8 material_flags = + //0 // <- DEBUG, Use the one below + MATERIAL_FLAG_BACKFACE_CULLING | + MATERIAL_FLAG_TILEABLE_HORIZONTAL| + MATERIAL_FLAG_TILEABLE_VERTICAL; + + //! If true, the tile has its own color. + bool has_color = false; + + std::vector *frames = nullptr; + + /*! + * The color of the tile, or if the tile does not own + * a color then the color of the node owning this tile. + */ + video::SColor color; + + u8 scale; +}; + +/*! + * Defines a face of a node. May have up to two layers. + */ +struct TileSpec +{ + TileSpec() = default; + + /*! + * Returns true if this tile can be merged with the other tile. + */ + bool isTileable(const TileSpec &other) const { + for (int layer = 0; layer < MAX_TILE_LAYERS; layer++) { + if (layers[layer] != other.layers[layer]) + return false; + if (!layers[layer].isTileable()) + return false; + } + return rotation == 0 + && rotation == other.rotation + && emissive_light == other.emissive_light; + } + + //! If true, the tile rotation is ignored. + bool world_aligned = false; + //! Tile rotation. + u8 rotation = 0; + //! This much light does the tile emit. + u8 emissive_light = 0; + //! The first is base texture, the second is overlay. + TileLayer layers[MAX_TILE_LAYERS]; }; -#endif + +std::vector getTextureDirs();