Esempio n. 1
0
static void ParseKeyName(const CTString &strKey, HKEY &hKeyRoot, CTString &strKeyPath, CTString &strKeyName)
{
  CTString strRemain = strKey;
  // separate key into the value part and path
  strKeyName = CTFileName(strRemain).FileName();
  strRemain = CTFileName(strRemain).FileDir();
  strRemain.TrimRight(strlen(strRemain)-1); // removes trailing backslash
  // try to find root key value

  if (strRemain.RemovePrefix("HKEY_CLASSES_ROOT\\")) {
    hKeyRoot = HKEY_CLASSES_ROOT;
  } else if (strRemain.RemovePrefix("HKEY_CURRENT_CONFIG\\")) {
    hKeyRoot = HKEY_CURRENT_CONFIG;
  } else if (strRemain.RemovePrefix("HKEY_CURRENT_USER\\")) {
    hKeyRoot = HKEY_CURRENT_USER;
  } else if (strRemain.RemovePrefix("HKEY_LOCAL_MACHINE\\")) {
    hKeyRoot = HKEY_LOCAL_MACHINE;
  } else if (strRemain.RemovePrefix("HKEY_USERS\\")) {
    hKeyRoot = HKEY_USERS;
  } else {
    ASSERT(FALSE);
    hKeyRoot = HKEY_CURRENT_USER;
  }

  strKeyPath = strRemain;
}
Esempio n. 2
0
/*
 * Get extension part of a filename.
 */
CTFileName CTFileName::FileExt() const
{
    ASSERT(IsValid());

    // find last dot in the string
    char *pExtension = strrchr( str_String, '.');
    // if there is no dot
    if( pExtension == NULL) {
        // return no extension
        return( CTFileName(""));
    }
    // return a copy of the extension part, together with the dot
    return( CTFileName( pExtension));
}
Esempio n. 3
0
void CScriptView::OnScriptUpdateMipmodels() 
{
	// find document with same name
  CModelerDoc *pDoc = (CModelerDoc *) GetDocument();
  CTFileName fnScriptName = CTString(pDoc->GetPathName());
  CTFileName fnModelName = fnScriptName.FileDir() + fnScriptName.FileName() + ".mdl";

	POSITION pos = theApp.m_pdtModelDocTemplate->GetFirstDocPosition();
  while (pos!=NULL)
  {
    CModelerDoc *pmdCurrent = (CModelerDoc *)theApp.m_pdtModelDocTemplate->GetNextDoc(pos);
    if( CTFileName( CTString(pmdCurrent->GetPathName())) == fnModelName)
    {
      POSITION pos = pmdCurrent->GetFirstViewPosition();
      CView *pView = pmdCurrent->GetNextView( pos);
      if( DYNAMIC_DOWNCAST(CModelerView, pView) != NULL)
      {
        CModelerView* pModelerView = (CModelerView *) pView;
        if(pModelerView != NULL)
        {
          pModelerView->OnScriptUpdateMipmodels();
          pModelerView->SetActiveWindow();
          pModelerView->SetFocus();
          CMainFrame* pMainFrame = STATIC_DOWNCAST(CMainFrame, AfxGetMainWnd());
          pMainFrame->MDIActivate(pModelerView->GetParentFrame());
        }
      }
      break;
    }
  }
}
Esempio n. 4
0
/*
 * Get directory part of a filename.
 */
CTFileName CTFileName::FileDir() const
{
    ASSERT(IsValid());

    // make a temporary copy of string
    CTFileName strPath(*this);
    // find last backlash in it
    char *pPathBackSlash = strrchr( strPath.str_String, '\\');
    // if there is no backslash
    if( pPathBackSlash == NULL) {
        // return emptystring as directory
        return( CTFileName(""));
    }
    // set end of string after where the backslash was
    pPathBackSlash[1] = 0;
    // return a copy of temporary string
    return( CTFileName( strPath));
}
Esempio n. 5
0
/*
 * Get name part of a filename.
 */
CTFileName CTFileName::FileName() const
{
    ASSERT(IsValid());

    // make a temporary copy of string
    CTFileName strPath(*this);
    // find last dot in it
    char *pDot = strrchr( strPath.str_String, '.');
    // if there is a dot
    if( pDot != NULL) {
        // set end of string there
        pDot[0] = 0;
    }

    // find last backlash in what's left
    char *pBackSlash = strrchr( strPath.str_String, '\\');
    // if there is no backslash
    if( pBackSlash == NULL) {
        // return it all as filename
        return( CTFileName(strPath));
    }
    // return a copy of temporary string, starting after the backslash
    return( CTFileName( pBackSlash+1));
}
Esempio n. 6
0
CParticleGroup *CParticleGroup::Copy()
{
	CParticleGroup	*pParticleGroup = new CParticleGroup;
	pParticleGroup->m_strName = m_strName;
	pParticleGroup->SetTexture(CTFileName(m_fnTexture.c_str()));
	for(UINT i=0; i<m_vectorCommonProcess.size(); ++i)
	{
		pParticleGroup->AddCommonProcess(m_vectorCommonProcess[i]);
	}
	if(m_pParticlesEmitter) pParticleGroup->SetEmitter(m_pParticlesEmitter);
	if(m_pParticlesAbsorption) pParticleGroup->SetAbsorption(m_pParticlesAbsorption);
	pParticleGroup->SetRenderType(m_eRenderType);
	pParticleGroup->m_eBlendType = m_eBlendType;
	pParticleGroup->m_mexWidth = m_mexWidth;
	pParticleGroup->m_mexHeight = m_mexHeight;
	pParticleGroup->m_iCol = m_iCol;
	pParticleGroup->m_iRow = m_iRow;

	return pParticleGroup;
}
Esempio n. 7
0
void InitStreams(void)
{
  // obtain information about system
// !!! FIXME: Move this into an abstraction of some sort...
#ifdef PLATFORM_WIN32
  SYSTEM_INFO siSystemInfo;
  GetSystemInfo( &siSystemInfo);
  // and remember page size
  _ulPageSize = siSystemInfo.dwPageSize*16;   // cca. 64kB on WinNT/Win95
#else
  _ulPageSize = PAGESIZE;
#endif

  // keep a copy of path for setting purposes
  _fnmApp = _fnmApplicationPath;

  // if no mod defined yet
  if (_fnmMod=="") {
    // check for 'default mod' file
    LoadStringVar(CTString("DefaultMod.txt"), _fnmMod);
  }

  CPrintF(TRANSV("Current mod: %s\n"),
            (_fnmMod=="") ? TRANS("<none>") :
                            (const char *) (CTString&)_fnmMod);
  // if there is a mod active
  if (_fnmMod!="") {
    // load mod's include/exclude lists
    CPrintF(TRANSV("Loading mod include/exclude lists...\n"));
    BOOL bOK = FALSE;
    bOK |= LoadFileList(_afnmBaseWriteInc , CTString("BaseWriteInclude.lst"));
    bOK |= LoadFileList(_afnmBaseWriteExc , CTString("BaseWriteExclude.lst"));
    bOK |= LoadFileList(_afnmBaseBrowseInc, CTString("BaseBrowseInclude.lst"));
    bOK |= LoadFileList(_afnmBaseBrowseExc, CTString("BaseBrowseExclude.lst"));

    // if none found
    if (!bOK) {
      // the mod is not valid
      _fnmMod = CTString("");
      CPrintF(TRANSV("Error: MOD not found!\n"));
    // if mod is ok
    } else {
      // remember mod name (the parameter that is passed on cmdline)
      _strModName = _fnmMod;
      _strModName.DeleteChar(_strModName.Length()-1);
      _strModName = CTFileName(_strModName).FileName();
    }
  }
  // find eventual extension for the mod's dlls
  _strModExt = "";
  LoadStringVar(CTString("ModExt.txt"), _strModExt);


  CPrintF(TRANSV("Loading group files...\n"));

  CDynamicArray<CTString> *files = NULL;

  // for each group file in base directory
  files = _pFileSystem->FindFiles(_fnmApplicationPath, "*.gro");
  int max = files->Count();
  int i;

  // for each .gro file in the directory
  for (i = 0; i < max; i++) {
    // add it to active set
    UNZIPAddArchive( _fnmApplicationPath+((*files)[i]) );
  }
  delete files;

  // if there is a mod active
  if (_fnmMod!="") {
    // for each group file in mod directory
     files = _pFileSystem->FindFiles(_fnmApplicationPath+_fnmMod, "*.gro");
     max = files->Count();
     for (i = 0; i < max; i++) {
       UNZIPAddArchive( _fnmApplicationPath + _fnmMod + ((*files)[i]) );
     }
     delete files;
  }

  // if there is a CD path
  if (_fnmCDPath!="") {
    // for each group file on the CD
    files = _pFileSystem->FindFiles(_fnmCDPath, "*.gro");
    max = files->Count();
    for (i = 0; i < max; i++) {
      UNZIPAddArchive( _fnmCDPath + ((*files)[i]) );
    }
    delete files;

    // if there is a mod active
    if (_fnmMod!="") {
      // for each group file in mod directory
      files = _pFileSystem->FindFiles(_fnmCDPath+_fnmMod, "*.gro");
      max = files->Count();
      for (i = 0; i < max; i++) {
        UNZIPAddArchive( _fnmCDPath + _fnmMod + ((*files)[i]) );
      }
      delete files;
    }
  }

  // try to
  try {
    // read the zip directories
    UNZIPReadDirectoriesReverse_t();
  // if failed
  } catch( char *strError) {
    // report warning
    CPrintF( TRANS("There were group file errors:\n%s"), strError);
  }
  CPrintF("\n");

  const char *dirsep = CFileSystem::GetDirSeparator();
  LoadFileList(_afnmNoCRC, CTFILENAME("Data") + CTString(dirsep) + CTString("NoCRC.lst"));

  _pShell->SetINDEX(CTString("sys")+"_iCPU"+"Misc", 1);
}
CTFileName CDynamicLoader::ConvertLibNameToPlatform(const char *libname)
{
    return(CTFileName(CTString(libname)));
}
void CDlgRenderingPreferences::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);

  CModelRenderPrefs &pmrpPrefs = theApp.m_vpViewPrefs[ m_iBuffer].m_mrpModelRenderPrefs;
  CWorldRenderPrefs &pwrpPrefs = theApp.m_vpViewPrefs[ m_iBuffer].m_wrpWorldRenderPrefs;
  // if dialog is recieving data
  if( (pDX->m_bSaveAndValidate == FALSE) && IsWindow( m_hWnd) &&
      IsWindow( m_VertexFillType.m_hWnd) &&
      IsWindow( m_EdgesFillType.m_hWnd) &&
      IsWindow( m_PolygonFillType.m_hWnd) &&
      IsWindow( m_TextureFillType.m_hWnd) )      
  {
    // world rendering preferences
    m_VertexColors.SetColor( pwrpPrefs.GetVerticesInkColor());
    m_EdgesColors.SetColor( pwrpPrefs.GetEdgesInkColor());
    m_PolygonColors.SetColor( pwrpPrefs.GetPolygonsInkColor());
    m_PaperColor.SetColor( theApp.m_vpViewPrefs[ m_iBuffer].m_PaperColor);
    m_SelectionColor.SetColor( theApp.m_vpViewPrefs[ m_iBuffer].m_SelectionColor);
    m_GridColor.SetColor( theApp.m_vpViewPrefs[ m_iBuffer].m_GridColor);
    m_fFarClipPlane=pwrpPrefs.wrp_fFarClipPlane;
    m_bApplyFarClipInIsometricProjection=pwrpPrefs.wrp_bApplyFarClipPlaneInIsometricProjection;
    
    m_strBcgTexture = CTFileName(CTString( theApp.m_vpViewPrefs[ m_iBuffer].m_achrBcgPicture)).FileName();

    // get render editor models flag
    m_bRenderEditorModels = pwrpPrefs.IsEditorModelsOn();
    // get render field brushes flag
    m_bRenderFieldBrushes = pwrpPrefs.IsFieldBrushesOn();
    // get use texture for background flag
    m_bUseTextureForBcg = pwrpPrefs.IsBackgroundTextureOn();

    m_bRenderMirrors = pwrpPrefs.IsMirrorsOn();
    m_bRenderFog = pwrpPrefs.IsFogOn();
    m_bRenderHaze = pwrpPrefs.IsHazeOn();

    // get auto rendering range flag
    m_bAutoRenderingRange = theApp.m_vpViewPrefs[ m_iBuffer].m_bAutoRenderingRange;
    // get rendering range
    m_fRenderingRange = theApp.m_vpViewPrefs[ m_iBuffer].m_fRenderingRange;
    // enable/disable edit render range control depending on auto range flag
    UpdateEditRangeControl();

    // fill values for vertice's combo box
    m_VertexFillType.ResetContent();
    m_VertexFillType.AddString( L"No vertices");
    m_VertexFillType.AddString( L"Vertices ink");
    m_VertexFillType.AddString( L"Polygon color");
    m_VertexFillType.AddString( L"Sector color");
    // fill values for edges's combo box
    m_EdgesFillType.ResetContent();
    m_EdgesFillType.AddString( L"No edges");
    m_EdgesFillType.AddString( L"Edges ink");
    m_EdgesFillType.AddString( L"Polygon color");
    m_EdgesFillType.AddString( L"Sector color");
    // fill values for polygons's combo box
    m_PolygonFillType.ResetContent();
    m_PolygonFillType.AddString( L"No polygons");
    m_PolygonFillType.AddString( L"Polygons ink");
    m_PolygonFillType.AddString( L"Polygon color");
    m_PolygonFillType.AddString( L"Sector color");
    m_PolygonFillType.AddString( L"Texture");
    // fill values for model's texture combo
    m_TextureFillType.ResetContent();
    m_TextureFillType.AddString( L"No fill");
    m_TextureFillType.AddString( L"White color");
    m_TextureFillType.AddString( L"Surface colors");
    m_TextureFillType.AddString( L"On colors");
    m_TextureFillType.AddString( L"Off colors");
    m_TextureFillType.AddString( L"Texture");
    // fill values for flare FX combo
    m_comboFlareFX.ResetContent();
    m_comboFlareFX.AddString( L"None");
    m_comboFlareFX.AddString( L"Single flare");
    m_comboFlareFX.AddString( L"Reflections");
    m_comboFlareFX.AddString( L"Reflections and glare");
  	  
    INDEX iFillType;
    // set current fill type to vertices combo box
    iFillType = pwrpPrefs.GetVerticesFillType();
    m_VertexFillType.SetCurSel( iFillType);
    // set current fill type to edges combo box
    iFillType = pwrpPrefs.GetEdgesFillType();
    m_EdgesFillType.SetCurSel( iFillType);
    // set current fill type to polygons combo box
    iFillType = pwrpPrefs.GetPolygonsFillType();
    m_PolygonFillType.SetCurSel( iFillType);
    // set currently selected modeler's texture rendering type
    ULONG rtRenderType = pmrpPrefs.GetRenderType();
    iFillType = 0;
    if( (rtRenderType & RT_NO_POLYGON_FILL) != 0)       iFillType = 0;
    else if( (rtRenderType & RT_WHITE_TEXTURE) != 0)    iFillType = 1;
    else if( (rtRenderType & RT_SURFACE_COLORS) != 0)   iFillType = 2;
    else if( (rtRenderType & RT_ON_COLORS) != 0)        iFillType = 3;
    else if( (rtRenderType & RT_OFF_COLORS) != 0)       iFillType = 4;
    else if( (rtRenderType & RT_TEXTURE) != 0)          iFillType = 5;
    m_TextureFillType.SetCurSel( iFillType);

    enum CWorldRenderPrefs::LensFlaresType lftFlareFX = pwrpPrefs.GetLensFlares();
    m_comboFlareFX.SetCurSel( (INDEX) lftFlareFX);

    // set model rendering flags
    m_bBoundingBox = pmrpPrefs.BBoxAllVisible();
    m_bHidenLines = pmrpPrefs.HiddenLines();
    m_bShadows = pmrpPrefs.GetShadowQuality() == 0;
    m_bWireFrame = pmrpPrefs.WireOn();
  }

  //{{AFX_DATA_MAP(CDlgRenderingPreferences)
	DDX_Control(pDX, IDC_FLARE_FX, m_comboFlareFX);
	DDX_Control(pDX, IDC_SELECTION_COLOR, m_SelectionColor);
	DDX_Control(pDX, IDC_GRID_COLOR, m_GridColor);
	DDX_Control(pDX, IDC_PAPER_COLOR, m_PaperColor);
	DDX_Control(pDX, IDC_TEXTURE_FILL_TYPE, m_TextureFillType);
	DDX_Control(pDX, IDC_EDGES_FILL_TYPE, m_EdgesFillType);
	DDX_Control(pDX, IDC_POLYGON_FILL_TYPE, m_PolygonFillType);
	DDX_Control(pDX, IDC_VERTEX_FILL_TYPE, m_VertexFillType);
	DDX_Control(pDX, IDC_VERTEX_COLORS, m_VertexColors);
	DDX_Control(pDX, IDC_POLYGON_COLORS, m_PolygonColors);
	DDX_Control(pDX, IDC_EDGES_COLORS, m_EdgesColors);
	DDX_Check(pDX, IDC_BBOX, m_bBoundingBox);
	DDX_Check(pDX, IDC_HIDEN_LINES, m_bHidenLines);
	DDX_Check(pDX, IDC_SHADOWS, m_bShadows);
	DDX_Check(pDX, IDC_WIRE_FRAME, m_bWireFrame);
	DDX_Text(pDX, IDC_RENDERING_RANGE, m_fRenderingRange);
	DDV_MinMaxFloat(pDX, m_fRenderingRange, 1.f, 10000.f);
	DDX_Check(pDX, IDC_AUTO_RENDERING_RANGE, m_bAutoRenderingRange);
	DDX_Check(pDX, IDC_RENDER_EDITOR_MODELS, m_bRenderEditorModels);
	DDX_Check(pDX, IDC_USE_TEXTURE_FOR_BCG, m_bUseTextureForBcg);
	DDX_Check(pDX, IDC_RENDER_FIELDS, m_bRenderFieldBrushes);
	DDX_Check(pDX, IDC_RENDER_FOG, m_bRenderFog);
	DDX_Check(pDX, IDC_RENDER_HAZE, m_bRenderHaze);
	DDX_Check(pDX, IDC_RENDER_MIRRORS, m_bRenderMirrors);
	DDX_Text(pDX, IDC_BCG_PICTURE_T, m_strBcgTexture);
	DDX_Text(pDX, IDC_FAR_CLIP_PLANE, m_fFarClipPlane);
	DDV_MinMaxFloat(pDX, m_fFarClipPlane, -1.f, 1.e+007f);
	DDX_Check(pDX, IDC_APPLY_CLIP_FOR_ISOMETRIC, m_bApplyFarClipInIsometricProjection);
	//}}AFX_DATA_MAP

  // if dialog is giving data
  if( pDX->m_bSaveAndValidate != FALSE)
  {
    // set auto rendering range flag
    theApp.m_vpViewPrefs[ m_iBuffer].m_bAutoRenderingRange = m_bAutoRenderingRange;

    // set rendering range
    theApp.m_vpViewPrefs[ m_iBuffer].m_fRenderingRange = m_fRenderingRange;

    // set drawing of editor models on or off
    pwrpPrefs.SetEditorModelsOn( m_bRenderEditorModels);
    // set render field brushes flag
    pwrpPrefs.SetFieldBrushesOn( m_bRenderFieldBrushes);
    // set use texture for background flag
    pwrpPrefs.SetBackgroundTextureOn( m_bUseTextureForBcg);

    pwrpPrefs.SetMirrorsOn( m_bRenderMirrors);
    pwrpPrefs.SetFogOn( m_bRenderFog);
    pwrpPrefs.SetHazeOn( m_bRenderHaze);

    // enable/disable edit render range control depending on auto range flag
    UpdateEditRangeControl();

    // set colors
    pwrpPrefs.SetVerticesInkColor( m_VertexColors.GetColor());
    pwrpPrefs.SetEdgesInkColor( m_EdgesColors.GetColor());
    pwrpPrefs.SetPolygonsInkColor( m_PolygonColors.GetColor());
    theApp.m_vpViewPrefs[ m_iBuffer].m_PaperColor = m_PaperColor.GetColor();
    theApp.m_vpViewPrefs[ m_iBuffer].m_GridColor = m_GridColor.GetColor();
    theApp.m_vpViewPrefs[ m_iBuffer].m_SelectionColor = m_SelectionColor.GetColor();
    pwrpPrefs.wrp_fFarClipPlane=m_fFarClipPlane;
    pwrpPrefs.wrp_bApplyFarClipPlaneInIsometricProjection=m_bApplyFarClipInIsometricProjection;
    enum CWorldRenderPrefs::FillType ftFillType;
    // get current fill type from vertices combo box
    ftFillType = (enum CWorldRenderPrefs::FillType) m_VertexFillType.GetCurSel();
    pwrpPrefs.SetVerticesFillType( ftFillType);
    // get current fill type from edges combo box
    ftFillType = (enum CWorldRenderPrefs::FillType) m_EdgesFillType.GetCurSel();
    pwrpPrefs.SetEdgesFillType( ftFillType);
    // get current fill type from polygons combo box
    ftFillType = (enum CWorldRenderPrefs::FillType) m_PolygonFillType.GetCurSel();
    pwrpPrefs.SetPolygonsFillType( ftFillType);

    enum CWorldRenderPrefs::LensFlaresType lftFlares;
    // get type for rendering flares
    lftFlares = (enum CWorldRenderPrefs::LensFlaresType) m_comboFlareFX.GetCurSel();
    pwrpPrefs.SetLensFlaresType( lftFlares);

    // get current model's texturizing type from model's texture combo box
    ULONG ulMdlFillType;
    ulMdlFillType = m_TextureFillType.GetCurSel();
    switch( ulMdlFillType)
    {
      case 0: {
        pmrpPrefs.SetRenderType( RT_NO_POLYGON_FILL);
        break;
      }
      case 1: {
        pmrpPrefs.SetRenderType( RT_WHITE_TEXTURE);
        break;
      }
      case 2: {
        pmrpPrefs.SetRenderType( RT_SURFACE_COLORS);
        break;
      }
      case 3: {
        pmrpPrefs.SetRenderType( RT_ON_COLORS);
        break;
      }
      case 4: {
        pmrpPrefs.SetRenderType( RT_OFF_COLORS);
        break;
      }
      case 5: {
        pmrpPrefs.SetRenderType( RT_TEXTURE);
        break;
      }
      default: {
        ASSERTALWAYS( "Invalid selection found in model's texture combo box");
      }
    }
    // get rest of model's rendering preferences
    pmrpPrefs.SetWire( m_bWireFrame);
    pmrpPrefs.SetHiddenLines( m_bHidenLines);
    pmrpPrefs.BBoxAllShow( m_bBoundingBox);
    if( m_bShadows) {
      pmrpPrefs.SetShadowQuality( 0);
    } else {
      pmrpPrefs.SetShadowQuality( 255);
    }
  }
}
Esempio n. 10
0
void CScriptView::OnScriptMakeModel() 
{
	// First we save script file
  CModelerDoc *pDoc = (CModelerDoc *) GetDocument();
  CTFileName fnScriptName = CTString(pDoc->GetPathName());

  CTFileName fnModelName = fnScriptName.FileDir() + fnScriptName.FileName() + ".mdl";
  try
  {
    fnScriptName.RemoveApplicationPath_t();
  }
  catch( char *err_str)
  {
    AfxMessageBox( err_str);
    return;
  }
  pDoc->OnSaveDocument( pDoc->GetPathName());

	// close mdl document with same name
  POSITION pos = theApp.m_pdtModelDocTemplate->GetFirstDocPosition();
  while (pos!=NULL)
  {
    CModelerDoc *pmdCurrent = (CModelerDoc *)theApp.m_pdtModelDocTemplate->GetNextDoc(pos);
    if( CTFileName( CTString(pmdCurrent->GetPathName())) == fnModelName)
    {
      pmdCurrent->OnCloseDocument();
      break;
    }
  }

	// Now we will create one instance of new document of type CModelerDoc
  CDocument* pDocument = theApp.m_pdtModelDocTemplate->CreateNewDocument();
 	if (pDocument == NULL)
	{
		TRACE0("CDocTemplate::CreateNewDocument returned NULL.\n");
		AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
		return;
	}
	ASSERT_VALID(pDocument);
	
  BOOL bAutoDelete = pDocument->m_bAutoDelete;
	pDocument->m_bAutoDelete = FALSE;   // don't destroy if something goes wrong
	CFrameWnd* pFrame = theApp.m_pdtModelDocTemplate->CreateNewFrame(pDocument, NULL);
	pDocument->m_bAutoDelete = bAutoDelete;
	if (pFrame == NULL)
	{
		AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
		delete pDocument;       // explicit delete on error
		return;
	}
	ASSERT_VALID(pFrame);

  pDocument->SetPathName( fnModelName, FALSE);
  pDocument->SetTitle( fnModelName.FileName() + fnModelName.FileExt());
  
  char strError[ 256];
  if( !((CModelerDoc *)pDocument)->CreateModelFromScriptFile( fnScriptName, strError))
  {
    pDocument->OnCloseDocument();
    AfxMessageBox( strError);
    return;
  }
	theApp.m_pdtModelDocTemplate->InitialUpdateFrame(pFrame, pDocument, TRUE);
  ((CModelerDoc *)pDocument)->m_emEditModel.edm_md.md_bPreparedForRendering = FALSE;
  pDocument->SetModifiedFlag();

  // add textures from .ini file
  CTFileName fnIniFileName = fnScriptName.NoExt() + ".ini";
  try
  {
    ((CModelerDoc *)pDocument)->m_emEditModel.CSerial::Load_t(fnIniFileName);
  }
  catch( char *strError)
  {
    // ignore errors
    (void) strError;
  }
}