Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

[DX 9.0] SCENES EN WINDOWED : SIMPLES ET MULTIPLES AVEC SWAPCHAINS


Information sur la source

Catégorie :DirectX Niveau : Initié Date de création : 18/08/2004 Date de mise à jour : 18/08/2004 18:31:52 Vu / téléchargé: 3 392 / 255

Note :
Aucune note

Commentaire sur cette source (1)
Ajouter un commentaire et/ou une note

Description

Bonjours tout le monde !

Ce code est divisé en deux parties :
- Un répertoire montrant comment rendre une scéne sur autre chose qu'une fenêtre compléte ou en fullscreen (aussi bien un bouton qu'une picture box). Etant donné que j'ai eu un mal fou à rendre une scéne avec DirectX sur autre chose qu'une fenêtre entiére, je me suis dit que je pouvais vous en faire profiter ici.

- Un autre répertoire présentant cette fois-ci le rendu sur DES composants. Il y a deux techniques pour rendre plusieurs scénes (ou la même mais sous un autre angle, ou le même:D). La premiére, celle déjà posté sur le site il me semble est celle de la création d'autant de devices que deux scénes. Cette technique est simple mais hyper couteuse.
La seconde, celle employée ici, est celle des SwapChains. Elle est inspirée en partie de l'exemple de codesampler (modifié, et remis à ma sauceuh). Cette méthode présente l'avantage d'être peu couteuse, et surtout assez facilement extensible à n scénes.
 

Source

  • //CODE DU SECOND REPERTOIRE
  • //MAIN.CPP UNIQUEMENT (RESTE DANS LE ZIP)
  • #include <windows.h>
  • #include <commctrl.h>
  • #include "DXUtils.h"
  • #include "resource.h"
  • #define SAFE_RELEASE(a) if(a){a->Release();a=NULL;}
  • #define SAFE_RELEASE_ARRAY(a) if(a){delete [] a;a = NULL;}
  • extern HWND g_hDlg;
  • HWND g_hPicture1;
  • HWND g_hPicture2;
  • char g_FPS[6];
  • bool g_CallBoucle = true;
  • SFontProperties* g_FontTab = NULL;
  • bool Update1()
  • {
  • static float CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);
  • if( DXUtil_Timer(TIMER_GETABSOLUTETIME)-CurrentTime>0.015f )//64 fps ( 1/fps. calculé par 1/66 mais a cause des arrondis on a 64fps)
  • {
  • srand((unsigned int)timeGetTime()); //On réinitialise le hasard.
  • //-----------Préparation des variables d'affichage------
  • static float Timer = 0.0f;
  • static float dwFrames = 0.0f;
  • CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);
  • //-----------Préparation du device pour l'affichage-----
  • DXUtil_Timer(TIMER_START);
  • g_MainSwapChain->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&g_Surf);
  • g_Device->SetRenderTarget(0,g_Surf);
  • g_Device->Clear(NULL,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
  • g_Device->BeginScene();
  • PrintText("Premiere fenetre",-1,-1,D3DCOLOR_ARGB(255,255,0,0),1);
  • dwFrames++;
  • PrintText(g_FPS,0,0,D3DCOLOR_ARGB(255,0,255,0),1);
  • //FPS
  • if( CurrentTime-Timer > 1.0f )
  • {
  • sprintf(g_FPS,"%.2f",dwFrames / (CurrentTime - Timer));
  • dwFrames = 0;
  • Timer = CurrentTime;
  • }
  • //-----------Affichage de la frame----------------------
  • g_Device->EndScene();
  • g_MainSwapChain->Present(NULL,NULL,g_hPicture1,NULL,0);
  • }
  • return true;
  • }
  • bool Update2()
  • {
  • static float CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);
  • if( DXUtil_Timer(TIMER_GETABSOLUTETIME)-CurrentTime>0.015f )//64 fps ( 1/fps. calculé par 1/66 mais a cause des arrondis on a 64fps)
  • {
  • srand((unsigned int)timeGetTime()); //On réinitialise le hasard.
  • //-----------Préparation des variables d'affichage------
  • static float Timer = 0.0f;
  • static float dwFrames = 0.0f;
  • CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);
  • //-----------Préparation du device pour l'affichage-----
  • DXUtil_Timer(TIMER_START);
  • g_SecondSwapChain->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&g_Surf);
  • g_Device->SetRenderTarget(0,g_Surf);
  • g_Device->Clear(NULL,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
  • g_Device->BeginScene();
  • PrintText("Seconde fenetre",-1,-1,D3DCOLOR_ARGB(255,255,0,0),1);
  • dwFrames++;
  • PrintText(g_FPS,0,0,D3DCOLOR_ARGB(255,0,255,0),1);
  • //FPS
  • if( CurrentTime-Timer > 1.0f )
  • {
  • sprintf(g_FPS,"%.2f",dwFrames / (CurrentTime - Timer));
  • dwFrames = 0;
  • Timer = CurrentTime;
  • }
  • //-----------Affichage de la frame----------------------
  • g_Device->EndScene();
  • g_SecondSwapChain->Present(NULL,NULL,g_hPicture2,NULL,0);
  • }
  • return true;
  • }
  • bool CenterDlg(HWND hWnd)
  • {
  • RECT l_Dim;
  • int l_ScreenWidth = GetSystemMetrics(SM_CXSCREEN);
  • int l_ScreenHeight = GetSystemMetrics(SM_CYSCREEN);
  • GetWindowRect(hWnd,&l_Dim);
  • int l_AppWidth = l_Dim.right - l_Dim.left;
  • int l_AppHeight = l_Dim.bottom - l_Dim.top;
  • //Center the window
  • SetWindowPos(hWnd,HWND_TOP,(l_ScreenWidth-l_AppWidth)/2,
  • (l_ScreenHeight-l_AppHeight)/2,
  • l_AppWidth,
  • l_AppHeight,
  • SWP_SHOWWINDOW);
  • return true;
  • }
  • LRESULT CALLBACK DlgProc(HWND DlgProc, UINT msg, WPARAM wParam, LPARAM lParam)
  • {
  • switch(msg)
  • {
  • case WM_CLOSE:
  • DestroyWindow(DlgProc);
  • break;
  • case WM_DESTROY:
  • PostQuitMessage(0);
  • break;
  • case WM_INITDIALOG:
  • break;
  • case WM_COMMAND:
  • switch(HIWORD(wParam))
  • {
  • case BN_CLICKED:
  • switch(LOWORD(wParam))
  • {
  • case IDCANCEL:
  • DestroyWindow(DlgProc);
  • break;
  • }
  • break;
  • }
  • break;
  • default:
  • return FALSE;
  • }
  • return FALSE;
  • }
  • int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  • LPSTR lpCmdLine, int nCmdShow)
  • {
  • MSG Msg;
  • g_hDlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MAINFORM), NULL, (DLGPROC) DlgProc);
  • CenterDlg(g_hDlg);
  • RECT rc;
  • //GetWindowRect(g_hDlg,&rc);
  • //les deux sont possibles
  • GetWindowRect(GetDlgItem(g_hDlg,IDC_PICTURE2),&rc);
  • InitDGraphics(rc.right-rc.left,rc.bottom-rc.top,32);
  • if(g_hDlg == NULL)
  • {
  • MessageBox(NULL, "Window Creation Failed!", "Error!",
  • MB_ICONEXCLAMATION | MB_OK);
  • return 0;
  • }
  • //-----Création et initialisation des polices
  • g_FontTab = LoadFonts(g_FontTab,"FontList.wbf");
  • if( g_FontTab == NULL )
  • {
  • MessageBox(g_hDlg,"Impossible d'initialiser les polices !","Erreur fatale !",MB_ICONHAND);
  • return -1;
  • }
  • else
  • {
  • HFONT l_TmpFont;
  • g_FontList = new LPD3DXFONT[g_NumbOfFonts];
  • for(int k=0 ; k<g_NumbOfFonts ; k++)
  • {
  • l_TmpFont = CreateFont( g_FontTab[k].m_Size, //taille de la police : 10, 12, 16, etc
  • 0, 0, 0,
  • g_FontTab[k].m_Flag, //texte gras ou non
  • g_FontTab[k].m_Italic, //italique : true ou false
  • g_FontTab[k].m_Underlined, //souligné : true ou false
  • FALSE,
  • ANSI_CHARSET,
  • OUT_DEFAULT_PRECIS,
  • CLIP_DEFAULT_PRECIS,
  • ANTIALIASED_QUALITY,
  • VARIABLE_PITCH,
  • g_FontTab[k].m_Name);
  • D3DXCreateFont( g_Device, l_TmpFont, &g_FontList[k] );
  • DeleteObject( l_TmpFont );
  • }
  • }
  • InitCommonControls();
  • ShowWindow(g_hDlg, nCmdShow);
  • UpdateWindow(g_hDlg);
  • g_hPicture1 = GetDlgItem(g_hDlg,IDC_PICTURE);
  • g_hPicture2 = GetDlgItem(g_hDlg,IDC_PICTURE2);
  • while(g_CallBoucle)
  • {
  • //pour les erreurs non debug
  • if( PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE) )
  • {
  • if ( !GetMessage(&Msg, NULL, 0, 0) ) g_CallBoucle=false;
  • DispatchMessage(&Msg);
  • }
  • else
  • {
  • if( !Update1() || !Update2() )
  • g_CallBoucle=false;
  • }
  • }
  • for(int i=0;i<g_NumbOfFonts;i++)
  • g_FontList[i]->Release();
  • SAFE_RELEASE_ARRAY(g_FontList);
  • SAFE_RELEASE_ARRAY(g_FontTab);
  • SAFE_RELEASE(g_Surf);
  • SAFE_RELEASE(g_MainSwapChain);
  • SAFE_RELEASE(g_SecondSwapChain);
  • SAFE_RELEASE(g_Device);
  • SAFE_RELEASE(g_D3D);
  • return Msg.wParam;
  • }
//CODE DU SECOND REPERTOIRE
//MAIN.CPP UNIQUEMENT (RESTE DANS LE ZIP)

#include <windows.h>
#include <commctrl.h>
#include "DXUtils.h"
#include "resource.h"


#define SAFE_RELEASE(a) if(a){a->Release();a=NULL;}
#define SAFE_RELEASE_ARRAY(a) if(a){delete [] a;a = NULL;} 


extern HWND g_hDlg;
HWND g_hPicture1;
HWND g_hPicture2;
char g_FPS[6];
bool g_CallBoucle = true;
SFontProperties* g_FontTab = NULL;	


bool Update1()
{
	static float CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);

	if( DXUtil_Timer(TIMER_GETABSOLUTETIME)-CurrentTime>0.015f )//64 fps ( 1/fps. calculé par 1/66 mais a cause des arrondis on a 64fps)
	{
		srand((unsigned int)timeGetTime());	//On réinitialise le hasard.

		//-----------Préparation des variables d'affichage------
		static float Timer = 0.0f;
		static float dwFrames = 0.0f;
		CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);

		//-----------Préparation du device pour l'affichage-----
		DXUtil_Timer(TIMER_START);

		g_MainSwapChain->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&g_Surf);
		g_Device->SetRenderTarget(0,g_Surf);

		g_Device->Clear(NULL,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
		g_Device->BeginScene();

		PrintText("Premiere fenetre",-1,-1,D3DCOLOR_ARGB(255,255,0,0),1);

		dwFrames++;
		PrintText(g_FPS,0,0,D3DCOLOR_ARGB(255,0,255,0),1);
		
		//FPS
		if( CurrentTime-Timer > 1.0f )
		{
			sprintf(g_FPS,"%.2f",dwFrames / (CurrentTime - Timer));
			dwFrames = 0;
			Timer = CurrentTime;
		}

		//-----------Affichage de la frame----------------------

		g_Device->EndScene();
		g_MainSwapChain->Present(NULL,NULL,g_hPicture1,NULL,0);
	}
	return true;
}

bool Update2()
{
	static float CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);

	if( DXUtil_Timer(TIMER_GETABSOLUTETIME)-CurrentTime>0.015f )//64 fps ( 1/fps. calculé par 1/66 mais a cause des arrondis on a 64fps)
	{
		srand((unsigned int)timeGetTime());	//On réinitialise le hasard.

		//-----------Préparation des variables d'affichage------
		static float Timer = 0.0f;
		static float dwFrames = 0.0f;
		CurrentTime = DXUtil_Timer(TIMER_GETABSOLUTETIME);

		//-----------Préparation du device pour l'affichage-----
		DXUtil_Timer(TIMER_START);

		g_SecondSwapChain->GetBackBuffer(0,D3DBACKBUFFER_TYPE_MONO,&g_Surf);
		g_Device->SetRenderTarget(0,g_Surf);

		g_Device->Clear(NULL,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
		g_Device->BeginScene();

		PrintText("Seconde fenetre",-1,-1,D3DCOLOR_ARGB(255,255,0,0),1);

		dwFrames++;
		PrintText(g_FPS,0,0,D3DCOLOR_ARGB(255,0,255,0),1);
		
		//FPS
		if( CurrentTime-Timer > 1.0f )
		{
			sprintf(g_FPS,"%.2f",dwFrames / (CurrentTime - Timer));
			dwFrames = 0;
			Timer = CurrentTime;
		}

		//-----------Affichage de la frame----------------------

		g_Device->EndScene();
		g_SecondSwapChain->Present(NULL,NULL,g_hPicture2,NULL,0);
	}
	return true;
}

bool CenterDlg(HWND hWnd)
{
 RECT l_Dim;
 int l_ScreenWidth = GetSystemMetrics(SM_CXSCREEN);
 int l_ScreenHeight = GetSystemMetrics(SM_CYSCREEN);
 
 GetWindowRect(hWnd,&l_Dim); 
 int l_AppWidth = l_Dim.right - l_Dim.left;
 int l_AppHeight = l_Dim.bottom - l_Dim.top;
 
 //Center the window
 SetWindowPos(hWnd,HWND_TOP,(l_ScreenWidth-l_AppWidth)/2,
							    (l_ScreenHeight-l_AppHeight)/2,
							    l_AppWidth,
							    l_AppHeight,
							    SWP_SHOWWINDOW);

 return true;
}

LRESULT CALLBACK DlgProc(HWND DlgProc, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch(msg)
 { 
 case WM_CLOSE:
  DestroyWindow(DlgProc); 
 break;
 case WM_DESTROY:
   PostQuitMessage(0);
 break;
 case WM_INITDIALOG:
 break;
 case WM_COMMAND: 
  switch(HIWORD(wParam))
  {
   case BN_CLICKED:
    switch(LOWORD(wParam))
	{
     case IDCANCEL:
      DestroyWindow(DlgProc);
     break;
	}
   break;
  }
 break;

 default:
  return FALSE;
 }

 return FALSE;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG Msg;

g_hDlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_MAINFORM), NULL, (DLGPROC) DlgProc);

CenterDlg(g_hDlg);

RECT rc;
//GetWindowRect(g_hDlg,&rc);
//les deux sont possibles
GetWindowRect(GetDlgItem(g_hDlg,IDC_PICTURE2),&rc);

InitDGraphics(rc.right-rc.left,rc.bottom-rc.top,32);


if(g_hDlg == NULL)
 {
 MessageBox(NULL, "Window Creation Failed!", "Error!",
 MB_ICONEXCLAMATION | MB_OK);
 return 0;
 }

//-----Création et initialisation des polices
	g_FontTab = LoadFonts(g_FontTab,"FontList.wbf");
	
	if( g_FontTab == NULL )
	{
		MessageBox(g_hDlg,"Impossible d'initialiser les polices !","Erreur fatale !",MB_ICONHAND);
		return -1;
	}
	else
	{
		HFONT l_TmpFont;
		g_FontList = new LPD3DXFONT[g_NumbOfFonts];

		for(int k=0 ; k<g_NumbOfFonts ; k++)
		{
			l_TmpFont = CreateFont( g_FontTab[k].m_Size,		//taille de la police : 10, 12, 16, etc
								  0, 0, 0,
								  g_FontTab[k].m_Flag,			//texte gras ou non
								  g_FontTab[k].m_Italic,		//italique : true ou false
								  g_FontTab[k].m_Underlined,    //souligné : true ou false
								  FALSE,
								  ANSI_CHARSET,
								  OUT_DEFAULT_PRECIS,
								  CLIP_DEFAULT_PRECIS,
								  ANTIALIASED_QUALITY,
								  VARIABLE_PITCH,
								  g_FontTab[k].m_Name);

			D3DXCreateFont( g_Device, l_TmpFont, &g_FontList[k] );
			DeleteObject( l_TmpFont );
		}
	}

InitCommonControls();
ShowWindow(g_hDlg, nCmdShow);
UpdateWindow(g_hDlg);

g_hPicture1 = GetDlgItem(g_hDlg,IDC_PICTURE);
g_hPicture2 = GetDlgItem(g_hDlg,IDC_PICTURE2);


	while(g_CallBoucle)
	{
	//pour les erreurs non debug
		if( PeekMessage(&Msg, NULL, 0, 0, PM_NOREMOVE) )
		{
			if ( !GetMessage(&Msg, NULL, 0, 0) ) g_CallBoucle=false;
				DispatchMessage(&Msg);
		}
		else
		{
			if( !Update1() || !Update2() )
				g_CallBoucle=false;
		}
	}


	for(int i=0;i<g_NumbOfFonts;i++)
		g_FontList[i]->Release();

	SAFE_RELEASE_ARRAY(g_FontList);
	SAFE_RELEASE_ARRAY(g_FontTab);

	SAFE_RELEASE(g_Surf);
	SAFE_RELEASE(g_MainSwapChain);
	SAFE_RELEASE(g_SecondSwapChain);
	SAFE_RELEASE(g_Device);
	SAFE_RELEASE(g_D3D);

 return Msg.wParam;
} 

Conclusion

L'exe de "Rendu logiciel" foire en Release (mais marche en Debug) :S
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  •   Rendu composant
    • DXUtils.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier11 770 octets
    • FontList.wbfTélécharger ce fichier [Réservé aux membres club]115 octets
    • main.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier4 651 octets
    • RenduCpt.dspTélécharger ce fichier [Réservé aux membres club]Voir ce fichier4 454 octets
    • RenduCpt.dswTélécharger ce fichier [Réservé aux membres club]Voir ce fichier541 octets
    • RenduCpt.ncbTélécharger ce fichier [Réservé aux membres club]50 176 octets
    • RenduCpt.optTélécharger ce fichier [Réservé aux membres club]50 688 octets
    • RenduCpt.plgTélécharger ce fichier [Réservé aux membres club]1 402 octets
    • resource.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier639 octets
    • Script1.apsTélécharger ce fichier [Réservé aux membres club]32 544 octets
    • Script1.rcTélécharger ce fichier [Réservé aux membres club]Voir ce fichier2 603 octets
    • StructsDef.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier635 octets
    • SwapChains.ncbTélécharger ce fichier [Réservé aux membres club]50 176 octets
    • SwapChains.optTélécharger ce fichier [Réservé aux membres club]48 640 octets
    • SwapChains.plgTélécharger ce fichier [Réservé aux membres club]1 017 octets
    • Test.ncbTélécharger ce fichier [Réservé aux membres club]58 368 octets
    • Test.optTélécharger ce fichier [Réservé aux membres club]49 664 octets
    • Test.plgTélécharger ce fichier [Réservé aux membres club]993 octets
  •   SwapChains
    • DXUtils.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier11 879 octets
    • FontList.wbfTélécharger ce fichier [Réservé aux membres club]115 octets
    • main.cppTélécharger ce fichier [Réservé aux membres club]Voir ce fichier6 140 octets
    • resource.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier639 octets
    • Script1.apsTélécharger ce fichier [Réservé aux membres club]17 980 octets
    • Script1.rcTélécharger ce fichier [Réservé aux membres club]Voir ce fichier2 736 octets
    • StructsDef.hTélécharger ce fichier [Réservé aux membres club]Voir ce fichier635 octets
    • SwapChains.dspTélécharger ce fichier [Réservé aux membres club]Voir ce fichier4 472 octets
    • SwapChains.dswTélécharger ce fichier [Réservé aux membres club]Voir ce fichier545 octets
    • SwapChains.exeTélécharger ce fichier [Réservé aux membres club]307 200 octets
    • SwapChains.ncbTélécharger ce fichier [Réservé aux membres club]58 368 octets
    • SwapChains.optTélécharger ce fichier [Réservé aux membres club]48 640 octets
    • SwapChains.plgTélécharger ce fichier [Réservé aux membres club]1 247 octets
    • Test.ncbTélécharger ce fichier [Réservé aux membres club]58 368 octets
    • Test.optTélécharger ce fichier [Réservé aux membres club]49 664 octets
    • Test.plgTélécharger ce fichier [Réservé aux membres club]993 octets

Télécharger le zip

Historique

18 août 2004 18:31:52 :
zip peux etre ?

Commentaires et avis

signaler à un administrateur
Commentaire de Xs le 18/08/2004 18:04:37

Le zip a pas été uploadé grr

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.