Vuo 2.4.4
Loading...
Searching...
No Matches
VuoImageAverage.c
Go to the documentation of this file.
1
10#include "VuoImageAverage.h"
11#include "VuoImageRenderer.h"
12
14#ifdef VUO_COMPILER
16 "title" : "VuoImageAverage",
17 "dependencies" : [
18 "VuoImageRenderer"
19 ]
20 });
21#endif
23
27typedef struct
28{
29 VuoShader shader;
31
35void VuoImageAverage_free(void *average)
36{
38 VuoRelease(bi->shader);
39 free(bi);
40}
41
46{
47 const char *shaderSource = VUOSHADER_GLSL_SOURCE(120,
48 varying vec2 fragmentTextureCoordinate;
49 uniform sampler2D textureA;
50 uniform sampler2D textureB;
51 uniform float factor;
52
53 void main(void)
54 {
55 vec4 colorA = texture2D(textureA, fragmentTextureCoordinate);
56 vec4 colorB = texture2D(textureB, fragmentTextureCoordinate);
57 vec4 mixed = mix(colorA, colorB, factor);
58 gl_FragColor = mixed;
59 }
60 );
61
64
65 bi->shader = VuoShader_make("Average Image Shader");
66 VuoRetain(bi->shader);
67 VuoShader_addSource(bi->shader, VuoMesh_IndividualTriangles, NULL, NULL, shaderSource);
68
69 return (VuoImageAverage)bi;
70}
71
80{
81 unsigned long imageCount = VuoListGetCount_VuoImage(images);
82 if (imageCount == 0)
83 return NULL;
84
85 VuoImage averagedImage = VuoListGetValue_VuoImage(images, 1);
86 if (imageCount == 1)
87 {
88 VuoRetain(averagedImage);
89 return averagedImage;
90 }
91
93
95
97 VuoRetain(averagedImage);
98 double factor = 1.;
99 for (unsigned long i = 2; i <= imageCount; ++i)
100 {
101 VuoImage image = VuoListGetValue_VuoImage(images, i);
102
103 VuoShader_setUniform_VuoImage(bi->shader, "textureA", averagedImage);
104 VuoShader_setUniform_VuoImage(bi->shader, "textureB", image);
105
106 factor *= ((double)i - 1.) / i;
107 VuoShader_setUniform_VuoReal(bi->shader, "factor", factor);
108
109 VuoImage b = VuoImageRenderer_render(bi->shader, averagedImage->pixelsWide, averagedImage->pixelsHigh, cd);
110 VuoRetain(b);
111 VuoRelease(averagedImage);
112 averagedImage = b;
113 }
114
115 return averagedImage;
116}