// function reacting to pen motion static OfxStatus interactPenMotion(OfxImageEffectHandle pluginInstance, OfxInteractHandle interactInstance, OfxPropertySetHandle inArgs) { // get my data handle MyInteractData *data = getInteractData(interactInstance); // Have we grabbed on a pen down already? if(data->selected) { // get the project size as we are normalising to this OfxPointD projSize, projOffset; ofxuGetProjectSetup(pluginInstance, projSize, projOffset); // get the pen position and normalise that OfxPointD penPos; gPropHost->propGetDoubleN(inArgs, kOfxInteractPropPenPosition, 2, &penPos.x); penPos.x = (penPos.x - projOffset.x)/projSize.x; penPos.y = (penPos.y - projOffset.y)/projSize.y; // set the value of the 'point' param gParamHost->paramSetValue(data->pointParam, penPos.x, penPos.y); return kOfxStatOK; } return kOfxStatReplyDefault; }
static OfxStatus interactPenDown(OfxImageEffectHandle pluginInstance, OfxInteractHandle interactInstance, OfxPropertySetHandle inArgs) { // get my data handle MyInteractData *data = getInteractData(interactInstance); // get the project size as we are normalising to this OfxPointD projSize, projOffset; ofxuGetProjectSetup(pluginInstance, projSize, projOffset); // get the point param's value double x, y; gParamHost->paramGetValue(data->pointParam, &x, &y); // scale it up to the project size as it is a normalised spatial parameter x = projOffset.x + x * projSize.x; y = projOffset.y + y * projSize.y; // get the size of a pixel on screen double pixelScale[2]; ofxuGetInteractPixelScale(inArgs, pixelScale); // see if the pen is within 5 screen pixels of the point, in which case, select it double penPos[2]; gPropHost->propGetDoubleN(inArgs, kOfxInteractPropPenPosition, 2, penPos); if(fabs(x - penPos[0]) < 5 * pixelScale[0] && fabs(y - penPos[1]) < 5 * pixelScale[1]) { data->selected = true; return kOfxStatOK; } return kOfxStatReplyDefault; }
// draw an interact instance static OfxStatus interactDraw(OfxImageEffectHandle pluginInstance, OfxInteractHandle interactInstance, OfxPropertySetHandle drawArgs) { OfxStatus err; // get my private interact data MyInteractData *data = getInteractData(interactInstance); // get the project size OfxPointD projSize, projOffset; ofxuGetProjectSetup(pluginInstance, projSize, projOffset); // get the size of a pixel in the current projection double pixelScale[2]; ofxuGetInteractPixelScale(drawArgs, pixelScale); // get my param's value double x, y; if((err = getCustomParam(pluginInstance, x, y)) != kOfxStatOK) return err; // scale it up to the project size as it is normalised x = projOffset.x + x * projSize.x; y = projOffset.y + y * projSize.y; // make the xhair a constant size on screen by scaling by the pixel scale float dx = kXHairSize * pixelScale[0]; float dy = kXHairSize * pixelScale[1]; // if the we have selected the Xhair, draw it highlit if(data->selected) glColor3f(1, 1, 1); else glColor3f(1, 0, 0); // Draw a cross hair, the current coordinate system aligns with the image plane. glPushMatrix(); glTranslated(x, y, 0); glBegin(GL_LINES); glVertex2f(-dx, 0); glVertex2f(dx, 0); glVertex2f(0, -dy); glVertex2f(0, dy); glEnd(); glPopMatrix(); return kOfxStatOK; }