void XsiExp::ExportNodeHeader( INode * node, TCHAR * type, int indentLevel) { TSTR indent = GetIndent(indentLevel); // node header: object type and name fprintf(pStream,"%s%s frm-%s {\n\n", indent.data(), type, FixupName(node->GetName())); }
void bgExporterMax::ExpScene() { struct tm *newtime; time_t aclock; time(&aclock); newtime = localtime(&aclock); TSTR today = _tasctime(newtime); today.remove(today.length() - 1); _ftprintf(m_pStream, _T("%s\t%s\n"), _T("#BG3D_MODEL"), FixupName(today)); // 날짜 _ftprintf(m_pStream, _T("%s\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t%d\n"), _T("#SCENE_INFO"), m_Scene.iVersion, // 버전 m_Scene.iFirstFrame, // 시작 프레임 m_Scene.iLastFrame, // 마지막 프레임 m_Scene.iFrameSpeed, // 프레임 스피드 m_Scene.iTickPerFrame, // 프레임당 틱 m_Scene.iNumMesh, // 메시 갯수 m_Scene.iMaxWeight, // 가중치 m_Scene.iBindPose); // 바인드포즈 }
void Exporter::ExportNodeHeader(INode* node) { { // add mesh; rsm->mesh=new RSMMesh; rsm->MeshList.Add(rsm->mesh); sprintf(rsm->mesh->name,"%s",FixupName(node->GetName())); } }
bool bgGlobalMax::CheckFile(Interface* p3DMax) { TSTR strCurrentFileName = FixupName(p3DMax->GetCurFileName()); if (strCurrentFileName.isNull() == false && m_strCurrentFileName == strCurrentFileName) return false; m_MatrixMap.Release(); m_pMtlList.clear(); m_strCurrentFileName = strCurrentFileName; return true; }
// Dump some global animation information. void Exporter::ExportGlobalInfo() { Interval range = ip->GetAnimRange(); struct tm *newtime; time_t aclock; time( &aclock ); newtime = localtime(&aclock); TSTR today = _tasctime(newtime); // The date string has a \n appended. today.remove(today.length()-1); // Remove the \n strcpy(rsm->MaxFileName,FixupName(ip->GetCurFilePath())); // Texmap* env = ip->GetEnvironmentMap(); }
// Output float keys if this is a known float controller that // supports key operations. Otherwise we will sample the controller // once for each frame to get the value. void AsciiExp::DumpFloatKeys(Control* cont, int indentLevel) { if (!cont) return; int i; TSTR indent = GetIndent(indentLevel); IKeyControl *ikc = NULL; // If the user wants us to always sample, we will ignore the KeyControlInterface if (!GetAlwaysSample()) ikc = GetKeyControlInterface(cont); // TCB float if (ikc && cont->ClassID() == Class_ID(TCBINTERP_FLOAT_CLASS_ID, 0)) { _ftprintf(pStream, _T("%s\t\t%s {\n"), indent.data(), ID_CONTROL_FLOAT_TCB); for (i=0; i<ikc->GetNumKeys(); i++) { ITCBFloatKey key; ikc->GetKey(i, &key); _ftprintf(pStream, _T("%s\t\t\t%s %d\t%s"), indent.data(), ID_TCB_FLOAT_KEY, key.time, Format(key.val)); _ftprintf(pStream, _T("\t%s\t%s\t%s\t%s\t%s\n"), Format(key.tens), Format(key.cont), Format(key.bias), Format(key.easeIn), Format(key.easeOut)); } _ftprintf(pStream, _T("%s\t\t}\n"), indent.data()); } // Bezier float else if (ikc && cont->ClassID() == Class_ID(HYBRIDINTERP_FLOAT_CLASS_ID, 0)) { _ftprintf(pStream, _T("%s\t\t%s {\n"), indent.data(), ID_CONTROL_FLOAT_BEZIER); for (i=0; i<ikc->GetNumKeys(); i++) { IBezFloatKey key; ikc->GetKey(i, &key); _ftprintf(pStream, _T("%s\t\t\t%s %d\t%s"), indent.data(), ID_BEZIER_FLOAT_KEY, key.time, Format(key.val)); _ftprintf(pStream, _T("\t%s\t%s\t%d\n"), Format(key.intan), Format(key.outtan), key.flags); } _ftprintf(pStream, _T("%s\t\t}\n"), indent.data()); } else if (ikc && cont->ClassID() == Class_ID(LININTERP_FLOAT_CLASS_ID, 0)) { _ftprintf(pStream, _T("%s\t\t%s {\n"), indent.data(), ID_CONTROL_FLOAT_LINEAR); for (i=0; i<ikc->GetNumKeys(); i++) { ILinFloatKey key; ikc->GetKey(i, &key); _ftprintf(pStream, _T("%s\t\t\t%s %d\t%s\n"), indent.data(), ID_FLOAT_KEY, key.time, Format(key.val)); } _ftprintf(pStream, _T("%s\t\t}\n"), indent.data()); } else { // Unknown controller, no key interface or sample on demand - // This might be a procedural controller or something else we // don't know about. The last resort is to get the value from the // controller at every n frames. TSTR name; cont->GetClassName(name); TSTR className = FixupName(name); Interface14 *iface = GetCOREInterface14(); UINT codepage = iface-> DefaultTextSaveCodePage(true); const char* className_locale = className.ToCP(codepage); _ftprintf(pStream, _T("%s\t\t%s \"%hs\" {\n"), indent.data(), ID_CONTROL_FLOAT_SAMPLE, className_locale); // If it is animated at all... if (cont->IsAnimated()) { // Get the range of the controller animation Interval range; // Get range of full animation Interval animRange = ip->GetAnimRange(); TimeValue t = cont->GetTimeRange(TIMERANGE_ALL).Start(); float value; // While we are inside the animation... while (animRange.InInterval(t)) { // Sample the controller range = FOREVER; cont->GetValue(t, &value, range); // Set time to start of controller validity interval t = range.Start(); // Output the sample _ftprintf(pStream, _T("%s\t\t\t%s %d\t%s\n"), indent.data(), ID_FLOAT_KEY, t, Format(value)); // If the end of the controller validity is beyond the // range of the animation if (range.End() > cont->GetTimeRange(TIMERANGE_ALL).End()) { break; } else { t = (range.End()/GetTicksPerFrame()+GetKeyFrameStep()) * GetTicksPerFrame(); } } } _ftprintf(pStream, _T("%s\t\t}\n"), indent.data()); } }
// Get hold of the transform controllers for the node... void AsciiExp::ExportAnimKeys(INode* node, int indentLevel) { TSTR indent = GetIndent(indentLevel); BOOL bPosAnim; BOOL bRotAnim; BOOL bScaleAnim; BOOL bDoKeys = FALSE; // We can only export keys if all TM controllers are "known" to us. // The reason for that is that some controllers control more than what // they should. Consider a path position controller, if you turn on // follow and banking, this position controller will also control // rotation. If a node that had a path position controller also had a // TCB rotation controller, the TCB keys would not describe the whole // rotation of the node. // For that reason we will only export keys if all controllers // position, rotation and scale are linear, hybrid (bezier) or tcb. if (!GetAlwaysSample()) { Control* pC = node->GetTMController()->GetPositionController(); Control* rC = node->GetTMController()->GetRotationController(); Control* sC = node->GetTMController()->GetScaleController(); if (IsKnownController(pC) && IsKnownController(rC) && IsKnownController(sC)) { bDoKeys = TRUE; } } Interface14 *iface = GetCOREInterface14(); UINT codepage = iface-> DefaultTextSaveCodePage(true); TSTR nodeName = FixupName(node->GetName()); const char* nodeName_locale = nodeName.ToCP(codepage); if (bDoKeys) { // Only dump the track header if any of the controllers have keys if (node->GetTMController()->GetPositionController()->NumKeys() || node->GetTMController()->GetRotationController()->NumKeys() || node->GetTMController()->GetScaleController()->NumKeys()) { _ftprintf(pStream, _T("%s\t%s {\n"), indent.data(), ID_TM_ANIMATION); _ftprintf(pStream, _T("%s\t\t%s \"%hs\"\n"), indent.data(), ID_NODE_NAME, nodeName_locale); DumpPosKeys(node->GetTMController()->GetPositionController(), indentLevel); DumpRotKeys(node->GetTMController()->GetRotationController(), indentLevel); DumpScaleKeys(node->GetTMController()->GetScaleController(), indentLevel); _ftprintf(pStream, _T("%s\t}\n"), indent.data()); } } else if (CheckForAnimation(node, bPosAnim, bRotAnim, bScaleAnim)) { _ftprintf(pStream, _T("%s\t%s {\n"), indent.data(), ID_TM_ANIMATION); _ftprintf(pStream, _T("%s\t\t%s \"%hs\"\n"), indent.data(), ID_NODE_NAME, nodeName_locale); if (bPosAnim) { DumpPosSample(node, indentLevel); } if (bRotAnim) { DumpRotSample(node, indentLevel); } if (bScaleAnim) { DumpScaleSample(node, indentLevel); } _ftprintf(pStream, _T("%s\t}\n"), indent.data()); } }
void XsiExp::DumpTexture(Texmap* tex, Class_ID cid, int subNo, float amt, int indentLevel) { if (!tex) return; TSTR indent = GetIndent(indentLevel+1); TSTR className; tex->GetClassName(className); if (tex->ClassID() == Class_ID(BMTEX_CLASS_ID, 0x00)) { fprintf(pStream, "%sSI_Texture2D {\n", indent.data() ); TSTR mapName = ((BitmapTex *)tex)->GetMapName(); fprintf(pStream, "%s\t\"%s\";\n", indent.data(), FixupName(mapName)); fprintf(pStream, "%s\t3;\n", indent.data()); fprintf(pStream, "%s\t0;0;\n", indent.data()); fprintf(pStream, "%s\t0;12594;0;543;\n", indent.data()); fprintf(pStream, "%s\t0;\n", indent.data()); fprintf(pStream, "%s\t1;1;\n", indent.data()); fprintf(pStream, "%s\t0;0;\n", indent.data()); fprintf(pStream, "%s\t1.000000;1.000000;\n", indent.data()); fprintf(pStream, "%s\t0.000000;0.000000;\n", indent.data()); fprintf(pStream, "%s\t1.000000,0.000000,0.000000,0.000000,\n", indent.data()); fprintf(pStream, "%s\t0.000000,1.000000,0.000000,0.000000,\n", indent.data()); fprintf(pStream, "%s\t0.000000,0.000000,1.000000,0.000000,\n", indent.data()); fprintf(pStream, "%s\t0.000000,0.000000,0.000000,1.000000;;\n", indent.data()); fprintf(pStream, "%s\t3;\n", indent.data()); fprintf(pStream, "%s\t1.000000;\n", indent.data()); fprintf(pStream, "%s\t0.750000;\n", indent.data()); fprintf(pStream, "%s\t1.000000;\n", indent.data()); fprintf(pStream, "%s\t0.000000;\n", indent.data()); fprintf(pStream, "%s\t0.000000;\n", indent.data()); fprintf(pStream, "%s\t0.000000;\n", indent.data()); fprintf(pStream, "%s\t0.000000;\n", indent.data()); fprintf(pStream, "%s}\n", indent.data()); } /* // If we include the subtexture ID, a parser could be smart enough to get // the class name of the parent texture/material and make it mean something. fprintf(pStream,"%s\t%s %d\n", indent.data(), ID_TEXSUBNO, subNo); fprintf(pStream,"%s\t%s %s\n", indent.data(), ID_TEXAMOUNT, Format(amt)); // Is this a bitmap texture? // We know some extra bits 'n pieces about the bitmap texture if (tex->ClassID() == Class_ID(BMTEX_CLASS_ID, 0x00)) { TSTR mapName = ((BitmapTex *)tex)->GetMapName(); fprintf(pStream,"%s\t%s \"%s\"\n", indent.data(), ID_BITMAP, FixupName(mapName)); StdUVGen* uvGen = ((BitmapTex *)tex)->GetUVGen(); if (uvGen) { DumpUVGen(uvGen, indentLevel+1); } TextureOutput* texout = ((BitmapTex*)tex)->GetTexout(); if (texout->GetInvert()) { fprintf(pStream,"%s\t%s\n", indent.data(), ID_TEX_INVERT); } fprintf(pStream,"%s\t%s ", indent.data(), ID_BMP_FILTER); switch(((BitmapTex*)tex)->GetFilterType()) { case FILTER_PYR: fprintf(pStream,"%s\n", ID_BMP_FILT_PYR); break; case FILTER_SAT: fprintf(pStream,"%s\n", ID_BMP_FILT_SAT); break; default: fprintf(pStream,"%s\n", ID_BMP_FILT_NONE); break; } } for (int i = 0; i < tex->NumSubTexmaps(); i++) { DumpTexture(tex->GetSubTexmap(i), tex->ClassID(), i, 1.0f, indentLevel+1); } fprintf(pStream, "%s}\n", indent.data()); */ }
void XsiExp::ExportMesh( INode * node, TimeValue t, int indentLevel) { ObjectState os = node->EvalWorldState(t); if (!os.obj || os.obj->SuperClassID() != GEOMOBJECT_CLASS_ID) { return; // Safety net. This shouldn't happen. } BOOL needDel; TriObject * tri = GetTriObjectFromNode(node, t, needDel); if (!tri) { // no tri object return; } // prepare mesh Mesh * mesh = &tri->GetMesh(); mesh->buildNormals(); // object offset matrix; apply to verts // swap y and z; max to soft correction Matrix3 matrix(1); // translate matrix.PreTranslate( Point3( node->GetObjOffsetPos().x, node->GetObjOffsetPos().z, -node->GetObjOffsetPos().y)); // rotate AngAxis aa( node->GetObjOffsetRot()); float temp = aa.axis.z; aa.axis.z = -aa.axis.y; aa.axis.y = temp; PreRotateMatrix(matrix, Quat( aa)); // scale ScaleValue scale = node->GetObjOffsetScale(); aa.Set( scale.q); temp = aa.axis.z; aa.axis.z = -aa.axis.y; aa.axis.y = temp; scale.q.Set( aa); temp = scale.s.z; scale.s.z = scale.s.y; scale.s.y = temp; ApplyScaling(matrix, scale); // apply root transform matrix = matrix * topMatrix; // only rotation for normals AffineParts ap; Matrix3 rotMatrix(1); decomp_affine( matrix, &ap); PreRotateMatrix( rotMatrix, ap.q); // set winding order int vx1 = 0, vx2 = 1, vx3 = 2; if (TMNegParity( node->GetNodeTM(GetStaticFrame())) != TMNegParity( matrix) ) { // negative scaling; invert winding order and normal rotation vx1 = 2; vx2 = 1; vx3 = 0; rotMatrix = rotMatrix * Matrix3( Point3(-1,0,0), Point3(0,-1,0), Point3(0,0,-1), Point3(0,0,0)); } // header TSTR indent = GetIndent(indentLevel+1); fprintf(pStream, "%s%s %s {\n",indent.data(), "Mesh", FixupName(node->GetName())); // write number of verts int numLoop = mesh->getNumVerts(); fprintf(pStream, "%s\t%d;\n",indent.data(), numLoop); // write verts for (int i = 0; i < numLoop; i++) { Point3 v = mesh->verts[i]; float temp = v.z; v.z = -v.y; v.y = temp; v = matrix * v; fprintf(pStream, "%s\t%.6f;%.6f;%.6f;%s\n", indent.data(), v.x, v.y, v.z, i == numLoop - 1 ? ";\n" : ","); } // write number of faces numLoop = mesh->getNumFaces(); fprintf(pStream, "%s\t%d;\n", indent.data(), numLoop); // write faces for (i = 0; i < numLoop; i++) { fprintf(pStream, "%s\t3;%d,%d,%d;%s\n", indent.data(), mesh->faces[i].v[vx1], mesh->faces[i].v[vx2], mesh->faces[i].v[vx3], i == numLoop - 1 ? ";\n" : ","); } // face materials Mtl * nodeMtl = node->GetMtl(); int numMtls = !nodeMtl || !nodeMtl->NumSubMtls() ? 1 : nodeMtl->NumSubMtls(); // write face material list header fprintf(pStream, "%s\tMeshMaterialList {\n", indent.data()); // write number of materials fprintf(pStream, "%s\t\t%d;\n", indent.data(), numMtls); // write number of faces fprintf(pStream, "%s\t\t%d;\n", indent.data(), numLoop); // write face material indices (1 for each face) for (i = 0; i < numLoop; i++) { int index = numMtls ? mesh->faces[i].getMatID() % numMtls : 0; fprintf(pStream,"%s\t\t%d%s\n", indent.data(), index, i == numLoop - 1 ? ";\n" : ","); } // write the materials ExportMaterial( node, indentLevel+2); // verts close brace fprintf(pStream, "%s\t}\n\n",indent.data()); // write normals header fprintf(pStream, "%s\t%s {\n", indent.data(), "SI_MeshNormals"); // write number of normals fprintf(pStream, "%s\t\t%d;\n", indent.data(), numLoop * 3); // write normals (3 for each face) for (i = 0; i < numLoop; i++) { Face * f = &mesh->faces[i]; int vert = f->getVert(vx1); Point3 vn = GetVertexNormal(mesh, i, mesh->getRVertPtr(vert)); float temp = vn.z; vn.z = -vn.y; vn.y = temp; vn = rotMatrix * vn; fprintf(pStream,"%s\t\t%.6f;%.6f;%.6f;,\n", indent.data(), vn.x, vn.y, vn.z); vert = f->getVert(vx2); vn = GetVertexNormal(mesh, i, mesh->getRVertPtr(vert)); temp = vn.z; vn.z = -vn.y; vn.y = temp; vn = rotMatrix * vn; fprintf(pStream,"%s\t\t%.6f;%.6f;%.6f;,\n", indent.data(), vn.x, vn.y, vn.z); vert = f->getVert(vx3); vn = GetVertexNormal(mesh, i, mesh->getRVertPtr(vert)); temp = vn.z; vn.z = -vn.y; vn.y = temp; vn = rotMatrix * vn; fprintf(pStream,"%s\t\t%.6f;%.6f;%.6f;%s\n", indent.data(), vn.x, vn.y, vn.z, i == numLoop - 1 ? ";\n" : ","); } // write number of faces fprintf(pStream, "%s\t\t%d;\n", indent.data(), numLoop); // write faces for (i = 0; i < numLoop; i++) { fprintf(pStream, "%s\t\t%d;3;%d,%d,%d;%s\n", indent.data(), i, i * 3 + vx1, i * 3 + vx2, i * 3 + vx3, i == numLoop - 1 ? ";\n" : ","); } // normals close brace fprintf(pStream, "%s\t}\n\n",indent.data()); // texcoords if (nodeMtl && mesh && (nodeMtl->Requirements(-1) & MTLREQ_FACEMAP)) { // facemapping numLoop = mesh->getNumFaces() * 3; // write texture coords header fprintf(pStream, "%s\tSI_MeshTextureCoords {\n", indent.data()); // write number of texture coords fprintf(pStream, "%s\t\t%d;\n", indent.data(), numLoop); // write texture coords for (int i = 0; i < numLoop; i++) { Point3 tv[3]; Face * f = &mesh->faces[i]; make_face_uv( f, tv); fprintf(pStream, "%s\t\t%.6f;%.6f;,\n", indent.data(), tv[0].x, tv[0].y); fprintf(pStream, "%s\t\t%.6f;%.6f;,\n", indent.data(), tv[1].x, tv[1].y); fprintf(pStream, "%s\t\t%.6f;%.6f;%s\n", indent.data(), tv[2].x, tv[2].y, i == numLoop - 1 ? ";\n" : ","); } // write number of faces numLoop = mesh->getNumFaces(); fprintf(pStream, "%s\t\t%d;\n", indent.data(), numLoop); // write faces for (i = 0; i < numLoop; i++) { fprintf(pStream,"%s\t\t%d;3;%d,%d,%d;%s\n", indent.data(), i, mesh->tvFace[i].t[vx1], mesh->tvFace[i].t[vx2], mesh->tvFace[i].t[vx3], i == numLoop - 1 ? ";\n" : ","); } // texture coords close brace fprintf(pStream, "%s\t}\n\n", indent.data()); } else { numLoop = mesh->getNumTVerts(); if (numLoop) { // write texture coords header fprintf(pStream, "%s\tSI_MeshTextureCoords {\n", indent.data()); // write number of texture coords fprintf(pStream, "%s\t\t%d;\n", indent.data(), numLoop); // write texture coords for (i = 0; i < numLoop; i++) { UVVert tv = mesh->tVerts[i]; fprintf(pStream, "%s\t\t%.6f;%.6f;%s\n", indent.data(), tv.x, tv.y, i == numLoop - 1 ? ";\n" : ","); } // write number of faces numLoop = mesh->getNumFaces(); fprintf(pStream, "%s\t\t%d;\n", indent.data(), numLoop); // write faces for (i = 0; i < numLoop; i++) { fprintf(pStream,"%s\t\t%d;3;%d,%d,%d;%s\n", indent.data(), i, mesh->tvFace[i].t[vx1], mesh->tvFace[i].t[vx2], mesh->tvFace[i].t[vx3], i == numLoop - 1 ? ";\n" : ","); } // texture coords close brace fprintf(pStream, "%s\t}\n\n", indent.data()); } } /* // Export color per vertex info if (GetIncludeVertexColors()) { int numCVx = mesh->numCVerts; fprintf(pStream, "%s\t%s %d\n",indent.data(), ID_MESH_NUMCVERTEX, numCVx); if (numCVx) { fprintf(pStream,"%s\t%s {\n",indent.data(), ID_MESH_CVERTLIST); for (i=0; i<numCVx; i++) { Point3 vc = mesh->vertCol[i]; fprintf(pStream, "%s\t\t%s %d\t%s\n",indent.data(), ID_MESH_VERTCOL, i, Format(vc)); } fprintf(pStream,"%s\t}\n",indent.data()); fprintf(pStream, "%s\t%s %d\n",indent.data(), ID_MESH_NUMCVFACES, mesh->getNumFaces()); fprintf(pStream, "%s\t%s {\n",indent.data(), ID_MESH_CFACELIST); for (i=0; i<mesh->getNumFaces(); i++) { fprintf(pStream,"%s\t\t%s %d\t%d\t%d\t%d\n", indent.data(), ID_MESH_CFACE, i, mesh->vcFace[i].t[vx1], mesh->vcFace[i].t[vx2], mesh->vcFace[i].t[vx3]); } fprintf(pStream, "%s\t}\n",indent.data()); } } */ // Mesh close brace fprintf(pStream, "%s}\n",indent.data()); // dispose of tri object if (needDel) { delete tri; } }
//----------------------------------------------------------------------------- // Wrap an unsafe call in a mutex to assure safety // Biggest error issues are: // 1. Timeout (probably handler doesn't exist) // 2. Handler can be destroyed at any time. //----------------------------------------------------------------------------- IPCFuncCallSource::EError IPCFuncCallSource::DoThreadSafeCall() { DWORD dwErr; EError err = Ok; #if defined(ENABLE_TIMING) g_time.Reset(); g_time.Start(); #endif HANDLE hStartEnum = NULL; HANDLE hDoneEnum = NULL; HANDLE hWrapCall = NULL; DWORD dwWaitRet; // Check if we have a handler (handler creates the events) and // abort if not. Do this check asap to optimize the most common // case of no handler. hStartEnum = WszOpenEvent(EVENT_ALL_ACCESS, FALSE, FixupName(StartEnumEventName)); if (hStartEnum == NULL) { dwErr = GetLastError(); err = Fail_NoHandler; goto errExit; } hDoneEnum = WszOpenEvent(EVENT_ALL_ACCESS, FALSE, FixupName(DoneEnumEventName)); if (hDoneEnum == NULL) { dwErr = GetLastError(); err = Fail_NoHandler; goto errExit; } // Need to create the mutex hWrapCall = WszCreateMutex(NULL, FALSE, FixupName(WrapMutexName)); if (hWrapCall == NULL) { dwErr = GetLastError(); err = Fail_CreateMutex; goto errExit; } // Wait for our turn dwWaitRet = WaitForSingleObject(hWrapCall, START_ENUM_TIMEOUT); dwErr = GetLastError(); switch(dwWaitRet) { case WAIT_OBJECT_0: // Good case. All other cases are errors and goto errExit. break; case WAIT_TIMEOUT: err = Fail_Timeout_Lock; goto errExit; break; default: err = Failed; goto errExit; break; } // Our turn: Make the function call { BOOL fSetOK = 0; // Reset the 'Done event' to make sure that Handler sets it after they start. ResetEvent(hDoneEnum); dwErr = GetLastError(); // Signal Handler to execute callback fSetOK = SetEvent(hStartEnum); dwErr = GetLastError(); // Now wait for handler to finish. dwWaitRet = WaitForSingleObject(hDoneEnum, START_ENUM_TIMEOUT); dwErr = GetLastError(); switch (dwWaitRet) { case WAIT_OBJECT_0: break; case WAIT_TIMEOUT: err = Fail_Timeout_Call; break; default: err = Failed; break; } ReleaseMutex(hWrapCall); dwErr = GetLastError(); } // End function call errExit: // Close all handles if (hStartEnum != NULL) { CloseHandle(hStartEnum); hStartEnum = NULL; } if (hDoneEnum != NULL) { CloseHandle(hDoneEnum); hDoneEnum = NULL; } if (hWrapCall != NULL) { CloseHandle(hWrapCall); hWrapCall = NULL; } #if defined(ENABLE_TIMING) g_time.End(); DWORD dwTime = g_time.GetEllapsedMS(); #endif return err; }
//----------------------------------------------------------------------------- // Receieves the call. This should be in a different process than the source //----------------------------------------------------------------------------- HRESULT IPCFuncCallHandler::InitFCHandler(HANDLER_CALLBACK pfnCallback) { m_pfnCallback = pfnCallback; HRESULT hr = NOERROR; DWORD dwThreadId; DWORD dwErr = 0; SetLastError(0); SECURITY_ATTRIBUTES *pSA = NULL; // Grab the SA DWORD dwPid = GetCurrentProcessId(); hr = IPCShared::CreateWinNTDescriptor(dwPid, &pSA); if (FAILED(hr)) goto errExit;; // Create the StartEnum Event m_hStartEnum = WszCreateEvent(pSA, FALSE, FALSE, FixupName(StartEnumEventName)); if (m_hStartEnum == NULL) { dwErr = GetLastError(); hr = HRESULT_FROM_WIN32(dwErr); goto errExit; } // Create the EndEnumEvent m_hDoneEnum = WszCreateEvent(pSA, FALSE, FALSE, FixupName(DoneEnumEventName)); if (m_hDoneEnum == NULL) { dwErr = GetLastError(); hr = HRESULT_FROM_WIN32(dwErr); goto errExit; } // Create the ShutdownThread Event m_hShutdownThread = WszCreateEvent(pSA, TRUE, /* Manual Reset */ FALSE, /* Initial state not signalled */ NULL); dwErr = GetLastError(); if (m_hShutdownThread == NULL) { hr = HRESULT_FROM_WIN32(dwErr); goto errExit; } // Create the AuxThreadShutdown Event m_hAuxThreadShutdown = WszCreateEvent(pSA, TRUE, /* Manual Reset */ FALSE, NULL); dwErr = GetLastError(); if (m_hAuxThreadShutdown == NULL) { hr = HRESULT_FROM_WIN32(dwErr); goto errExit; } // The thread that we are about to create should always // find the code in memory. So we take a ref on the DLL. // and do a free library at the end of the thread's start function m_hCallbackModule = WszLoadLibrary (L"CorPerfmonExt.dll"); dwErr = GetLastError(); if (m_hCallbackModule == NULL) { hr = HRESULT_FROM_WIN32(dwErr); goto errExit; } // Create thread m_hAuxThread = CreateThread( NULL, 0, HandlerAuxThreadProc, this, 0, &dwThreadId); dwErr = GetLastError(); if (m_hAuxThread == NULL) { hr = HRESULT_FROM_WIN32(dwErr); // In case of an error free this library here otherwise // the thread's exit would take care of it. if (m_hCallbackModule) FreeLibrary (m_hCallbackModule); goto errExit; } errExit: if (!SUCCEEDED(hr)) { TerminateFCHandler(); } return hr; }
// Get hold of the transform controllers for the node... void XsiExp::ExportAnimKeys( INode * node, int & animHit) { // Targets are actually geomobjects, but we will export them // from the camera and light objects, so we skip them here. // Object * obj = node->EvalWorldState(GetStaticFrame()).obj; if (!obj || obj->ClassID() == Class_ID( TARGET_CLASS_ID, 0)) { return; } TSTR indent = GetIndent(1); BOOL bPosAnim, bRotAnim, bScaleAnim, bDoKeys = FALSE; TCHAR * name = FixupName( node->GetName()); BOOL isBone = obj->ClassID() == Class_ID(BONE_CLASS_ID, 0) ? TRUE : FALSE; if (isBone) { // bone anims get passed to children if (!node->GetParentNode() || node->GetParentNode()->IsRootNode()) { // can't anim top bone return; } node = node->GetParentNode(); } // We can only export keys if all TM controllers are "known" to us. // The reason for that is that some controllers control more than what // they should. Consider a path position controller, if you turn on // follow and banking, this position controller will also control // rotation. If a node that had a path position controller also had a // TCB rotation controller, the TCB keys would not describe the whole // rotation of the node. // For that reason we will only export keys if all controllers // position, rotation and scale are linear, hybrid (bezier) or tcb. if (!GetAlwaysSample()) { Control* pC = node->GetTMController()->GetPositionController(); Control* rC = node->GetTMController()->GetRotationController(); Control* sC = node->GetTMController()->GetScaleController(); if (IsKnownController(pC) && IsKnownController(rC) && IsKnownController(sC)) { bDoKeys = TRUE; } } if (bDoKeys) { // Only dump the track header if any of the controllers have keys if (node->GetTMController()->GetPositionController()->NumKeys() > 1 || node->GetTMController()->GetRotationController()->NumKeys() > 1 || node->GetTMController()->GetScaleController()->NumKeys() > 1) { if (!animHit) { fprintf(pStream,"AnimationSet {\n"); animHit = TRUE; } fprintf(pStream,"%sAnimation anim-%s {\n", indent.data(), name ); indent = GetIndent(2); fprintf(pStream,"%s{frm-%s}\n", indent.data(), name ); DumpRotKeys( node, 1); DumpPosKeys( node, 1); DumpScaleKeys( node, 1); indent = GetIndent(1); fprintf(pStream,"%s}\n\n", indent.data()); } } else if (CheckForAnimation(node, bPosAnim, bRotAnim, bScaleAnim)) { if (!animHit) { fprintf(pStream,"AnimationSet {\n"); animHit = TRUE; } fprintf(pStream,"%sAnimation anim-%s {\n", indent.data(), name ); indent = GetIndent(2); fprintf(pStream,"%s{frm-%s}\n", indent.data(), name ); DumpRotKeys( node, 1); DumpPosKeys( node, 1); DumpScaleKeys( node, 1); fprintf(pStream,"%s}\n", indent.data()); } }