00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <UT/UT_DSOVersion.h>
00029
00030 #include <OP/OP_Context.h>
00031 #include <OP/OP_OperatorTable.h>
00032
00033 #include <SYS/SYS_Math.h>
00034 #include <SYS/SYS_Floor.h>
00035
00036 #include <PRM/PRM_Include.h>
00037 #include <PRM/PRM_Parm.h>
00038
00039 #include <TIL/TIL_Region.h>
00040 #include <TIL/TIL_Plane.h>
00041 #include <TIL/TIL_Sequence.h>
00042 #include <TIL/TIL_Tile.h>
00043
00044 #include <COP2/COP2_CookAreaInfo.h>
00045
00046 #include "COP2_FullImageFilter.h"
00047
00048 using namespace HDK_Sample;
00049
00050 COP_MASK_SWITCHER(1, "Sample Full Image Filter");
00051
00052 static PRM_Name names[] =
00053 {
00054 PRM_Name("size", "Size"),
00055 };
00056
00057 static PRM_Default sizeDef(10);
00058 static PRM_Range sizeRange(PRM_RANGE_UI, 0, PRM_RANGE_UI, 100);
00059
00060 PRM_Template
00061 COP2_FullImageFilter::myTemplateList[] =
00062 {
00063 PRM_Template(PRM_SWITCHER, 3, &PRMswitcherName, switcher),
00064
00065 PRM_Template(PRM_FLT_J, TOOL_PARM, 1, &names[0], &sizeDef, 0,
00066 &sizeRange),
00067 PRM_Template(),
00068 };
00069
00070 OP_TemplatePair COP2_FullImageFilter::myTemplatePair(
00071 COP2_FullImageFilter::myTemplateList,
00072 &COP2_MaskOp::myTemplatePair);
00073
00074 OP_VariablePair COP2_FullImageFilter::myVariablePair(0,
00075 &COP2_MaskOp::myVariablePair);
00076
00077 const char * COP2_FullImageFilter::myInputLabels[] =
00078 {
00079 "Image to Filter",
00080 "Mask Input",
00081 0
00082 };
00083
00084 OP_Node *
00085 COP2_FullImageFilter::myConstructor( OP_Network *net,
00086 const char *name,
00087 OP_Operator *op)
00088 {
00089 return new COP2_FullImageFilter(net, name, op);
00090 }
00091
00092 COP2_FullImageFilter::COP2_FullImageFilter(OP_Network *parent,
00093 const char *name,
00094 OP_Operator *entry)
00095 : COP2_MaskOp(parent, name, entry)
00096 {
00097
00098
00099
00100 setDefaultScope(true, true, 0);
00101 }
00102
00103 COP2_FullImageFilter::~COP2_FullImageFilter()
00104 {
00105 ;
00106 }
00107
00108
00109
00110
00111 COP2_ContextData *
00112 COP2_FullImageFilter::newContextData(const TIL_Plane * ,
00113 int ,
00114 float t, int xres, int ,
00115 int , int )
00116 {
00117
00118
00119
00120 cop2_FullImageFilterData *sdata = new cop2_FullImageFilterData();
00121 int index = mySequence.getImageIndex(t);
00122
00123
00124
00125
00126 sdata->mySize = SIZE(t) * getXScaleFactor(xres)*getFrameScopeEffect(index);
00127
00128 return sdata;
00129 }
00130
00131
00132 void
00133 COP2_FullImageFilter::computeImageBounds(COP2_Context &context)
00134 {
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146 context.setImageBounds(0,0, context.myXres-1, context.myYres-1);
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157 }
00158
00159 void
00160 COP2_FullImageFilter::getInputDependenciesForOutputArea(
00161 COP2_CookAreaInfo &output_area,
00162 const COP2_CookAreaList &input_areas,
00163 COP2_CookAreaList &needed_areas)
00164 {
00165 COP2_CookAreaInfo *area;
00166
00167
00168
00169
00170
00171
00172
00173 area = makeOutputAreaDependOnInputPlane(0,
00174 output_area.getPlane().getName(),
00175 output_area.getArrayIndex(),
00176 output_area.getTime(),
00177 input_areas, needed_areas);
00178
00179
00180
00181 if (area)
00182 area->enlargeNeededAreaToBounds();
00183
00184
00185
00186
00187
00188 area = makeOutputAreaDependOnInputPlane(0,
00189 getAlphaPlaneName(), 0,
00190 output_area.getTime(),
00191 input_areas, needed_areas);
00192
00193 if (area)
00194 area->enlargeNeededAreaToBounds();
00195
00196 getMaskDependency(output_area, input_areas, needed_areas);
00197
00198 }
00199
00200 OP_ERROR
00201 COP2_FullImageFilter::doCookMyTile(COP2_Context &context, TIL_TileList *tiles)
00202 {
00203
00204
00205
00206
00207
00208 cop2_FullImageFilterData *sdata =
00209 static_cast<cop2_FullImageFilterData *>(context.data());
00210
00211 return cookFullImage(context, tiles, &COP2_FullImageFilter::filter,
00212 sdata->myLock, true);
00213 }
00214
00215 OP_ERROR
00216 COP2_FullImageFilter::filter(COP2_Context &context,
00217 const TIL_Region *input,
00218 TIL_Region *output,
00219 COP2_Node *me)
00220 {
00221
00222
00223 return ((COP2_FullImageFilter*)me)->filterImage(context, input, output);
00224
00225 }
00226
00227 OP_ERROR
00228 COP2_FullImageFilter::filterImage(COP2_Context &context,
00229 const TIL_Region *input,
00230 TIL_Region *output)
00231 {
00232
00233 cop2_FullImageFilterData *sdata =
00234 (cop2_FullImageFilterData *) context.data();
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247 TIL_Plane alphaplane(*mySequence.getPlane(getAlphaPlaneName()));
00248 alphaplane.setFormat(TILE_FLOAT32);
00249 alphaplane.setScoped(1);
00250
00251 TIL_Region *alpha = inputRegion(0, context,
00252 &alphaplane,0,
00253 context.myTime,
00254 0, 0,
00255 context.myXsize-1, context.myYsize-1);
00256 if(!alpha)
00257 {
00258
00259 return UT_ERROR_ABORT;
00260 }
00261
00262 int comp;
00263 int x,y;
00264 char *idata, *odata;
00265 float *adata;
00266
00267
00268
00269
00270
00271
00272 adata = (float *) alpha->getImageData(0);
00273
00274
00275 for(comp = 0; comp < PLANE_MAX_VECTOR_SIZE; comp++)
00276 {
00277 idata = (char *) input->getImageData(comp);
00278 odata = (char *) output->getImageData(comp);
00279
00280 if(odata)
00281 {
00282
00283
00284 memset(odata, 0, context.myXsize*context.myYsize * sizeof(float));
00285 }
00286
00287 if(idata && odata)
00288 {
00289
00290
00291 for(y=0; y<context.myYsize; y++)
00292 for(x=0; x<context.myXsize; x++)
00293 {
00294 float *pix = (float *) idata;
00295 float *out = (float *) odata;
00296
00297 unsigned seed = x * context.myYsize + y;
00298 float dx = SYSrandomZero(seed);
00299 float dy = SYSrandomZero(seed);
00300 int idx, idy;
00301 int nx, ny;
00302
00303 dx *= adata[x + y * context.myXsize] * sdata->mySize;
00304 dy *= adata[x + y * context.myXsize] * sdata->mySize;
00305
00306 idx = (int) SYSrint(dx);
00307 idy = (int) SYSrint(dy);
00308
00309 nx = x+idx;
00310 ny = y+idy;
00311
00312 if(nx < 0 || nx >= context.myXsize ||
00313 ny < 0 || ny >= context.myYsize)
00314 continue;
00315
00316 pix += (x+y*context.myXsize);
00317 out += (nx+ny*context.myXsize);
00318
00319 *out = *out + *pix;
00320 }
00321 }
00322 }
00323
00324
00325
00326
00327
00328
00329 releaseRegion(alpha);
00330
00331
00332
00333
00334 return error();
00335 }
00336
00337
00338 void
00339 newCop2Operator(OP_OperatorTable *table)
00340 {
00341 table->addOperator(new OP_Operator("hdk_fullfilter",
00342 "HDK Full Image Filter",
00343 COP2_FullImageFilter::myConstructor,
00344 &COP2_FullImageFilter::myTemplatePair,
00345 1,
00346 2,
00347 &COP2_FullImageFilter::myVariablePair,
00348 0,
00349 COP2_FullImageFilter::myInputLabels));
00350 }
00351