Merge with -r 22620:23107.
[blender.git] / source / blender / makesrna / intern / rna_material_api.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2009 Blender Foundation.
21  * All rights reserved.
22  *
23  * 
24  * Contributor(s): Blender Foundation
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #include <stdlib.h>
30 #include <stdio.h>
31
32 #include "RNA_define.h"
33 #include "RNA_types.h"
34
35 #include "DNA_material_types.h"
36
37 #ifdef RNA_RUNTIME
38
39 #include "BKE_material.h"
40 #include "BKE_texture.h"
41
42 /*
43   Adds material to the first free texture slot.
44   If all slots are busy, replaces the first.
45 */
46 static void rna_Material_add_texture(Material *ma, Tex *tex, int mapto, int texco)
47 {
48         int i;
49         MTex *mtex;
50         int slot= -1;
51
52         for (i= 0; i < MAX_MTEX; i++) {
53                 if (!ma->mtex[i]) {
54                         slot= i;
55                         break;
56                 }
57         }
58
59         if (slot == -1)
60                 slot= 0;
61
62         if (ma->mtex[slot]) {
63                 ma->mtex[slot]->tex->id.us--;
64         }
65         else {
66                 ma->mtex[slot]= add_mtex();
67         }
68
69         mtex= ma->mtex[slot];
70
71         mtex->tex= tex;
72         id_us_plus(&tex->id);
73
74         mtex->texco= mapto;
75         mtex->mapto= texco;
76 }
77
78 #else
79
80 void RNA_api_material(StructRNA *srna)
81 {
82         FunctionRNA *func;
83         PropertyRNA *parm;
84
85         /* copied from rna_def_material_mtex (rna_material.c) */
86         static EnumPropertyItem prop_texture_coordinates_items[] = {
87                 {TEXCO_GLOB, "GLOBAL", 0, "Global", "Uses global coordinates for the texture coordinates."},
88                 {TEXCO_OBJECT, "OBJECT", 0, "Object", "Uses linked object's coordinates for texture coordinates."},
89                 {TEXCO_UV, "UV", 0, "UV", "Uses UV coordinates for texture coordinates."},
90                 {TEXCO_ORCO, "ORCO", 0, "Generated", "Uses the original undeformed coordinates of the object."},
91                 {TEXCO_STRAND, "STRAND", 0, "Strand", "Uses normalized strand texture coordinate (1D)."},
92                 {TEXCO_STICKY, "STICKY", 0, "Sticky", "Uses mesh's sticky coordinates for the texture coordinates."},
93                 {TEXCO_WINDOW, "WINDOW", 0, "Window", "Uses screen coordinates as texture coordinates."},
94                 {TEXCO_NORM, "NORMAL", 0, "Normal", "Uses normal vector as texture coordinates."},
95                 {TEXCO_REFL, "REFLECTION", 0, "Reflection", "Uses reflection vector as texture coordinates."},
96                 {TEXCO_STRESS, "STRESS", 0, "Stress", "Uses the difference of edge lengths compared to original coordinates of the mesh."},
97                 {TEXCO_TANGENT, "TANGENT", 0, "Tangent", "Uses the optional tangent vector as texture coordinates."},
98
99                 {0, NULL, 0, NULL, NULL}};
100
101         static EnumPropertyItem prop_texture_mapto_items[] = {
102                 {MAP_COL, "COLOR", 0, "Color", "Causes the texture to affect basic color of the material"},
103                 {MAP_NORM, "NORMAL", 0, "Normal", "Causes the texture to affect the rendered normal"},
104                 {MAP_COLSPEC, "SPECULAR_COLOR", 0, "Specularity Color", "Causes the texture to affect the specularity color"},
105                 {MAP_COLMIR, "MIRROR", 0, "Mirror", "Causes the texture to affect the mirror color"},
106                 {MAP_REF, "REFLECTION", 0, "Reflection", "Causes the texture to affect the value of the materials reflectivity"},
107                 {MAP_SPEC, "SPECULARITY", 0, "Specularity", "Causes the texture to affect the value of specularity"},
108                 {MAP_EMIT, "EMIT", 0, "Emit", "Causes the texture to affect the emit value"},
109                 {MAP_ALPHA, "ALPHA", 0, "Alpha", "Causes the texture to affect the alpha value"},
110                 {MAP_HAR, "HARDNESS", 0, "Hardness", "Causes the texture to affect the hardness value"},
111                 {MAP_RAYMIRR, "RAY_MIRROR", 0, "Ray-Mirror", "Causes the texture to affect the ray-mirror value"},
112                 {MAP_TRANSLU, "TRANSLUCENCY", 0, "Translucency", "Causes the texture to affect the translucency value"},
113                 {MAP_AMB, "AMBIENT", 0, "Ambient", "Causes the texture to affect the value of ambient"},
114                 {MAP_DISPLACE, "DISPLACEMENT", 0, "Displacement", "Let the texture displace the surface"},
115                 {MAP_WARP, "WARP", 0, "Warp", "Let the texture warp texture coordinates of next channels"},
116                 {0, NULL, 0, NULL, NULL}};
117
118         func= RNA_def_function(srna, "add_texture", "rna_Material_add_texture");
119         RNA_def_function_ui_description(func, "Add a texture to material's free texture slot.");
120         parm= RNA_def_pointer(func, "texture", "Texture", "", "Texture to add.");
121         parm= RNA_def_enum(func, "texture_coordinates", prop_texture_coordinates_items, TEXCO_UV, "", "Source of texture coordinate information."); /* optional */
122         parm= RNA_def_enum(func, "map_to", prop_texture_mapto_items, MAP_COL, "", "Controls which material property the texture affects."); /* optional */
123 }
124
125 #endif
126