material.h
1 /*************************************************************************/
2 /* material.h */
3 /*************************************************************************/
4 /* This file is part of: */
5 /* GODOT ENGINE */
6 /* http://www.godotengine.org */
7 /*************************************************************************/
8 /* Copyright (c) 2007-2016 Juan Linietsky, Ariel Manzur. */
9 /* */
10 /* Permission is hereby granted, free of charge, to any person obtaining */
11 /* a copy of this software and associated documentation files (the */
12 /* "Software"), to deal in the Software without restriction, including */
13 /* without limitation the rights to use, copy, modify, merge, publish, */
14 /* distribute, sublicense, and/or sell copies of the Software, and to */
15 /* permit persons to whom the Software is furnished to do so, subject to */
16 /* the following conditions: */
17 /* */
18 /* The above copyright notice and this permission notice shall be */
19 /* included in all copies or substantial portions of the Software. */
20 /* */
21 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
22 /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
23 /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
24 /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
25 /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
26 /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
27 /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
28 /*************************************************************************/
29 #ifndef MATERIAL_H
30 #define MATERIAL_H
31 
32 #include "servers/visual_server.h"
33 #include "scene/resources/texture.h"
34 #include "scene/resources/shader.h"
35 #include "resource.h"
36 #include "servers/visual/shader_language.h"
37 
42 class Material : public Resource {
43 
44  OBJ_TYPE(Material,Resource);
45  RES_BASE_EXTENSION("mtl");
46  OBJ_SAVE_TYPE( Material );
47 
48 public:
49 
50  enum Flag {
51  FLAG_VISIBLE = VS::MATERIAL_FLAG_VISIBLE,
52  FLAG_DOUBLE_SIDED = VS::MATERIAL_FLAG_DOUBLE_SIDED,
53  FLAG_INVERT_FACES = VS::MATERIAL_FLAG_INVERT_FACES,
54  FLAG_UNSHADED = VS::MATERIAL_FLAG_UNSHADED,
55  FLAG_ONTOP = VS::MATERIAL_FLAG_ONTOP,
56  FLAG_LIGHTMAP_ON_UV2 = VS::MATERIAL_FLAG_LIGHTMAP_ON_UV2,
57  FLAG_COLOR_ARRAY_SRGB = VS::MATERIAL_FLAG_COLOR_ARRAY_SRGB,
58  FLAG_MAX = VS::MATERIAL_FLAG_MAX
59  };
60 
61  enum BlendMode {
62  BLEND_MODE_MIX = VS::MATERIAL_BLEND_MODE_MIX,
63  BLEND_MODE_MUL = VS::MATERIAL_BLEND_MODE_MUL,
64  BLEND_MODE_ADD = VS::MATERIAL_BLEND_MODE_ADD,
65  BLEND_MODE_SUB = VS::MATERIAL_BLEND_MODE_SUB,
66  BLEND_MODE_PREMULT_ALPHA = VS::MATERIAL_BLEND_MODE_PREMULT_ALPHA,
67 
68  };
69 
70  enum DepthDrawMode {
71  DEPTH_DRAW_ALWAYS = VS::MATERIAL_DEPTH_DRAW_ALWAYS,
72  DEPTH_DRAW_OPAQUE_ONLY = VS::MATERIAL_DEPTH_DRAW_OPAQUE_ONLY,
73  DEPTH_DRAW_OPAQUE_PRE_PASS_ALPHA = VS::MATERIAL_DEPTH_DRAW_OPAQUE_PRE_PASS_ALPHA,
74  DEPTH_DRAW_NEVER = VS::MATERIAL_DEPTH_DRAW_NEVER
75  };
76 
77 
78 
79 private:
80  BlendMode blend_mode;
81  bool flags[VS::MATERIAL_FLAG_MAX];
82  float line_width;
83  DepthDrawMode depth_draw_mode;
84 protected:
85  RID material;
86 
87  static void _bind_methods();
88 
89 public:
90  void set_flag(Flag p_flag,bool p_enabled);
91  bool get_flag(Flag p_flag) const;
92 
93  void set_blend_mode(BlendMode p_blend_mode);
94  BlendMode get_blend_mode() const;
95 
96  void set_depth_draw_mode(DepthDrawMode p_depth_draw_mode);
97  DepthDrawMode get_depth_draw_mode() const;
98 
99  void set_line_width(float p_width);
100  float get_line_width() const;
101 
102  virtual RID get_rid() const;
103 
104  Material(const RID& p_rid=RID());
105  virtual ~Material();
106 };
107 
108 VARIANT_ENUM_CAST( Material::Flag );
109 VARIANT_ENUM_CAST( Material::DepthDrawMode );
110 
111 VARIANT_ENUM_CAST( Material::BlendMode );
112 
113 
114 class FixedMaterial : public Material {
115 
116  OBJ_TYPE( FixedMaterial, Material );
117  REVERSE_GET_PROPERTY_LIST
118 public:
119 
120  enum Parameter {
121  PARAM_DIFFUSE=VS::FIXED_MATERIAL_PARAM_DIFFUSE,
122  PARAM_DETAIL=VS::FIXED_MATERIAL_PARAM_DETAIL,
123  PARAM_SPECULAR=VS::FIXED_MATERIAL_PARAM_SPECULAR,
124  PARAM_EMISSION=VS::FIXED_MATERIAL_PARAM_EMISSION,
125  PARAM_SPECULAR_EXP=VS::FIXED_MATERIAL_PARAM_SPECULAR_EXP,
126  PARAM_GLOW=VS::FIXED_MATERIAL_PARAM_GLOW,
127  PARAM_NORMAL=VS::FIXED_MATERIAL_PARAM_NORMAL,
128  PARAM_SHADE_PARAM=VS::FIXED_MATERIAL_PARAM_SHADE_PARAM,
129  PARAM_MAX=VS::FIXED_MATERIAL_PARAM_MAX
130  };
131 
132 
133  enum TexCoordMode {
134 
135  TEXCOORD_UV=VS::FIXED_MATERIAL_TEXCOORD_UV,
136  TEXCOORD_UV_TRANSFORM=VS::FIXED_MATERIAL_TEXCOORD_UV_TRANSFORM,
137  TEXCOORD_UV2=VS::FIXED_MATERIAL_TEXCOORD_UV2,
138  TEXCOORD_SPHERE=VS::FIXED_MATERIAL_TEXCOORD_SPHERE
139  };
140 
141  enum FixedFlag {
142  FLAG_USE_ALPHA=VS::FIXED_MATERIAL_FLAG_USE_ALPHA,
143  FLAG_USE_COLOR_ARRAY=VS::FIXED_MATERIAL_FLAG_USE_COLOR_ARRAY,
144  FLAG_USE_POINT_SIZE=VS::FIXED_MATERIAL_FLAG_USE_POINT_SIZE,
145  FLAG_DISCARD_ALPHA=VS::FIXED_MATERIAL_FLAG_DISCARD_ALPHA,
146  FLAG_USE_XY_NORMALMAP=VS::FIXED_MATERIAL_FLAG_USE_XY_NORMALMAP,
147  FLAG_MAX=VS::FIXED_MATERIAL_FLAG_MAX
148  };
149 
150  enum LightShader {
151 
152  LIGHT_SHADER_LAMBERT=VS::FIXED_MATERIAL_LIGHT_SHADER_LAMBERT,
153  LIGHT_SHADER_WRAP=VS::FIXED_MATERIAL_LIGHT_SHADER_WRAP,
154  LIGHT_SHADER_VELVET=VS::FIXED_MATERIAL_LIGHT_SHADER_VELVET,
155  LIGHT_SHADER_TOON=VS::FIXED_MATERIAL_LIGHT_SHADER_TOON
156  };
157 
158 private:
159 
160 
161  struct Node {
162 
163  int param;
164  int mult;
165  int tex;
166  };
167 
168  Variant param[PARAM_MAX];
169  Ref<Texture> texture_param[PARAM_MAX];
170  TexCoordMode texture_texcoord[PARAM_MAX];
171  LightShader light_shader;
172  bool fixed_flags[FLAG_MAX];
173  float point_size;
174 
175 
176  Transform uv_transform;
177 
178 protected:
179 
180 
181  static void _bind_methods();
182 
183 
184 public:
185 
186  void set_fixed_flag(FixedFlag p_flag, bool p_value);
187  bool get_fixed_flag(FixedFlag p_flag) const;
188 
189  void set_parameter(Parameter p_parameter, const Variant& p_value);
190  Variant get_parameter(Parameter p_parameter) const;
191 
192  void set_texture(Parameter p_parameter, Ref<Texture> p_texture);
193  Ref<Texture> get_texture(Parameter p_parameter) const;
194 
195  void set_texcoord_mode(Parameter p_parameter, TexCoordMode p_mode);
196  TexCoordMode get_texcoord_mode(Parameter p_parameter) const;
197 
198  void set_light_shader(LightShader p_shader);
199  LightShader get_light_shader() const;
200 
201  void set_uv_transform(const Transform& p_transform);
202  Transform get_uv_transform() const;
203 
204  void set_point_size(float p_transform);
205  float get_point_size() const;
206 
207  FixedMaterial();
208  ~FixedMaterial();
209 
210 };
211 
212 
213 
214 VARIANT_ENUM_CAST( FixedMaterial::Parameter );
215 VARIANT_ENUM_CAST( FixedMaterial::TexCoordMode );
216 VARIANT_ENUM_CAST( FixedMaterial::FixedFlag );
217 VARIANT_ENUM_CAST( FixedMaterial::LightShader );
218 
219 class ShaderMaterial : public Material {
220 
221  OBJ_TYPE( ShaderMaterial, Material );
222 
223  Ref<Shader> shader;
224 
225 
226 
227  void _shader_changed();
228  static void _shader_parse(void*p_self,ShaderLanguage::ProgramNode*p_node);
229 
230 protected:
231 
232  bool _set(const StringName& p_name, const Variant& p_value);
233  bool _get(const StringName& p_name,Variant &r_ret) const;
234  void _get_property_list( List<PropertyInfo> *p_list) const;
235 
236  static void _bind_methods();
237 
238 public:
239 
240  void set_shader(const Ref<Shader>& p_shader);
241  Ref<Shader> get_shader() const;
242 
243  void set_shader_param(const StringName& p_param,const Variant& p_value);
244  Variant get_shader_param(const StringName& p_param) const;
245 
246  void get_argument_options(const StringName& p_function,int p_idx,List<String>*r_options) const;
247 
248  ShaderMaterial();
249 };
250 
252 
253 
254 
255 
256 
257 
258 #endif
Definition: variant.h:74
Definition: string_db.h:48
Definition: transform.h:38
Definition: material.h:219
Definition: resource.h:89
Definition: material.h:42
Definition: material.h:114
Definition: rid.h:47