1
#include
2
#include "vg.h"
3
#include "pf.h"
4
#include "assert.h"
5
6
7
vgPicker *picker = NULL;
8
vgObserver *mainObs = NULL;
9
vgChannel *mainChan = NULL;
10
vgEnv *mainEnv = NULL;
11
vgWindow *mainWin = NULL;
12
vgGfx *mainGfx = NULL;
13
vgScene *mainScn = NULL;
14
15
16
void setSystemPointers();
17
void createPicker();
18
void userUpdates();
19
void checkPickEvent();
20
21
void setSystemPointers(){
22
// ####################################################
23
// # 获取系统的主要指针,注意必须在vgConfigSys()之后调用
24
// #
25
// ####################################################
26
27
mainWin = vgGetWin( 0 );
28
assert(mainWin);
29
30
mainObs = vgGetObserv( 0 );
31
assert(mainObs );
32
33
mainChan = vgGetObservChan( mainObs, 0 );
34
assert(mainChan);
35
36
mainGfx = vgGetObservGfx( mainObs );
37
assert(mainEnv);
38
39
mainEnv = vgGetEnv( 0 );
40
assert(mainEnv);
41
42
mainScn = vgGetScene(0);
43
assert(mainScn);
44
45
}
46
47
48
void createPicker(){
49
// ########################################
50
// # 创建一个vgPicker
51
// #
52
// ########################################
53
54
picker = vgNewPicker();
55
assert( picker );
56
vgName( picker, "example_picker" );
57
58
//
59
// 指定vgPicker起作用的场景和通道
60
//
61
vgPickerScene( picker, mainScn );
62
vgPickerChannel( picker, mainChan );
63
64
//
65
// 设置vgPicker属性,选择物体红色显示
66
//
67
vgPickerHighLightColor( picker, 1.0f, 0.0f, 0.0f );
68
vgProp( picker, VGPICK_TRANSFORM, VGPICK_TRANSLATE );
69
vgProp( picker, VGPICK_TRANSCOORDS, VGPICK_OBJECT_AXES );
70
vgProp( picker, VGPICK_HL_LEVEL, VGPICK_OBJECT );
71
vgProp( picker, VGPICK_HL_STYLE, VGPICK_HL_LINE );
72
vgProp( picker, VGPICK_TERRAIN_CLAMP, VG_OFF );
73
vgProp( picker, VGPICK_TRANSOVERRIDE, VG_OFF );
74
vgProp( picker, VGPICK_DISPLAY_STDOUT, VG_OFF );
75
vgProp( picker, VGPICK_MULTIPLE_PICKS, VG_OFF );
76
vgProp( picker, VGPICK_AUTOTRANSFORM, VG_OFF );
77
vgProp( picker, VGPICK_TRACKPLANE, VGPICK_TRACK_XY );
78
vgProp( picker, VGPICK_AUTOTRACKPLANE, VG_OFF );
79
vgProp( picker, VGPICK_DRAG_FACTOR, 1.0f );
80
vgProp( picker, VGPICK_RENDER_ISECT, VG_OFF );
81
82
//
83
// 设置vgPicker的相交矢量
84
//
85
vgPickerClampIsector( picker, 0x10000000 );
86
vgPickerIsector( picker, 0x10000000 );
87
88
// 启用vgPicker
89
vgProp( picker, VGCOMMON_ENABLED, VG_ON );
90
91
}
92
93
void checkPickEvent(){
94
// ###################################################
95
// # 判断vgPicker当前的动作
96
// #
97
// #
98
// ###################################################
99
static vgMouse mouse;
100
static vgPosition *pos = NULL;
101
if( pos == NULL ){
102
pos = vgNewPos();
103
assert( pos );
104
}
105
vgGetMouse( &mouse );
106
107
// 鼠标左键:拾取或取消拾取物体
108
if( mouse.lb && !mouse.mb && !mouse.rb ) {
109
vgGetPos( obs, pos );
110
vgPerformPickProcessing( picker, pos) ;
111
}
112
113
// 拖拽鼠标右键:在指定的平面上移动选定的物体
114
if( !mouse.lb && !mouse.mb && mouse.rb ) {
115
vgGetPos( obs, pos );
116
vgPickerDoMouseTransform( picker, pos);
117
}
118
119
}
120
121
void userUpdates( ) {
122
// ############################################
123
// # 响应用户的键盘输入:
124
// # 1——在XY平面上移动物体(默认情况)
125
// # 2——在XZ平面上移动物体
126
// # 3——在YZ平面上移动物体
127
// ############################################
128
int key = 0;
129
130
while( (key = vgGetWinKey( mainWin )) != 0 ) {
131
132
switch( key ) {
133
134
case '1':
135
vgProp( picker, VGPICK_TRACKPLANE, VGPICK_TRACK_XY );
136
break;
137
138
case '2':
139
vgProp( picker, VGPICK_TRACKPLANE, VGPICK_TRACK_XZ );
140
break;
141
142
case '3':
143
vgProp( picker, VGPICK_TRACKPLANE, VGPICK_TRACK_YZ );
144
break;
145
146
147
default: break;
148
149
}
150
}
151
152
}
153
154
int main(int argc, char* argv[]) {
155
156
157
158
if( argc \n", argv[0] );
159
exit ( -1 );
160
}
161
162
vgInitSys();
163
vgDefineSys( argv[1] );
164
vgConfigSys();
165
166
setSystemPointers();
167
createPicker();
168
169
//
170
//设置物体mask掩码与vgPicker相一致,使得所有的物体都可以被选中
171
//
172
for( int i= 0; i < vgGetNumObj(), i++ ){
173
174
vgObject *obj = vgGetObj(i);
175
unsigned int mask = vgGetObjClass( obj );
176
mask |= vgGetPickerIsector( picker );
177
vgObjClass( obj, mask );
178
}
179
180
while( true ) {
181
182
vgSyncFrame();
183
vgFrame();
184
userUpdates();
185
checkPickEvent();
186
}
187
188
189
return 0;
190
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190
