1 // unstable
2 #define DWG_TYPE DWG_TYPE_MATERIAL
3 #include "common.c"
4
5 void
6 api_process (dwg_object *obj)
7 {
8 int error, isnew;
9 BITCODE_T name;
10 BITCODE_T description;
11 Dwg_MATERIAL_color ambient_color;
12 Dwg_MATERIAL_color diffuse_color;
13 Dwg_MATERIAL_mapper diffusemap;
14 BITCODE_BD specular_gloss_factor;
15 Dwg_MATERIAL_color specular_color;
16 Dwg_MATERIAL_mapper specularmap;
17 Dwg_MATERIAL_mapper reflectionmap;
18 BITCODE_BD opacity_percent;
19 Dwg_MATERIAL_mapper opacitymap;
20 Dwg_MATERIAL_mapper bumpmap;
21 BITCODE_BD refraction_index;
22 Dwg_MATERIAL_mapper refractionmap;
23 BITCODE_BD color_bleed_scale;
24 BITCODE_BD indirect_bump_scale;
25 BITCODE_BD reflectance_scale;
26 BITCODE_BD transmittance_scale;
27 BITCODE_B two_sided_material;
28 BITCODE_BD luminance;
29 BITCODE_BS luminance_mode;
30 BITCODE_BD translucence;
31 BITCODE_BD self_illumination;
32 BITCODE_BD reflectivity;
33 BITCODE_BL illumination_model;
34 BITCODE_BL channel_flags;
35 BITCODE_BL mode;
36 BITCODE_T genprocname;
37 BITCODE_BS genproctype;
38
39 Dwg_Version_Type dwg_version = obj->parent->header.version;
40 dwg_obj_material *_obj = dwg_object_to_MATERIAL (obj);
41
42 CHK_ENTITY_UTF8TEXT (_obj, MATERIAL, name);
43 CHK_ENTITY_UTF8TEXT (_obj, MATERIAL, description);
44
45 #define CHK_MATERIAL_COLOR(ambient_color) \
46 if (!dwg_dynapi_entity_value (_obj, "MATERIAL", #ambient_color, \
47 &ambient_color, NULL)) \
48 fail (#ambient_color); \
49 CHK_SUBCLASS_TYPE (ambient_color, MATERIAL_color, flag, RC); \
50 CHK_SUBCLASS_TYPE (ambient_color, MATERIAL_color, factor, BD); \
51 if (ambient_color.flag == 1) \
52 CHK_SUBCLASS_TYPE (ambient_color, MATERIAL_color, rgb, BLx)
53
54 CHK_MATERIAL_COLOR (ambient_color);
55 CHK_MATERIAL_COLOR (diffuse_color);
56
57 #define CHK_MATERIAL_MAP(diffusemap) \
58 if (!dwg_dynapi_entity_value (_obj, "MATERIAL", #diffusemap, &diffusemap, \
59 NULL)) \
60 fail (#diffusemap); \
61 CHK_SUBCLASS_TYPE (diffusemap, MATERIAL_mapper, blendfactor, BD); \
62 CHK_SUBCLASS_TYPE (diffusemap, MATERIAL_mapper, projection, RC); \
63 CHK_SUBCLASS_TYPE (diffusemap, MATERIAL_mapper, tiling, RC); \
64 CHK_SUBCLASS_TYPE (diffusemap, MATERIAL_mapper, autotransform, RC); \
65 CHK_SUBCLASS_VECTOR_TYPE (diffusemap, MATERIAL_mapper, transmatrix, 16, \
66 BD); \
67 CHK_SUBCLASS_TYPE (diffusemap, MATERIAL_mapper, source, RC); \
68 if (diffusemap.source == 1) \
69 CHK_SUBCLASS_UTF8TEXT (diffusemap, MATERIAL_mapper, filename); \
70 if (diffusemap.source == 2) \
71 { \
72 CHK_SUBCLASS_TYPE (diffusemap, MATERIAL_mapper, texturemode, BS); \
73 if (diffusemap.texturemode < 2) /* not procedural */ \
74 { \
75 CHK_SUBCLASS_TYPE (diffusemap.color1, MATERIAL_color, flag, RC); \
76 CHK_SUBCLASS_TYPE (diffusemap.color1, MATERIAL_color, factor, BD); \
77 if (_obj->diffusemap.color1.flag == 1) \
78 CHK_SUBCLASS_TYPE (diffusemap.color1, MATERIAL_color, rgb, BLx); \
79 CHK_SUBCLASS_TYPE (diffusemap.color2, MATERIAL_color, flag, RC); \
80 CHK_SUBCLASS_TYPE (diffusemap.color2, MATERIAL_color, factor, BD); \
81 if (_obj->diffusemap.color2.flag == 1) \
82 CHK_SUBCLASS_TYPE (diffusemap.color2, MATERIAL_color, rgb, BLx); \
83 } \
84 else \
85 { \
86 CHK_ENTITY_TYPE (_obj, MATERIAL, genproctype, BS); \
87 /* TODO procedural...*/ \
88 } \
89 }
90
91 CHK_MATERIAL_MAP (diffusemap)
92 CHK_MATERIAL_COLOR (specular_color);
93 CHK_ENTITY_TYPE (_obj, MATERIAL, specular_gloss_factor, BD);
94 CHK_MATERIAL_MAP (specularmap)
95 CHK_MATERIAL_MAP (reflectionmap)
96 CHK_ENTITY_TYPE (_obj, MATERIAL, opacity_percent, BD);
97 CHK_MATERIAL_MAP (opacitymap)
98 CHK_MATERIAL_MAP (bumpmap)
99 CHK_ENTITY_TYPE (_obj, MATERIAL, refraction_index, BD);
100 CHK_MATERIAL_MAP (refractionmap)
101
102 #if 0
103 CHK_ENTITY_TYPE (_obj, MATERIAL, color_bleed_scale, BD);
104 CHK_ENTITY_TYPE (_obj, MATERIAL, indirect_bump_scale, BD);
105 CHK_ENTITY_TYPE (_obj, MATERIAL, reflectance_scale, BD);
106 CHK_ENTITY_TYPE (_obj, MATERIAL, transmittance_scale, BD);
107 CHK_ENTITY_TYPE (_obj, MATERIAL, two_sided_material, B);
108 CHK_ENTITY_TYPE (_obj, MATERIAL, luminance, BD);
109 CHK_ENTITY_TYPE (_obj, MATERIAL, luminance_mode, BS);
110 CHK_ENTITY_TYPE (_obj, MATERIAL, normalmap_method, BS);
111 CHK_ENTITY_TYPE (_obj, MATERIAL, normalmap_strength, BD);
112 CHK_ENTITY_TYPE (_obj, MATERIAL, normalmap_source, BS);
113 CHK_ENTITY_UTF8TEXT (_obj, MATERIAL, normalmap_filename);
114 CHK_ENTITY_TYPE (_obj, MATERIAL, normalmap_blendfactor, BD);
115 CHK_ENTITY_TYPE (_obj, MATERIAL, normalmap_projection, BS);
116 CHK_ENTITY_TYPE (_obj, MATERIAL, normalmap_tiling, BS);
117 CHK_ENTITY_TYPE (_obj, MATERIAL, normalmap_autotransform, BS);
118 if (!dwg_dynapi_entity_value (_obj, "MATERIAL", "normalmap_transmatrix",
119 &normalmap_transmatrix, NULL) || !normalmap_transmatrix)
120 fail ("MATERIAL.normalmap_transmatrix");
121 else
122 for (int i = 0; i < 16; i++)
123 {
124 ok ("MATERIAL.normalmap_transmatrix[%d]: %f", i,
125 normalmap_transmatrix[i]);
126 }
127 CHK_ENTITY_TYPE (_obj, MATERIAL, is_anonymous, B);
128 CHK_ENTITY_TYPE (_obj, MATERIAL, global_illumination_mode, BS, global_illumination);
129 CHK_ENTITY_TYPE (_obj, MATERIAL, final_gather_mode, BS, final_gather);
130 CHK_ENTITY_UTF8TEXT (_obj, MATERIAL, genprocname);
131 CHK_ENTITY_TYPE (_obj, MATERIAL, genprocvalbool, B);
132 CHK_ENTITY_TYPE (_obj, MATERIAL, genprocvalint, BS);
133 CHK_ENTITY_TYPE (_obj, MATERIAL, genprocvalreal, BD);
134 CHK_ENTITY_UTF8TEXT (_obj, MATERIAL, genprocvaltext);
135 CHK_ENTITY_TYPE (_obj, MATERIAL, genproctableend, B);
136 CHK_ENTITY_CMC (_obj, MATERIAL, genprocvalcolorindex);
137 CHK_ENTITY_TYPE (_obj, MATERIAL, genprocvalcolorrgb, BS);
138 CHK_ENTITY_UTF8TEXT (_obj, MATERIAL, genprocvalcolorname);
139 #endif
140
141 SINCE (R_2007)
142 {
143 CHK_ENTITY_TYPE (_obj, MATERIAL, translucence, BD);
144 CHK_ENTITY_TYPE (_obj, MATERIAL, self_illumination, BD);
145 CHK_ENTITY_TYPE (_obj, MATERIAL, reflectivity, BD);
146 CHK_ENTITY_TYPE (_obj, MATERIAL, illumination_model, BL);
147 CHK_ENTITY_TYPE (_obj, MATERIAL, channel_flags, BL);
148 CHK_ENTITY_TYPE (_obj, MATERIAL, mode, BL);
149 }
150 }