#include <stdio.h> #include "vg.h" #include "pf.h" #include "assert.h" vgPicker *picker = NULL; vgObserver *obs = NULL; vgChannel *chan = NULL; vgEnv *env = NULL; vgWindow *win = NULL; vgGfx *gfx = NULL; vgScene *scn = NULL; void setPointers(); void createPicker(); void checkPickEvent(); void setPointers() { win = vgGetWin(0); assert(win); obs = vgGetObserv(0); assert(obs); chan = vgGetObservChan(obs, 0); assert(chan); gfx = vgGetObservGfx(obs); assert(gfx); env = vgGetEnv(0); assert(env); scn = vgGetScene(0); assert(scn); } /* * 創建vgPicker */ void createPicker() { picker = vgNewPicker(); assert(picker); vgName(picker, "picker"); /* * 指定vgPicker作用的場景和通道 */ vgPickerScene(picker, scn); vgPickerChannel(picker, chan); /* * 設置vgPicker屬性,選擇物體紅色顯示 */ vgPickerHighLightColor(picker, 1.0f, 0.0f, 0.0f); vgProp(picker, VGPICK_TRANSFORM, VGPICK_TRANSLATE); vgProp(picker, VGPICK_TRANSCOORDS, VGPICK_OBJECT_AXES); vgProp(picker, VGPICK_HL_LEVEL, VGPICK_OBJECT); vgProp(picker, VGPICK_HL_STYLE, VGPICK_HL_BBOX_LINES); vgProp(picker, VGPICK_TERRAIN_CLAMP, VG_OFF); vgProp(picker, VGPICK_TRANSOVERRIDE, VG_OFF); vgProp(picker, VGPICK_DISPLAY_STDOUT, VG_OFF); vgProp(picker, VGPICK_MULTIPLE_PICKS, VG_OFF); vgProp(picker, VGPICK_AUTOTRANSFORM, VG_OFF); vgProp(picker, VGPICK_TRACKPLANE, VGPICK_TRACK_XY); vgProp(picker, VGPICK_AUTOTRACKPLANE, VG_OFF); vgProp(picker, VGPICK_DRAG_FACTOR, 1.0f); vgProp(picker, VGPICK_RENDER_ISECT, VG_OFF); /* * 設置vgPicker的相交矢量 */ vgPickerClampIsector(picker, 0x10000000); vgPickerIsector(picker, 0x10000000); /* 啟用vgPicker */ vgProp(picker, VGCOMMON_ENABLED, VG_ON); } void checkPickEvent() { static vgMouse mouse; static vgPosition *pos = NULL; if (pos == NULL) { pos = vgNewPos(); assert(pos); } vgGetMouse(&mouse); /* 鼠標左鍵:拾取或取消拾取物體 */ if(mouse.lb && !mouse.mb && !mouse.rb) { vgGetPos(obs, pos); vgPerformPickProcessing(picker, pos); } } int main(int argc, char** argv) { int i; if (argc < 1) { printf("%s <config-file>\n", argv[0]); exit(-1); } vgInitSys(); vgDefineSys(argv[1]); vgConfigSys(); setPointers(); createPicker(); /* * 設置物體mask掩碼與vgPicker相一致,使得所有的物體都可以被選中 */ for (i = 0; i < vgGetNumObj(); i++) { vgObject *obj = vgGetObj(i); unsigned int mask = vgGetObjClass(obj); mask |= vgGetPickerIsector(picker); vgObjClass(obj, mask); } while (1) { vgSyncFrame(); vgFrame(); checkPickEvent(); } return 0; }
原文轉自:http://www.anti-gravitydesign.com