framework2
259 строк · 7.3 Кб
1#include "ofApp.h"
2
3//--------------------------------------------------------------
4void ofApp::setup() {
5ofDisableArbTex();
6
7ofSetBackgroundColor( 220 );
8
9// uncomment this to convert scene to meters //
10//ofxFBXSource::Scene::FbxUnits = FbxSystemUnit::m;
11
12ofxFBXSource::Scene::Settings settings;
13settings.filePath = "astroBoy_walk.fbx";
14// settings.useKeyFrames = false;
15settings.printInfo = true;
16
17ofSetLogLevel(OF_LOG_VERBOSE);
18
19if( fbx.load(settings) ) {
20cout << "ofApp :: loaded the scene OK" << endl;
21} else {
22cout << "ofApp :: Error loading the scene" << endl;
23}
24
25cam.lookAt( ofVec3f(0,0,0) );
26cam.setDistance( 20 );
27cam.setFarClip(100);
28cam.setNearClip( .5f );
29
30#ifdef TARGET_OPENGLES
31cam.disableMouseInput();
32#endif
33
34fbx.setAnimation(0);
35fbx.setPosition( 0, -7, 0 );
36
37//cout << fbx.getSkeletonInfo() << endl;
38
39bRenderNormals = false;
40bRenderMeshes = true;
41bDrawBones = false;
42}
43
44//--------------------------------------------------------------
45void ofApp::update() {
46
47light.setPosition( cos(ofGetElapsedTimef()*2.) * 7, 4 + sin( ofGetElapsedTimef() ) * 2.5, 10 );
48
49ofVec3f target( ofMap( ofGetMouseX(), 0, ofGetWidth(), -10, 10, true), fbx.getPosition().y, fbx.getPosition().z+10 );
50fbx.lookAt( target );
51fbx.panDeg( 180 );
52
53fbx.getCurrentAnimation().setSpeed( ofMap( ofGetMouseY(), 100, ofGetHeight()-100, 0.5, 2.5, true ));
54
55// fbx.update();
56
57#ifndef TARGET_OPENGLES
58// change colors of the materials //
59for( int i = 0; i < fbx.getNumMeshes(); i++ ) {
60// cout << i << " - " << fbx.getMeshes()[i]->getName() << " num materials: " << fbx.getMeshes()[i]->getNumMaterials() << endl;
61if( fbx.getMeshes()[i]->getNumMaterials() > 2 ) {
62auto mat = fbx.getMeshes()[i]->getMaterials()[2];
63mat->setDiffuseColor( ofFloatColor(sin(ofGetElapsedTimef()*4.)*0.5+0.5, 1, 1, 1 ));
64mat->disableTextures();
65}
66}
67#endif
68
69
70// moves the bones into place based on the animation //
71fbx.earlyUpdate();
72
73// perform any bone manipulation here //
74shared_ptr<ofxFBXBone> bone = fbx.getBone("head");
75if( bone ) {
76bone->pointTo( light.getPosition(), ofVec3f(-1,0,0) ) ;
77}
78
79// manipulates the mesh around the positioned bones //
80fbx.lateUpdate();
81
82}
83
84//--------------------------------------------------------------
85void ofApp::draw() {
86
87ofSetColor(255, 255, 255);
88
89ofEnableDepthTest();
90
91
92cam.begin(); {
93
94ofEnableLighting();
95light.enable();
96
97if( bRenderMeshes ) {
98ofSetColor( 255, 255, 255 );
99fbx.draw();
100}
101
102light.disable();
103ofDisableLighting();
104
105if(bDrawBones) {
106fbx.drawSkeletons( 0.5 );
107}
108
109if( bRenderNormals ) {
110ofSetColor( 255, 0, 255 );
111fbx.drawMeshNormals( 0.5, false );
112}
113
114ofNoFill();
115ofSetColor( 50, 50, 50 );
116ofDrawBox( 0, 0, 0, 14 );
117ofFill();
118
119ofSetColor( light.getDiffuseColor() );
120ofDrawSphere( light.getPosition(), 1 );
121
122} cam.end();
123
124ofDisableDepthTest();
125
126int numBones = fbx.getNumBones();
127
128ofSetColor( 60, 60, 60 );
129stringstream ds;
130ds << "Render normals (n): " << bRenderNormals << endl;
131ds << "Render meshes (m): " << bRenderMeshes << endl;
132ds << "Render " << numBones << " bones (b): " << bDrawBones << endl;
133if( fbx.areAnimationsEnabled() ) {
134ds << "Toggle play/pause (spacebar): playing: " << fbx.getCurrentAnimation().isPlaying() << endl;
135ds << "Previous/Next animation (up/down): " << fbx.getCurrentAnimation().name << endl;
136}
137ds << "Scale is " << fbx.getScale() << endl;
138if( fbx.getNumPoses() > 0 ) {
139ds << "Pose: " << fbx.getCurrentPose()->getName() << " num poses: " << fbx.getNumPoses() << " enabled (p): " << fbx.arePosesEnabled() << endl;
140}
141ofDrawBitmapString( ds.str(), 50, 30 );
142
143
144for(int i = 0; i < fbx.getNumAnimations(); i++ ) {
145stringstream ss;
146ofxFBXAnimation& anim = fbx.getAnimation( i );
147if( i == fbx.getCurrentAnimationIndex() ) {
148ss << "- ";
149}
150ss << "name: " << anim.name << " " << ofToString(anim.getPositionSeconds(), 3) << " | " << ofToString(anim.getDurationSeconds(), 3) << " frame: " << anim.getFrameNum() << " / " << anim.getTotalNumFrames() << endl;
151ofDrawBitmapString( ss.str(), 50, i * 30 + 450 );
152}
153}
154
155#ifdef TARGET_OPENGLES
156//--------------------------------------------------------------
157void ofApp::touchDown(ofTouchEventArgs & touch) {
158
159}
160
161//--------------------------------------------------------------
162void ofApp::touchMoved(ofTouchEventArgs & touch) {
163
164}
165
166//--------------------------------------------------------------
167void ofApp::touchUp(ofTouchEventArgs & touch) {
168
169}
170
171//--------------------------------------------------------------
172void ofApp::touchDoubleTap(ofTouchEventArgs & touch) {
173if( bRenderMeshes ) {
174bRenderMeshes = false;
175bDrawBones = true;
176} else {
177bRenderMeshes = true;
178bDrawBones = false;
179}
180}
181
182//--------------------------------------------------------------
183void ofApp::touchCancelled(ofTouchEventArgs & touch) {
184
185}
186#else
187
188//--------------------------------------------------------------
189void ofApp::keyPressed(int key) {
190if(fbx.getNumAnimations() > 1) {
191if(key == OF_KEY_DOWN ) {
192int newAnimIndex = fbx.getCurrentAnimationIndex()+1;
193if(newAnimIndex > fbx.getNumAnimations()-1 ) {
194newAnimIndex = 0;
195}
196fbx.setAnimation( newAnimIndex );
197
198}
199if(key == OF_KEY_UP ) {
200int newAnimIndex = fbx.getCurrentAnimationIndex()-1;
201if(newAnimIndex < 0 ) {
202newAnimIndex = fbx.getNumAnimations()-1;
203}
204fbx.setAnimation( newAnimIndex );
205}
206}
207}
208
209//--------------------------------------------------------------
210void ofApp::keyReleased(int key) {
211if(key == ' ') {
212fbx.getCurrentAnimation().togglePlayPause();
213}
214if(key == 'n') {
215bRenderNormals = !bRenderNormals;
216}
217if(key == 'm') {
218bRenderMeshes = !bRenderMeshes;
219}
220if(key == 'b') {
221bDrawBones = !bDrawBones;
222}
223}
224
225//--------------------------------------------------------------
226void ofApp::mouseMoved(int x, int y) {
227
228}
229
230//--------------------------------------------------------------
231void ofApp::mouseDragged(int x, int y, int button) {
232
233}
234
235//--------------------------------------------------------------
236void ofApp::mousePressed(int x, int y, int button) {
237
238}
239
240//--------------------------------------------------------------
241void ofApp::mouseReleased(int x, int y, int button) {
242
243}
244
245//--------------------------------------------------------------
246void ofApp::windowResized(int w, int h) {
247
248}
249
250//--------------------------------------------------------------
251void ofApp::gotMessage(ofMessage msg) {
252
253}
254
255//--------------------------------------------------------------
256void ofApp::dragEvent(ofDragInfo dragInfo) {
257
258}
259#endif
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275