-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathshaders.js
82 lines (66 loc) · 3.21 KB
/
shaders.js
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
// добавляет графический шейдер, который затем применяется ко всем объектам
// todo сделать выбор объектов применения (мб через системы ecs?)
export default function setup( mv ) {
//var shadersHolder = qmlEngine.rootObject; // todo
// mv.shaders = []
// mv.create_obj({},{});
var shaders = [];
var shadersHolder = mv.create_obj({},{});
mv.vis.addShader = function( parent, name ) {
var shader = mv.create_qml( "Shader", qmlEngine.rootObject,function() {} );
//mv.create_obj( obj, {parent: opts.parent, name: opts.type, label:"extras" } );
// сцепка "все шейдеры сцены.."
shaders.push( shader );
shadersHolder.signal( "shaders" );
var oremove = parent.remove;
parent.remove = function() {
var i = shaders.indexOf( shader );
if (i >= 0) {
shaders.splice( i,1 );
}
//mv.callCmd("shadersChanged");
//mv.shadersChanged();
shadersHolder.signal( "shaders" );
oremove();
}
// отслеживать изменение параметров объекта, передавать в шейдер..
shader.followParams = function( obj, ...paramnames) {
paramnames.forEach( function(p) {
console.log("shader tracking, setting p=",p,shader);
QObject.createSimpleProperty("var",shader,p);
var v = obj.getParam(p);
console.log(">>>>>>> v=",v,"p=",p);
shader[p] = v;
obj.trackParam( p, function() { // todo значит надо untrack params при удалении ошейдера или объекта..
shader[p] = obj.getParam(p);
});
});
}
return shader;
}
///////////////////// создадим глобальную коллекцию..
// и здесь мы поняли что нам надо отслеживать что некий объект подписался на trackParam у другого
// и тогда он сможет отписываться. потихоньку пилим свой qml ))))
// плюс нам бы пригодилась мульти-схема. мы бы тогда эти шейдеры посадили бы в mv.root.shadersSpace
// и шейдер бы удалля себя из этого shaderSpace
var orig = mv.create_obj;
mv.create_obj = function( obj, opts ) {
orig( obj, opts );
// if (opts.label == "visual" && obj.shaderChanged) { // проверка что объект у нас визуализации и что у него есь шейдеры опция..
if (obj.shaderChanged) { // проверка что объект у нас визуализации и что у него есь шейдеры опция..
obj.shader = shaders;
var qq = function() {
if (obj.commonShadersProhibited) return;
obj.shader = shaders;
obj.shaderChanged(); // это надо вызывать, там onChanged не срабатывает т.к. указатель на массив не меняется..
}
shadersHolder.track("shaders",qq);
obj.Component.destruction.connect( function() {
shadersHolder.untrack("shaders",qq);
});
//mv.unchain... ?
//mv.shadersChanged.connect( obj, );
}
return obj;
};
}