]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/tile.h
Decoration: Change divlen to sidelen
[dragonfireclient.git] / src / tile.h
index 1211569bc1ae48f923a94602fbc75831ea12a9cc..531a93172894a3639f33fdcf95a9874b677b8d1e 100644 (file)
@@ -1,6 +1,6 @@
 /*
-Minetest-c55
-Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -20,9 +20,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #ifndef TILE_HEADER
 #define TILE_HEADER
 
-#include "common_irrlicht.h"
+#include "irrlichttypes.h"
+#include "irr_v2d.h"
+#include "irr_v3d.h"
+#include <ITexture.h>
+#include <IrrlichtDevice.h>
 #include "threads.h"
-#include "utility.h"
 #include <string>
 
 class IGameDef;
@@ -31,6 +34,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.
@@ -58,6 +72,14 @@ struct AtlasPointer
        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,
@@ -120,6 +142,7 @@ class ITextureSource
        virtual IrrlichtDevice* getDevice()
                {return NULL;}
        virtual void updateAP(AtlasPointer &ap){};
+       virtual bool isKnownSourceImage(const std::string &name)=0;
 };
 
 class IWritableTextureSource : public ITextureSource
@@ -138,6 +161,7 @@ class IWritableTextureSource : public ITextureSource
        virtual IrrlichtDevice* getDevice()
                {return NULL;}
        virtual void updateAP(AtlasPointer &ap){};
+       virtual bool isKnownSourceImage(const std::string &name)=0;
 
        virtual void processQueue()=0;
        virtual void insertSourceImage(const std::string &name, video::IImage *img)=0;
@@ -148,10 +172,10 @@ class IWritableTextureSource : public ITextureSource
 IWritableTextureSource* createTextureSource(IrrlichtDevice *device);
 
 enum MaterialType{
-       MATERIAL_ALPHA_NONE,
-       MATERIAL_ALPHA_VERTEX,
-       MATERIAL_ALPHA_SIMPLE, // >127 = opaque
-       MATERIAL_ALPHA_BLEND,
+       TILE_MATERIAL_BASIC,
+       TILE_MATERIAL_ALPHA,
+       TILE_MATERIAL_LIQUID_TRANSPARENT,
+       TILE_MATERIAL_LIQUID_OPAQUE,
 };
 
 // Material flags
@@ -162,6 +186,11 @@ enum MaterialType{
 // Should the crack be drawn on transparent pixels (unset) or not (set)?
 // Ignored if MATERIAL_FLAG_CRACK is not set.
 #define MATERIAL_FLAG_CRACK_OVERLAY 0x04
+// 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_
 
 /*
        This fully defines the looks of a tile.
@@ -172,13 +201,13 @@ struct TileSpec
        TileSpec():
                texture(0),
                alpha(255),
-               //material_type(MATERIAL_ALPHA_NONE),
-               // Use this so that leaves don't need a separate material
-               material_type(MATERIAL_ALPHA_SIMPLE),
+               material_type(TILE_MATERIAL_BASIC),
                material_flags(
                        //0 // <- DEBUG, Use the one below
                        MATERIAL_FLAG_BACKFACE_CULLING
-               )
+               ),
+               animation_frame_count(1),
+               animation_frame_length_ms(0)
        {
        }
 
@@ -188,7 +217,8 @@ struct TileSpec
                        texture == other.texture &&
                        alpha == other.alpha &&
                        material_type == other.material_type &&
-                       material_flags == other.material_flags
+                       material_flags == other.material_flags &&
+                       rotation == other.rotation
                );
        }
 
@@ -200,20 +230,41 @@ struct TileSpec
        // Sets everything else except the texture in the material
        void applyMaterialOptions(video::SMaterial &material) const
        {
-               if(alpha != 255 && material_type != MATERIAL_ALPHA_VERTEX)
-                       dstream<<"WARNING: TileSpec: alpha != 255 "
-                                       "but not MATERIAL_ALPHA_VERTEX"
-                                       <<std::endl;
-
-               if(material_type == MATERIAL_ALPHA_NONE)
-                       material.MaterialType = video::EMT_SOLID;
-               else if(material_type == MATERIAL_ALPHA_VERTEX)
-                       material.MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
-               else if(material_type == MATERIAL_ALPHA_SIMPLE)
+               switch(material_type){
+               case TILE_MATERIAL_BASIC:
                        material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
-               else if(material_type == MATERIAL_ALPHA_BLEND)
+                       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 video::E_MATERIAL_TYPE &alpha) const
+       {
+               switch(material_type){
+               case TILE_MATERIAL_BASIC:
+                       material.MaterialType = basic;
+                       break;
+               case TILE_MATERIAL_ALPHA:
+                       material.MaterialType = alpha;
+                       break;
+               case TILE_MATERIAL_LIQUID_TRANSPARENT:
+                       material.MaterialType = liquid;
+                       break;
+               case TILE_MATERIAL_LIQUID_OPAQUE:
+                       material.MaterialType = liquid;
+                       break;
+               }
                material.BackfaceCulling = (material_flags & MATERIAL_FLAG_BACKFACE_CULLING) ? true : false;
        }
        
@@ -225,12 +276,15 @@ struct TileSpec
        }
        
        AtlasPointer texture;
-       // Vertex alpha
+       // Vertex alpha (when MATERIAL_ALPHA_VERTEX is used)
        u8 alpha;
-       // Material type
+       // Material parameters
        u8 material_type;
-       // Material flags
        u8 material_flags;
+       // Animation parameters
+       u8 animation_frame_count;
+       u16 animation_frame_length_ms;
+       u8 rotation;
 };
 
 #endif