Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2012-06-26 13:46:24 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2012-06-26 13:46:24 +0400
commitcd6ed0bee5c1bc7b73eae5f869b13b121aa00a4b (patch)
tree10c861d1b38f0a40ccbcfa27f81350f33962be76 /source/blender/compositor/operations
parentbf19327465ab180c547436c56f6efbb55640b06d (diff)
Optimization of keying screen node
When creating tile data include only triangles which have got intersection with tile's rectangle only. This saves quite a lot of per-pixel iterations through triangles which simply can not affect on current tile. In fact, it's AABB check is used here. It could be improved further, but it'll slowdown tile data generation with questionable speedup. Another major slowdown is in fact caused by voronoi triangulation code. Currently it's used naive algorithm which is O(N^2) where N is number of edges. Added few euristics there and removed unused part of code, which gave quite noticeable speedup already. This could be improved further, but this node is not ment to be used for lots of markers. It's also generates wrong triangulation when there're many sites used. Need to be investigated further.
Diffstat (limited to 'source/blender/compositor/operations')
-rw-r--r--source/blender/compositor/operations/COM_KeyingScreenOperation.cpp70
-rw-r--r--source/blender/compositor/operations/COM_KeyingScreenOperation.h6
2 files changed, 65 insertions, 11 deletions
diff --git a/source/blender/compositor/operations/COM_KeyingScreenOperation.cpp b/source/blender/compositor/operations/COM_KeyingScreenOperation.cpp
index 0fbe0aea555..0341fe9ddac 100644
--- a/source/blender/compositor/operations/COM_KeyingScreenOperation.cpp
+++ b/source/blender/compositor/operations/COM_KeyingScreenOperation.cpp
@@ -133,6 +133,7 @@ KeyingScreenOperation::TriangulationData *KeyingScreenOperation::buildVoronoiTri
continue;
site = &sites[i];
+
pattern_ibuf = BKE_tracking_get_pattern_imbuf(ibuf, track, marker, TRUE, FALSE);
zero_v3(site->color);
@@ -199,19 +200,64 @@ KeyingScreenOperation::TriangulationData *KeyingScreenOperation::buildVoronoiTri
void *KeyingScreenOperation::initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers)
{
+ TileData *tile_data;
+ TriangulationData *triangulation;
+ int triangles_allocated = 0;
+ int chunk_size = 20;
+ int i;
+ rctf rect_float;
+
if (this->m_movieClip == NULL)
return NULL;
- if (this->m_cachedTriangulation)
- return this->m_cachedTriangulation;
+ if (!this->m_cachedTriangulation) {
+ lockMutex();
+ if (this->m_cachedTriangulation == NULL) {
+ this->m_cachedTriangulation = buildVoronoiTriangulation();
+ }
+ unlockMutex();
+ }
+
+ BLI_init_rctf(&rect_float, rect->xmin, rect->xmax, rect->ymin, rect->ymax);
+
+ triangulation = this->m_cachedTriangulation;
+ tile_data = (TileData *) MEM_callocN(sizeof(TileData), "keying screen tile data");
+
+ for (i = 0; i < triangulation->triangles_total; i++) {
+ bool ok = BLI_isect_rctf(&rect_float, &triangulation->triangles_AABB[i], NULL);
- lockMutex();
- if (this->m_cachedTriangulation == NULL) {
- this->m_cachedTriangulation = buildVoronoiTriangulation();
+ if (ok) {
+ tile_data->triangles_total++;
+
+ if (tile_data->triangles_total > triangles_allocated) {
+ if (!tile_data->triangles) {
+ tile_data->triangles = (int *) MEM_mallocN(sizeof(int) * chunk_size,
+ "keying screen tile triangles chunk");
+ }
+ else {
+ tile_data->triangles = (int *) MEM_reallocN(tile_data->triangles,
+ sizeof(int) * (triangles_allocated + chunk_size));
+ }
+
+ triangles_allocated += chunk_size;
+ }
+
+ tile_data->triangles[tile_data->triangles_total - 1] = i;
+ }
}
- unlockMutex();
- return this->m_cachedTriangulation;
+ return tile_data;
+}
+
+void KeyingScreenOperation::deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data)
+{
+ TileData *tile_data = (TileData *) data;
+
+ if (tile_data->triangles) {
+ MEM_freeN(tile_data->triangles);
+ }
+
+ MEM_freeN(tile_data);
}
void KeyingScreenOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[])
@@ -240,15 +286,17 @@ void KeyingScreenOperation::executePixel(float *color, int x, int y, MemoryBuffe
color[3] = 1.0f;
if (this->m_movieClip && data) {
- TriangulationData *triangulation = (TriangulationData *) data;
+ TriangulationData *triangulation = this->m_cachedTriangulation;
+ TileData *tile_data = (TileData *) data;
int i;
float co[2] = {(float) x, (float) y};
- for (i = 0; i < triangulation->triangles_total; i++) {
- rctf *rect = &triangulation->triangles_AABB[i];
+ for (i = 0; i < tile_data->triangles_total; i++) {
+ int triangle_idx = tile_data->triangles[i];
+ rctf *rect = &triangulation->triangles_AABB[triangle_idx];
if (IN_RANGE_INCL(x, rect->xmin, rect->xmax) && IN_RANGE_INCL(y, rect->ymin, rect->ymax)) {
- int *triangle = triangulation->triangles[i];
+ int *triangle = triangulation->triangles[triangle_idx];
VoronoiTriangulationPoint *a = &triangulation->triangulated_points[triangle[0]],
*b = &triangulation->triangulated_points[triangle[1]],
*c = &triangulation->triangulated_points[triangle[2]];
diff --git a/source/blender/compositor/operations/COM_KeyingScreenOperation.h b/source/blender/compositor/operations/COM_KeyingScreenOperation.h
index 7cf7ad3e959..95815cd3930 100644
--- a/source/blender/compositor/operations/COM_KeyingScreenOperation.h
+++ b/source/blender/compositor/operations/COM_KeyingScreenOperation.h
@@ -50,6 +50,11 @@ protected:
rctf *triangles_AABB;
} TriangulationData;
+ typedef struct TileData {
+ int *triangles;
+ int triangles_total;
+ } TileData;
+
MovieClip *m_movieClip;
int m_framenumber;
TriangulationData *m_cachedTriangulation;
@@ -69,6 +74,7 @@ public:
void deinitExecution();
void *initializeTileData(rcti *rect, MemoryBuffer **memoryBuffers);
+ void deinitializeTileData(rcti *rect, MemoryBuffer **memoryBuffers, void *data);
void setMovieClip(MovieClip *clip) {this->m_movieClip = clip;}
void setTrackingObject(const char *object) {strncpy(this->m_trackingObject, object, sizeof(this->m_trackingObject));}