1 module creator.ext.param;
2 import inochi2d;
3 import inochi2d.fmt;
4 import inmath;
5 import creator;
6 
7 class ExParameterGroup : Parameter {
8 public:
9     vec3 color = vec3(0.15, 0.15, 0.15);
10     Parameter[] children;
11 
12     this() { super(); }
13     this(string name) { super(name, false); }
14     this(string name, Parameter[] children) { 
15         super(name, false); 
16         this.children = children;    
17     }
18 
19     override
20     void update() {
21         // This only gets called as the initiap part of the update step, and it should
22         // skip driven parameters, which are updated later.
23         auto enableDrivers = incActivePuppet().enableDrivers;
24         auto parameterDrivers = incActivePuppet().getParameterDrivers();
25         foreach(ref child; children) {
26             if (!enableDrivers || child !in parameterDrivers)
27                 child.update();
28         }
29     }
30 
31     override
32     FghjException deserializeFromFghj(Fghj data) {
33         data["groupUUID"].deserializeValue(this.uuid);
34         if (!data["name"].isEmpty) data["name"].deserializeValue(this.name);
35         if (!data["color"].isEmpty) data["color"].deserializeValue(this.color.vector);
36         if (!data["children"].isEmpty) data["children"].deserializeValue(this.children);
37         return null;
38     }
39 
40     override
41     void serialize(ref InochiSerializer serializer) {
42         auto state = serializer.objectBegin;
43             serializer.putKey("groupUUID");
44             serializer.putValue(uuid);
45             serializer.putKey("name");
46             serializer.putValue(name);
47             serializer.putKey("color");
48             serializer.serializeValue(color.vector);
49             serializer.putKey("children");
50             serializer.serializeValue(children);
51         serializer.objectEnd(state);
52     }
53 
54     override
55     void finalize(Puppet puppet) {
56         foreach(child; children) {
57             child.finalize(puppet);
58         }
59     }
60 }
61 
62 void incRegisterExParameter() {
63     inParameterSetFactory((Fghj data) {
64         if (!data["groupUUID"].isEmpty) {
65             ExParameterGroup group = new ExParameterGroup;
66             data.deserializeValue(group);
67             return group;
68         }
69 
70         Parameter param = new Parameter;
71         data.deserializeValue(param);
72         return param;
73     });
74 }