Début de moteur 3d

Description

Bon ben... voilà un moteur 3D (encore un)
Il s'appelle Chakra Engine en théorie (parce qu'il devait servir à un jeu qui s'appelle Chakra Meltdown, merci de ne pas rire du nom ridicule)
Il supporte DirectX/OpenGL et éventuellement un mode software (qui ne marche pas)
Sous DirectX les textures ne fonctionnent pas (je ne sais pas non plus pourquoi) car mal envoyées à la carte graphique je pense

Quand vous choisissez le mode : la différence entre OpenGL et OpenGLVBO est que le deuxième fonctionne plus comme DirectX avec l'envoi des buffers vers la carte graphique et tout, donc si OpenGLVBO marche pas, mettez OpenGL

Le zip ne contient que le moteur et le code que je mets ici permet de tester mais vous pouvez écrire le votre très simplement, il faut juste inclure le .lib (dans le projet) et chakraengine.h (dans chaque fichier) qui sont dans le répertoire "Fichiers" du zip

Le programme de test (cf la capture d'écran pour le résultat) tourne environ à 50 fps sur mon Athlon XP 2600+ Radeon 9200

J'ai mis en commentaire dans le code les lignes utilisant textures, models, etc que je ne fournis pas avec (taille trop volumineuse)

Source / Exemple :


/* Voici le code d'un programme de test du moteur */

#include <windows.h>
#include "..\moteur\include\chakraengine.h"

#ifdef _DEBUG
#pragma comment(lib, "..\\moteur\\debug\\lib\\ChakraEngine.lib")
#else
#pragma comment(lib, "..\\moteur\\lib\\ChakraEngine.lib")
#endif

ce::ChakraEngineDevice* device;
ce::Scene* scene;
ce::objects::Camera* camera;
ce::objects::Light* light;
ce::objects::Object* object;
ce::objects::Object* object2;

LRESULT CALLBACK wnproc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	static PAINTSTRUCT ps;
	POINT* pt = new POINT;
	GetCursorPos(pt);

	switch(uMsg) {
		case WM_CLOSE:
			PostQuitMessage(0);
			return 0;

		case WM_KEYDOWN:
			switch(wParam) {
				case VK_DOWN:
					camera->advanceInCameraDirection(-2);
					break;
				case VK_UP:
					camera->advanceInCameraDirection(2);
					break;
			}
			return 0;

		case WM_LBUTTONUP:
			break;

		case WM_PAINT:
			device->render(scene);
			BeginPaint(hWnd, &ps);
			EndPaint(hWnd, &ps);
			return 0;
	}

	delete pt;

	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	try {
		device = ce::createDevice(ce::CE_OPENGLVBO, wnproc, 800, 600, 32, false);
		device->setViewDistance(1024);

		scene = ce::createScene();

		camera = ce::objects::createCamera();
		camera->setPosition(ce::unites::vector3df(20, 45, 15));
		camera->setTarget(ce::unites::vector3df(59, 120, 34));

		light = ce::objects::createLight(ce::objects::CE_LIGHT_DIRECTIONAL);
		light->setDirection(ce::unites::vector3df(0.0f, -0.8f, 0.0f));
		light->setColor(ce::unites::Color(255, 235, 235, 255));

		//object = ce::objects::createObjectFromMesh(ce::objects::createTerrainMesh(ce::resources::createTextureFromJPEG("worldl.jpg"), 256, 256, 64));
		object = ce::objects::createCubeMesh(2); // cette ligne sert à ce que vous pouvez compilez
		object->setScale(ce::unites::vector3df(2.0f, 1.0f, 2.0f));
		//object->setTexture(ce::resources::createTextureFromJPEG("worldt.jpg"));
		object->getMaterial()->setAmbient(ce::unites::Color(128, 128, 128, 255));
		object->getMaterial()->setDiffuse(ce::unites::Color(255, 255, 255, 255));
		object->getMaterial()->setSpecular(ce::unites::Color(255, 255, 255, 255));
		object->setPosition(ce::unites::vector3df(0, 0, 0));

		//object2 = ce::objects::createObjectFromMesh(ce::objects::createMeshFromMD2("dino.md2"));
		object2 = ce::objects::createCubeMesh(5); // cette ligne sert à ce que vous pouvez compilez
		//object2->setTexture(ce::resources::createTextureFromJPEG("dino.jpg"));
		object2->getMaterial()->setAmbient(ce::unites::Color(128, 128, 128, 128));
		object2->getMaterial()->setDiffuse(ce::unites::Color(255, 255, 255, 255));
		object2->getMaterial()->setSpecular(ce::unites::Color(255, 255, 255, 255));
		object2->setRotation(ce::unites::vector3df(270, 0, 0));
		object2->setPosition(ce::unites::vector3df(0, 50, 0));

		scene->setCurrentCamera(camera);

		scene->addObject(object);
		scene->addObject(object2);

		scene->addLight(light);
		scene->setAmbientLight(ce::unites::Color(255, 255, 255, 255));

		int dinoframe = 0;

		while(true) {
			MSG msg;
			if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
				if (msg.message == WM_QUIT) {
					break;
				} else {
					TranslateMessage(&msg);
					DispatchMessage(&msg);
				}
			} else {
				SetWindowText(device->getWindow(), String(String("Chakra Engine - Demonstration - WIP: ") + String(__DATE__) + " (" + String(__TIME__) + ") - Using " + device->getName() + " - FPS: " + String(device->getFPS())).c_str());

				RECT rc;
				GetWindowRect(device->getWindow(), &rc);
				camera->adaptAsFPSCamera((rc.right - rc.left) / 2, (rc.bottom - rc.top) / 2);

				/*object2->getMesh()->loadFrame(dinoframe);
				if (++dinoframe >= object2->getMesh()->getFramesCount())
					dinoframe = 0;*/

				device->beginRendering();
				device->render(scene);
				device->endRendering();
			}
		}
	} catch(ce::system::Error* err) {
		MessageBox(NULL, err->what(), "Error", NULL);
	}
}

Conclusion :


Encore beaucoup de bugs et beaucoup de passages où c'est mal foutu (presque aucun const, plein de int à la place de unsigned int, etc.)

Il y a plein de commandes qui sont là mais qui ne marchent pas (skybox, dessiner une image 2D, etc.) parce que j'avais modifié pleins de trucs et que je n'ai pas encore remis

Notez que la rentrée est dans une semaine et que je n'aurai plus le temps de travailler dessus après (je suis en terminale avec 5 * 8 heures par semaine, ok on a des perms sauf que je suis pas chez moi pendant les perms ^^ )

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.