Salut,
j'ai trouvé que ça pourrait être de sympa de pouvoir dessiner des objets en 3D mais avec la simplicité qu'offre SFML.
C'est donc ce pourquoi j'ai décidé de commencer à coder une nouvelle bibliothèque se basant sur SFML, et j'en ai profiter pour mixer tout cela avec du code source de mon autre projet.
Je compte rajouter aussi de la génération de terrain, le chargements de différents formats d'objets 3D (.obj, .md2, .3ds, etc...), de la gestion de collision, etc... (Mais ça se sera pour bien plus tard car je dois terminé mon autre projet)
Etant donné que se projet se base sur la SFML, et utilise SFML, la syntaxe sera la même que celle présentée dans les tutoriels de la SFML.
Il y a juste que les objets transformables et dessinables devront hérité de DynamicDrawableEntity et les objets dessinable non transformable de DrawableEntity.
Un autre changement aussi, pour combiner les transformations si vous voulez faire des graphes de scene, il faudra mettre states.combinedTransform à true, au lieu de combiner directement les transformations dans la méthode draw. (Ceci à été fait pour des raisons d'optimisation, en laissant le soin à opengl (et non au framework) de combiner lui même les transformations)
Bref, voici un exemple de code source qui dessine un cube avec le framework avec une caméra "freefly".
#include "myRenderWindow.h"
#include <SFML/Window/Event.hpp>
using namespace sf3;
MyRenderWindow::MyRenderWindow (Vec2f size, std::string title) :
RenderWindow(sf::VideoMode(size.x, size.y), title, Style::Default, ContextSettings(32)),
cube(Vec3f(-1, 1, 1), 2, 2, 2, Color(255, 0, 0)) {
cube.rotate(45,Vec3f(0, 1, 0));
view = getDefaultView();
view->move(0, 0, 10);
speed = 10.f;
sensivity = 0.2f;
oldX = Mouse::getPosition(*this).x;
oldY = Mouse::getPosition(*this).y;
verticalMotionActive = false;
verticalMotionDirection = 0;
}
void MyRenderWindow::show () {
while(isOpen()) {
sf::Event event;
while (pollEvent(event))
{
if (event.type == sf::Event::Closed)
{
close();
}
else if (event.type == sf::Event::Resized)
{
// on ajuste le viewport lorsque la fenêtre est redimensionnée
view->reset(FloatRect(0, 0, event.size.width, event.size.height));
} else if (event.type == sf::Event::MouseMoved && sf::Mouse::isButtonPressed(Mouse::Right)) {
int relX = event.mouseMove.x - oldX;
int relY = event.mouseMove.y - oldY;
int teta = view->getTeta() - relX;
int phi = view->getPhi() - relY;
view->rotate(teta, phi);
oldX = event.mouseMove.x;
oldY = event.mouseMove.y;
} else if (event.type == sf::Event::MouseWheelMoved) {
if (event.mouseWheel.delta > 0) {
verticalMotionActive = true;
verticalMotionDirection = 1;
timeBeforeStoppingVerticalMotion = milliseconds(250);
clock2.restart();
} else if (event.mouseWheel.delta < 0) {
verticalMotionActive = true;
verticalMotionDirection = -1;
timeBeforeStoppingVerticalMotion = milliseconds(250);
clock2.restart();
}
}
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) {
view->move(view->getForward(), speed * clock.getElapsedTime().asSeconds());
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) {
view->move(view->getForward(), -speed * clock.getElapsedTime().asSeconds());
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) {
view->move(view->getLeft(), -speed * clock.getElapsedTime().asSeconds());
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) {
view->move(view->getLeft(), speed * clock.getElapsedTime().asSeconds());
}
oldX = Mouse::getPosition(*this).x;
oldY = Mouse::getPosition(*this).y;
if (clock2.getElapsedTime() > timeBeforeStoppingVerticalMotion) {
verticalMotionActive = false;
verticalMotionDirection = 0;
} else {
timeBeforeStoppingVerticalMotion -= clock2.getElapsedTime();
}
view->move(0, verticalMotionDirection * speed * clock2.getElapsedTime().asSeconds(), 0);
clear(Color::Black);
draw(cube);
display();
clock.restart();
}
}
#include "Graphics/myRenderWindow.h"
int main() {
MyRenderWindow renderWindow(Vec2f(800, 600),"SFML3D");
renderWindow.show();
return 0;
}
Pour le moment le framework ne fait pas grand chose mais des nouvelles fonctionnalités seront rajoutée au fur et à mesure.
PS : je compte aussi améliorer la partie réseau de la SFML pour pouvoir faire des paquets crypté avec openssl.