void CSkelMeshViewer::ProcessKeyUp(int key) { CSkelMeshInstance *MeshInst = static_cast<CSkelMeshInstance*>(Inst); switch (key) { case 'f': FocusCameraOnPoint(MeshInst->GetMeshOrigin()); IsFollowingMesh = false; break; default: CMeshViewer::ProcessKeyUp(key); } }
void CSkelMeshViewer::Draw3D(float TimeDelta) { guard(CSkelMeshViewer::Draw3D); assert(Inst); CSkelMeshInstance *MeshInst = static_cast<CSkelMeshInstance*>(Inst); // tick animations MeshInst->UpdateAnimation(TimeDelta); #if HIGHLIGHT_CURRENT if (TimeSinceCreate < 0) TimeSinceCreate += 1.0f; // ignore this frame for highlighting else TimeSinceCreate += TimeDelta; float lightAmbient[4]; float boost = 0; float highlightTime = max(TimeSinceCreate, 0); if (TaggedMeshes.Num() && highlightTime < HIGHLIGHT_DURATION) { if (highlightTime > HIGHLIGHT_DURATION / 2) highlightTime = HIGHLIGHT_DURATION - highlightTime; // fade boost = HIGHLIGHT_STRENGTH * highlightTime / (HIGHLIGHT_DURATION / 2); glGetMaterialfv(GL_FRONT, GL_AMBIENT, lightAmbient); lightAmbient[0] += boost; lightAmbient[1] += boost; lightAmbient[2] += boost; glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient); glMaterialfv(GL_FRONT, GL_AMBIENT, lightAmbient); } #endif // HIGHLIGHT_CURRENT // draw main mesh CMeshViewer::Draw3D(TimeDelta); #if HIGHLIGHT_CURRENT if (boost > 0) { lightAmbient[0] -= boost; lightAmbient[1] -= boost; lightAmbient[2] -= boost; glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient); glMaterialfv(GL_FRONT, GL_AMBIENT, lightAmbient); } #endif // HIGHLIGHT_CURRENT int i; #if SHOW_BOUNDS //?? separate function for drawing wireframe Box (pass CCoords, Mins and Maxs to function) BindDefaultMaterial(true); glBegin(GL_LINES); CVec3 verts[8]; static const int inds[] = { 0,1, 2,3, 0,2, 1,3, 4,5, 6,7, 4,6, 5,7, 0,4, 1,5, 2,6, 3,7 }; const FBox &B = MeshInst->pMesh->BoundingBox; for (i = 0; i < 8; i++) { CVec3 &v = verts[i]; v[0] = (i & 1) ? B.Min.X : B.Max.X; v[1] = (i & 2) ? B.Min.Y : B.Max.Y; v[2] = (i & 4) ? B.Min.Z : B.Max.Z; MeshInst->BaseTransformScaled.TransformPointSlow(v, v); } // can use glDrawElements(), but this will require more GL setup glColor3f(0.5,0.5,1); for (i = 0; i < ARRAY_COUNT(inds) / 2; i++) { glVertex3fv(verts[inds[i*2 ]].v); glVertex3fv(verts[inds[i*2+1]].v); } glEnd(); glColor3f(1, 1, 1); #endif // SHOW_BOUNDS for (i = 0; i < TaggedMeshes.Num(); i++) { CSkelMeshInstance *mesh = TaggedMeshes[i]; if (mesh->pMesh == MeshInst->pMesh) continue; // avoid duplicates mesh->UpdateAnimation(TimeDelta); DrawMesh(mesh); } //?? make this common - place into DrawMesh() ? //?? problem: overdraw of skeleton when displaying multiple meshes //?? (especially when ShowInfluences is on, and meshes has different bone counts - the same bone //?? will be painted multiple times with different colors) if (ShowSkel) MeshInst->DrawSkeleton(ShowLabels, (DrawFlags & DF_SHOW_INFLUENCES) != 0); if (ShowAttach) MeshInst->DrawAttachments(); if (IsFollowingMesh) FocusCameraOnPoint(MeshInst->GetMeshOrigin()); unguard; }