-
Notifications
You must be signed in to change notification settings - Fork 0
/
BlenderMtlCreator.cs
177 lines (140 loc) · 5.58 KB
/
BlenderMtlCreator.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
using System;
using Gtk;
using System.IO;
using System.Text;
using System.Collections.Generic;
using Vray;
namespace VrayMat2Blender
{
public class BlenderMtlCreator
{
private String tabs = String.Empty;
public BlenderMtlCreator ()
{
}
public String CreateScript(VrScene scene){
String mtlType = String.Empty;
String mtlName = String.Empty;
Dictionary<string, System.Object> mtlParam = new Dictionary<string, System.Object>();
String Script = String.Empty;
Script += "#----------------------------------------------------------\n";
Script += "# The script generated by VrayMat2Blender \n";
Script += "#----------------------------------------------------------\n";
Script += "import bpy, os\n\n";
//Script += "def run(origin):\n";
foreach (KeyValuePair<string, Dictionary<string, Dictionary<string, System.Object>>> pair in scene.VRayMtl){
// это имя материала или карты
// его посто запоминаем 1 раз
mtlName = pair.Key;
foreach (KeyValuePair<string, Dictionary<string, System.Object>> pairMtl in pair.Value){
// это тип материала или карты
// его просто запоминаем один раз
mtlType = pairMtl.Key;
foreach (KeyValuePair<string, System.Object> pairObj in pairMtl.Value){
// это список параметров
// их копим в массив
mtlParam.Add (pairObj.Key, pairObj.Value);
}
}
// когда данные накоплены, отдаем их функции которая сделает выбор и сформирует код
// функция просто возвращает нужный код
Script += GetBlenderCode(mtlType, mtlName, mtlParam);
mtlType = String.Empty;
mtlName = String.Empty;
mtlParam = new Dictionary<string, System.Object>();
}
return Script;
}
private string GetBlenderCode(String mtlType, String mtlName, Dictionary<string, System.Object> mtlParam){
string Script = String.Empty;
switch (mtlType)
{
case "BitmapBuffer":
Script += CreateBitmapBuffer (mtlName, mtlParam);
break;
case "UVWGenChannel":
Script += CreateUVWGenChannel (mtlName, mtlParam);
break;
case "BRDFDiffuse":
BRDFDiffuse diff = new BRDFDiffuse ();
Script += diff.GenOut();
Script += CreateBRDFDiffuse (mtlName, mtlParam);
break;
//default:
//Console.WriteLine("Default case");
//break;
}
//Script += mtlType + " - " + mtlName + " - \n";
return Script;
}
private string CreateBitmapBuffer(String mtlName, Dictionary<string, System.Object> mtlParam){
String Script = String.Empty;
Script += tabs+"# Load image file. Change here if the snippet folder is \n";
Script += tabs+"# not located in you home directory.\n";
// нужно добавить экранирование символов
Script += tabs+"realpath = os.path.expanduser(r'"+mtlParam["file"]+"')\n";
Script += tabs+"try:\n";
Script += tabs+"\timg = bpy.data.images.load(realpath)\n";
Script += tabs+"except:\n";
Script += tabs+"\traise NameError(\"Cannot load image %s\" % realpath)\n";
Script += "\n";
Script += tabs+"# Create image texture from image\n";
Script += tabs+"Tex_"+mtlName+" = bpy.data.textures.new('"+mtlName+"', type = 'IMAGE')\n";
Script += tabs+"Tex_"+mtlName+".image = img\n\n\n";
return Script;
}
private string CreateUVWGenChannel(String mtlName, Dictionary<string, System.Object> mtlParam){
String Script = String.Empty;
return Script;
}
private string CreateBRDFDiffuse(String mtlName, Dictionary<string, System.Object> mtlParam){
String Script = String.Empty;
Script += tabs+"mat_"+mtlName+" = bpy.data.materials.new(\""+mtlName+"\")\n";
Script += tabs+"mat_"+mtlName+".vray.type = 'BRDFVRayMtl'\n";
Script += CreateParametrs ("BRDFVRayMtl", mtlParam);
BRDFDiffuse test = new BRDFDiffuse ();
return Script;
}
private string CreateParametrs (String mtlType, Dictionary<string, System.Object> mtlParam){
String Script = String.Empty;
// тут нужно перебрать все параметры материала, но заполнить только те, которые пришли
// из mtlParam, остальные оставить без изменений
return Script;
}
}
}
/*
*
* ''' BRDFVRayMtl, BRDFSSS2Complex, BRDFLight, BRDFCarPaint, BRDFHair3, BRDFLayered '''
import bpy
def makeMaterial(name, diffuse, specular, alpha):
print("tests")
mat = bpy.data.materials.new(name)
mat.vray.type = 'BRDFHair3'
print(mat.vray.type)
mat.diffuse_color = diffuse
mat.diffuse_shader = 'LAMBERT'
mat.diffuse_intensity = 1.0
mat.specular_color = specular
mat.specular_shader = 'COOKTORR'
mat.specular_intensity = 0.5
mat.alpha = alpha
mat.ambient = 1
return mat
def setMaterial(ob, mat):
me = ob.data
me.materials.append(mat)
def run(origin):
# Create two materials
red = makeMaterial('Red', (1,0,0), (1,1,1), 1)
blue = makeMaterial('BlueSemi', (0,0,1), (0.5,0.5,0), 0.5)
# Create red cube
bpy.ops.mesh.primitive_cube_add(location=origin)
setMaterial(bpy.context.object, red)
# and blue sphere
bpy.ops.mesh.primitive_uv_sphere_add(location=origin)
bpy.ops.transform.translate(value=(1,0,0))
setMaterial(bpy.context.object, blue)
if __name__ == "__main__":
run((0,0,0))
*/