Пример #1
0
INT WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
{
	char* lpFileChar = NULL;
	INT fileChars;
	if(!readXFile("Warrior.x", NULL, &fileChars))
	{
		goto finallyDo;
	}
	lpFileChar = new CHAR[fileChars];
	if(!readXFile("Warrior.x", &lpFileChar, &fileChars))
	{
		goto finallyDo;
	}

	ID3DXFile* lpXFile = NULL;
	DXvBegin(D3DXFileCreate(&lpXFile))
		goto finallyDo;
	DXvEnd

	DXvBegin(lpXFile->RegisterTemplates(D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES))
		goto finallyDo;
	DXvEnd

	DXvBegin(lpXFile->RegisterTemplates(lpFileChar, strlen(lpFileChar)))
		goto finallyDo;
	DXvEnd

	parseXFile(lpXFile);

finallyDo:
	delete []lpFileChar;
	DXreleaseCom(lpXFile);

	return 0;
}
Пример #2
0
bool loadXFile( const std::string& filename, FrameNode* rootFrameNode, LPDIRECT3DDEVICE9 d3dDevice )
{
    ID3DXFile* dxFile = 0;
    ID3DXFileEnumObject* dxFileEnum = 0;

    // Create the file parsing structure
    if( APP_ERROR( FAILED( D3DXFileCreate( &dxFile ) ) )( "Couldn't create IDirectXFile to parse source file" ) )
        goto FAILED;

    // Register templates for parsing an X file
    if( APP_ERROR( FAILED( dxFile->RegisterTemplates( (LPVOID)D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES ) ) )
            ( "Failed to register D3DRM X-file templates" ) )
        goto FAILED;

    // Register extended templates for parsing an X file
    if( APP_ERROR( FAILED( dxFile->RegisterTemplates( (LPVOID)XSKINEXP_TEMPLATES, sizeof(XSKINEXP_TEMPLATES) - 1 ) ) )
            ( "Failed to register extended X-file templates" ) )
        goto FAILED;

    // Create an enumerator so that we can look at the top-level entries in the file
    if( APP_ERROR( FAILED( dxFile->CreateEnumObject( (LPCVOID)filename.c_str(), D3DXF_FILELOAD_FROMFILE, &dxFileEnum ) ) )
            ( "Couldn't create enumerator for .X file in memory" ) )
        goto FAILED;

    // Scan all of the top-level objects in the file
    bool continueLoading = true;
    SIZE_T numberOfChildren;
    dxFileEnum->GetChildren( &numberOfChildren );
    for( SIZE_T i = 0; continueLoading && i < numberOfChildren; ++i )
    {
        ID3DXFileData* dxFileDataObject = NULL;
        continueLoading = !APP_ERROR( FAILED( dxFileEnum->GetChild( i, &dxFileDataObject ) ) || !rootFrameNode->load( dxFileDataObject, d3dDevice ) )( "Couldn't load element" );
        SAFE_RELEASE( dxFileDataObject );
    }

    // Free the file objects
    SAFE_RELEASE( dxFileEnum );
    SAFE_RELEASE( dxFile );

    // Success
    return true;


FAILED:

    SAFE_RELEASE( dxFileEnum );
    SAFE_RELEASE( dxFile );

    return false;
}
Пример #3
0
INT WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
{
	ID3DXFile* lpXFile;

	if(FAILED(D3DXFileCreate(&lpXFile)))
	{
		return 0;
	}

	if(FAILED(lpXFile->RegisterTemplates(D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES)))
	{
		lpXFile->Release();
		return 0;
	}

	parseXFile(lpXFile);
	lpXFile->Release();

	return 0;
}
Пример #4
0
//-----------------------------------------------------------------------------
HRESULT CDXUTMeshFile::Create( LPDIRECT3DDEVICE9 pd3dDevice, LPCWSTR strFilename )
{
    LPD3DXFILE           pDXFile   = NULL;
    LPD3DXFILEENUMOBJECT pEnumObj  = NULL;
    LPD3DXFILEDATA       pFileData = NULL;
    HRESULT hr;
    SIZE_T cChildren;

    // Create a x file object
    if( FAILED( hr = D3DXFileCreate( &pDXFile ) ) )
        return E_FAIL;

    // Register templates for d3drm and patch extensions.
    if( FAILED( hr = pDXFile->RegisterTemplates( (void*)D3DRM_XTEMPLATES,
                                                 D3DRM_XTEMPLATE_BYTES ) ) )
    {
        SAFE_RELEASE( pDXFile );
        return E_FAIL;
    }

    // Find the path to the file, and convert it to ANSI (for the D3DXOF API)
    WCHAR strPath[MAX_PATH];
    CHAR  strPathANSI[MAX_PATH];
    DXUTFindDXSDKMediaFileCch( strPath, sizeof(strPath) / sizeof(WCHAR), strFilename );
    
    
    WideCharToMultiByte( CP_ACP, 0, strPath, -1, strPathANSI, MAX_PATH, NULL, NULL );
    strPathANSI[MAX_PATH-1] = 0;

    
    // Create enum object
    hr = pDXFile->CreateEnumObject( (void*)strPathANSI, D3DXF_FILELOAD_FROMFILE, 
                                    &pEnumObj );
    if( FAILED(hr) )
    {
        SAFE_RELEASE( pDXFile );
        return hr;
    }

    // Enumerate top level objects (which are always frames)
    pEnumObj->GetChildren(&cChildren);
    for (UINT iChild = 0; iChild < cChildren; iChild++)
    {
        hr = pEnumObj->GetChild(iChild, &pFileData);
        if (FAILED(hr))
            return hr;

        hr = LoadFrame( pd3dDevice, pFileData, this );
        SAFE_RELEASE( pFileData );
        if( FAILED(hr) )
        {
            SAFE_RELEASE( pEnumObj );
            SAFE_RELEASE( pDXFile );
            return E_FAIL;
        }
    }

    SAFE_RELEASE( pFileData );
    SAFE_RELEASE( pEnumObj );
    SAFE_RELEASE( pDXFile );

    return S_OK;
}
Пример #5
0
//-----------------------------------------------------------------------------
HRESULT CDXUTMeshFile::CreateFromResource( LPDIRECT3DDEVICE9 pd3dDevice, LPCWSTR strResource, LPCWSTR strType )
{
    LPD3DXFILE           pDXFile   = NULL;
    LPD3DXFILEENUMOBJECT pEnumObj  = NULL;
    LPD3DXFILEDATA       pFileData = NULL;
    HRESULT hr;
    SIZE_T cChildren;

    // Create a x file object
    if( FAILED( hr = D3DXFileCreate( &pDXFile ) ) )
        return E_FAIL;

    // Register templates for d3drm and patch extensions.
    if( FAILED( hr = pDXFile->RegisterTemplates( (void*)D3DRM_XTEMPLATES,
                                                 D3DRM_XTEMPLATE_BYTES ) ) )
    {
        SAFE_RELEASE( pDXFile );
        return E_FAIL;
    }
    
    CHAR strTypeAnsi[MAX_PATH];
    CHAR strResourceAnsi[MAX_PATH];

    WideCharToMultiByte( CP_ACP, 0, strType, -1, strTypeAnsi, MAX_PATH, NULL, NULL );
    strTypeAnsi[MAX_PATH-1] = 0;

    WideCharToMultiByte( CP_ACP, 0, strResource, -1, strResourceAnsi, MAX_PATH, NULL, NULL );
    strResourceAnsi[MAX_PATH-1] = 0;

    D3DXF_FILELOADRESOURCE dxlr;
    dxlr.hModule = NULL;
    dxlr.lpName = strResourceAnsi;
    dxlr.lpType = strTypeAnsi;

    // Create enum object
    hr = pDXFile->CreateEnumObject( (void*)&dxlr, D3DXF_FILELOAD_FROMRESOURCE, 
                                    &pEnumObj );
    if( FAILED(hr) )
    {
        SAFE_RELEASE( pDXFile );
        return hr;
    }

    // Enumerate top level objects (which are always frames)
    pEnumObj->GetChildren(&cChildren);
    for (UINT iChild = 0; iChild < cChildren; iChild++)
    {
        hr = pEnumObj->GetChild(iChild, &pFileData);
        if (FAILED(hr))
            return hr;

        hr = LoadFrame( pd3dDevice, pFileData, this );
        SAFE_RELEASE( pFileData );
        if( FAILED(hr) )
        {
            SAFE_RELEASE( pEnumObj );
            SAFE_RELEASE( pDXFile );
            return E_FAIL;
        }
    }

    SAFE_RELEASE( pFileData );
    SAFE_RELEASE( pEnumObj );
    SAFE_RELEASE( pDXFile );

    return S_OK;
}
Пример #6
0
	XFileEnv::XFileEnv()
	{
		D3DXFileCreate(&(*this));
	}
Пример #7
0
BOOL cMesh::Load(cGraphics *Graphics, char *Filename, char *TexturePath)
{
  ID3DXFile           *pDXFile = NULL;
  ID3DXFileEnumObject *pDXEnum = NULL;
  ID3DXFileData       *pDXData = NULL;
  sFrame                 *TempFrame, *FramePtr;
  sMesh                  *Mesh;

  // Free prior mesh object data
  Free();

  // Error checking
  if((m_Graphics = Graphics) == NULL || Filename == NULL)
    return FALSE;

  // Create the file object
  if(FAILED(D3DXFileCreate(&pDXFile)))	  
    return FALSE;

  // Register the templates
  if(FAILED(pDXFile->RegisterTemplates((LPVOID)D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES))) {
    pDXFile->Release();
    return FALSE;
  }

  // Create an enumeration object
  if(FAILED(pDXFile->CreateEnumObject((LPVOID)Filename, DXFILELOAD_FROMFILE, &pDXEnum))) {
    pDXFile->Release();
    return FALSE;
  }

  // Create a temporary frame
  TempFrame = new sFrame();

  SIZE_T count;

  if (FAILED(pDXEnum->GetChildren(&count)))
  {
	  return FALSE;
  }

  SIZE_T c = 0;

  // Loop through all objects looking for the frames and meshes
  while(c < count) {
	if (FAILED(pDXEnum->GetChild(c, &pDXData)))
		return FALSE;
    c++;
    ParseXFileData(pDXData, TempFrame, TexturePath);
    ReleaseCOM(pDXData);
  }

  // Release used COM objects
  ReleaseCOM(pDXEnum);
  ReleaseCOM(pDXFile);

  // See if we should keep the tempframe as root
  if(TempFrame->m_MeshList != NULL) {
    m_Frames = TempFrame;
    m_Frames->m_Name = new char[7];
    strcpy(m_Frames->m_Name, "%ROOT%");
  } else {
    // Assign the root frame and release temporary frame
    m_Frames = TempFrame->m_Child;
    FramePtr = m_Frames;
    while(FramePtr != NULL) {
      FramePtr->m_Parent = NULL;
      FramePtr = FramePtr->m_Sibling;
    }
    TempFrame->m_Child = NULL;
    delete TempFrame;
  }

  // Match frames to bones (for matrices)
  MapFramesToBones(m_Frames);

  // Calculate bounding box and sphere
  if((Mesh = m_Meshes) != NULL) {
    while(Mesh != NULL) {
      m_Min.x = min(m_Min.x, Mesh->m_Min.x);
      m_Min.y = min(m_Min.y, Mesh->m_Min.y);
      m_Min.z = min(m_Min.z, Mesh->m_Min.z);
      m_Max.x = max(m_Max.x, Mesh->m_Max.x);
      m_Max.y = max(m_Max.y, Mesh->m_Max.y);
      m_Max.z = max(m_Max.z, Mesh->m_Max.z);
      m_Radius = max(m_Radius, Mesh->m_Radius);

      Mesh = Mesh->m_Next;
    }
  }

  return TRUE;
}
Пример #8
0
XFileUtils::XFileUtils()
	:m_GuidMap(), m_pFile(nullptr), m_UnknownString("Unknown")
{
	{
		m_GuidMap.insert(container_type::value_type("AnimationOptions",GuidFromString("E2BF56C0-840F-11cf-8F52-0040333594A3") ));
		m_GuidMap.insert(container_type::value_type("AnimTicksPerSecond",GuidFromString("9E415A43-7BA6-4a73-8743-B73D47E88476") ));
		m_GuidMap.insert(container_type::value_type("Boolean",GuidFromString("537da6a0-ca37-11d0-941c-0080c80cfa7b") ));
		m_GuidMap.insert(container_type::value_type("Boolean2d",GuidFromString("4885AE63-78E8-11cf-8F52-0040333594A3") ));
		m_GuidMap.insert(container_type::value_type("ColorRGB",GuidFromString("D3E16E81-7835-11cf-8F52-0040333594A3") ));
		m_GuidMap.insert(container_type::value_type("ColorRGBA",GuidFromString("35FF44E0-6C7C-11cf-8F52-0040333594A3") ));
		m_GuidMap.insert(container_type::value_type("IndexedColor",GuidFromString("1630B820-7842-11cf-8F52-0040333594A3") ));
		m_GuidMap.insert(container_type::value_type("CompressedAnimationSet",GuidFromString("7F9B00B3-F125-4890-876E-1C42BF697C4D") ));
		m_GuidMap.insert(container_type::value_type("Coords2d",GuidFromString("F6F23F44-7686-11cf-8F52-0040333594A3") ));
		m_GuidMap.insert(container_type::value_type("EffectDWord",GuidFromString("622C0ED0-956E-4da9-908A-2AF94F3CE716") ));
		m_GuidMap.insert(container_type::value_type("EffectFloats",GuidFromString("F1CFE2B3-0DE3-4e28-AFA1-155A750A282D") ));
		m_GuidMap.insert(container_type::value_type("Animation",GuidFromString("3D82AB4F-62DA-11cf-AB39-0020AF71E433") ));
		m_GuidMap.insert(container_type::value_type("EffectParamDWord",GuidFromString("E13963BC-AE51-4c5d-B00F-CFA3A9D97CE5") ));
		m_GuidMap.insert(container_type::value_type("EffectParamFloats",GuidFromString("3014B9A0-62F5-478c-9B86-E4AC9F4E418B") ));
		m_GuidMap.insert(container_type::value_type("EffectParamString",GuidFromString("1DBC4C88-94C1-46ee-9076-2C28818C9481") ));
		m_GuidMap.insert(container_type::value_type("EffectString",GuidFromString("D55B097E-BDB6-4c52-B03D-6051C89D0E42") ));
		m_GuidMap.insert(container_type::value_type("EffectInstance",GuidFromString("E331F7E4-0559-4cc2-8E99-1CEC1657928F") ));
		m_GuidMap.insert(container_type::value_type("FaceAdjacency",GuidFromString("A64C844A-E282-4756-8B80-250CDE04398C") ));
		m_GuidMap.insert(container_type::value_type("FloatKeys",GuidFromString("10DD46A9-775B-11cf-8F52-0040333594A3") ));
		m_GuidMap.insert(container_type::value_type("FVFData",GuidFromString("B6E70A0E-8EF9-4e83-94AD-ECC8B0C04897") ));
		m_GuidMap.insert(container_type::value_type("Guid",GuidFromString("a42790e0-7810-11cf-8f52-0040333594a3") ));
		m_GuidMap.insert(container_type::value_type("MaterialWrap",GuidFromString("4885ae60-78e8-11cf-8f52-0040333594a3") ));
		m_GuidMap.insert(container_type::value_type("Matrix4x4",GuidFromString("F6F23F45-7686-11cf-8F52-0040333594A3") ));
		m_GuidMap.insert(container_type::value_type("MeshFace",GuidFromString("3D82AB5F-62DA-11cf-AB39-0020AF71E433") ));
		m_GuidMap.insert(container_type::value_type("Patch",GuidFromString("A3EB5D44-FC22-429D-9AFB-3221CB9719A6") ));
		m_GuidMap.insert(container_type::value_type("PMAttributeRange",GuidFromString("917E0427-C61E-4a14-9C64-AFE65F9E9844") ));
		m_GuidMap.insert(container_type::value_type("Vector",GuidFromString("3D82AB5E-62DA-11cf-AB39-0020AF71E433") ));
		m_GuidMap.insert(container_type::value_type("VertexDuplicationIndices",GuidFromString("B8D65549-D7C9-4995-89CF-53A9A8B031E3") ));
		m_GuidMap.insert(container_type::value_type("VertexElement",GuidFromString("F752461C-1E23-48f6-B9F8-8350850F336F") ));
		m_GuidMap.insert(container_type::value_type("XSkinMeshHeader",GuidFromString("3CF169CE-FF7C-44ab-93C0-F78F62D172E2") ));
		m_GuidMap.insert(container_type::value_type("PMVSplitRecord",GuidFromString("574CCC14-F0B3-4333-822D-93E8A8A08E4C") ));
		m_GuidMap.insert(container_type::value_type("TextureFilename",GuidFromString("A42790E1-7810-11cf-8F52-0040333594A3") ));
		m_GuidMap.insert(container_type::value_type("Material",GuidFromString("3D82AB4D-62DA-11CF-AB39-0020AF71E433") ));
		m_GuidMap.insert(container_type::value_type("TimedFloatKeys",GuidFromString("F406B180-7B3B-11cf-8F52-0040333594A3") ));
		m_GuidMap.insert(container_type::value_type("AnimationKey",GuidFromString("10DD46A8-775B-11CF-8F52-0040333594A3") ));
		m_GuidMap.insert(container_type::value_type("FrameTransformMatrix",GuidFromString("F6F23F41-7686-11cf-8F52-0040333594A3") ));
		m_GuidMap.insert(container_type::value_type("AnimationSet",GuidFromString("3D82AB50-62DA-11cf-AB39-0020AF71E433") ));
		m_GuidMap.insert(container_type::value_type("DeclData",GuidFromString("BF22E553-292C-4781-9FEA-62BD554BDD93") ));
		m_GuidMap.insert(container_type::value_type("MeshFaceWraps",GuidFromString("ED1EC5C0-C0A8-11D0-941C-0080C80CFA7B") ));
		m_GuidMap.insert(container_type::value_type("MeshNormals",GuidFromString("F6F23F43-7686-11cf-8F52-0040333594A3") ));
		m_GuidMap.insert(container_type::value_type("MeshTextureCoords",GuidFromString("F6F23F40-7686-11cf-8F52-0040333594A3") ));
		m_GuidMap.insert(container_type::value_type("MeshVertexColors",GuidFromString("1630B821-7842-11cf-8F52-0040333594A3") ));
		m_GuidMap.insert(container_type::value_type("MeshMaterialList",GuidFromString("F6F23F42-7686-11CF-8F52-0040333594A3") ));
		m_GuidMap.insert(container_type::value_type("SkinWeights",GuidFromString("6F0D123B-BAD2-4167-A0D0-80224F25FABB") ));
		m_GuidMap.insert(container_type::value_type("PMInfo",GuidFromString("B6C3E656-EC8B-4b92-9B62-681659522947") ));
		m_GuidMap.insert(container_type::value_type("Mesh",GuidFromString("3D82AB44-62DA-11CF-AB39-0020AF71E433") ));
		m_GuidMap.insert(container_type::value_type("PatchMesh",GuidFromString("D02C95CC-EDBA-4305-9B5D-1820D7704BBF") ));
		m_GuidMap.insert(container_type::value_type("PatchMesh9",GuidFromString("B9EC94E1-B9A6-4251-BA18-94893F02C0EA") ));
		m_GuidMap.insert(container_type::value_type("Frame",GuidFromString("3D82AB46-62DA-11CF-AB39-0020AF71E433") ));
	}

	FILE* f = nullptr;
	errno_t err = fopen_s(&f, "Template.txt", "rb+");
	assert(err == 0);
	char ch = EOF;
	while ((ch = getc(f)) != EOF)
		m_strTemplate.push_back(ch);
	fclose(f);
	D3DXFileCreate(&m_pFile);
	HRESULT result = m_pFile->RegisterTemplates((void*)m_strTemplate.c_str(), (SIZE_T)m_strTemplate.size());
	HRESULT re = D3DXFERR_PARSEERROR;
	assert(SUCCEEDED(result));
}