# 🚀 Quick Start 3D - SevenX Engine
## ⚡ Exemplo Mínimo Funcional
Copie e cole este código - **GARANTIDO QUE FUNCIONA!**
```rust
use sevenx_engine::*;
struct Game3D {
renderer: Renderer3D,
camera: Camera3D,
cube: Mesh3D,
time: f32,
}
impl GameState for Game3D {
fn new() -> Self {
let renderer = Renderer3D::new(800, 600);
let mut camera = Camera3D::new(800, 600);
camera.position = Vec3::new(0.0, 2.0, 5.0);
camera.look_at(Vec3::zero());
let mut cube = Mesh3D::cube(1.0);
cube.set_color([255, 100, 100, 255]);
Self {
renderer,
camera,
cube,
time: 0.0,
}
}
fn update(&mut self, dt: f32, input: &input::InputHandler, _world: &mut world::World) {
self.time += dt;
self.cube.rotation.y = self.time;
let radius = 5.0;
self.camera.position.x = self.time.cos() * radius;
self.camera.position.z = self.time.sin() * radius;
self.camera.look_at(Vec3::zero());
}
fn draw(&mut self, _world: &world::World, pixels: &mut [u8]) {
// Limpar tela
for pixel in pixels.chunks_exact_mut(4) {
pixel.copy_from_slice(&[20, 20, 30, 255]);
}
// Limpar zbuffer
for z in &mut self.renderer.zbuffer {
*z = f32::INFINITY;
}
// Atualizar câmera
self.renderer.camera = self.camera.clone();
// Renderizar
self.renderer.render_mesh(&self.cube, pixels, 800, 600);
}
}
fn main() {
let config = config::EngineConfig::new()
.with_title("3D Demo")
.with_size(800, 600);
Engine::with_config(config).run::<Game3D>();
}
```
## 📝 Cargo.toml
```toml
[package]
name = "meu_jogo_3d"
version = "0.1.0"
edition = "2021"
[dependencies]
sevenx_engine = "0.2.10"
```
## ▶️ Executar
```bash
cargo run
```
---
## ❌ Erros Comuns e Soluções
### Erro 1: "cannot find type `InputHandler`"
**Causa**: Imports incorretos
**Solução**: Use os imports corretos
```rust
fn update(&mut self, dt: f32, input: &input::InputHandler, _world: &mut world::World)
// ^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^
```
### Erro 2: "this method takes 4 arguments but 5 were supplied"
**Causa**: Passar câmera para `render_mesh`
**Solução**: Não passe a câmera, atualize `renderer.camera`
```rust
// ❌ ERRADO
self.renderer.render_mesh(&self.cube, &self.camera, pixels, 800, 600);
// ✅ CERTO
self.renderer.camera = self.camera.clone();
self.renderer.render_mesh(&self.cube, pixels, 800, 600);
```
### Erro 3: "this function takes 2 arguments but 3 were supplied"
**Causa**: API antiga do `Mesh3D::sphere`
**Solução**: Use apenas 2 parâmetros
```rust
// ❌ ERRADO (API antiga)
let sphere = Mesh3D::sphere(1.0, 32, 16);
// ✅ CERTO (API v0.2.9+)
let sphere = Mesh3D::sphere(1.0, 16);
```
### Erro 4: "method `set_color` takes 1 argument but 4 were supplied"
**Causa**: API antiga
**Solução**: Use array
```rust
// ❌ ERRADO
mesh.set_color(255, 0, 0, 255);
// ✅ CERTO
mesh.set_color([255, 0, 0, 255]);
```
---
## 🎯 Checklist Rápido
Antes de compilar, verifique:
- [ ] `Cargo.toml` tem `sevenx_engine = "0.2.10"`
- [ ] `use sevenx_engine::*;` no topo
- [ ] `input: &input::InputHandler` no update
- [ ] `_world: &mut world::World` no update e draw
- [ ] `config::EngineConfig::new()` no main
- [ ] `renderer.camera = self.camera.clone()` antes de renderizar
- [ ] `render_mesh` recebe apenas `(mesh, pixels, width, height)`
---
## 📚 Exemplos Testados
Execute estes exemplos que **FUNCIONAM**:
```bash
# Exemplo simples
cargo run --example simple_3d_working
# Exemplo com múltiplos objetos
cargo run --example simple_3d_demo
# Exemplo PBR (avançado)
cargo run --example pbr_demo
```
---
## 🆘 Ainda com Problemas?
1. **Limpe o projeto**
```bash
cargo clean
cargo build
```
2. **Verifique a versão**
```bash
cargo update sevenx_engine
```
3. **Use o exemplo testado**
```bash
cargo run --example simple_3d_working
```
4. **Copie o código exato** deste guia
---
## 💡 Dicas
### Adicionar Mais Objetos
```rust
// No new()
let mut sphere = Mesh3D::sphere(1.0, 16);
sphere.position = Vec3::new(2.0, 0.0, 0.0);
sphere.set_color([100, 100, 255, 255]);
// No draw()
self.renderer.render_mesh(&self.sphere, pixels, 800, 600);
```
### Controles de Câmera
```rust
// No update()
if input.is_key_pressed(KeyCode::ArrowLeft) {
self.camera.position.x -= 5.0 * dt;
}
if input.is_key_pressed(KeyCode::ArrowRight) {
self.camera.position.x += 5.0 * dt;
}
```
### Wireframe
```rust
// No new()
renderer.wireframe = true;
```
### HUD
```rust
// No draw()
ui::render_text(
"Meu Jogo 3D",
10, 10,
[255, 255, 255, 255],
pixels,
800
);
```
---
**Pronto! Agora você tem um jogo 3D funcionando! 🎮✨**