sevenx_engine 0.2.11

Engine de jogos 2D/3D completa com suporte Android, física, áudio, partículas, tilemap, UI, eventos e sistema 3D avançado com PBR.
Documentation
# Guia de Renderização 3D Experimental


## 🎲 Visão Geral


A versão 0.2.6 da SevenX Engine introduz suporte **experimental** para renderização 3D usando um software rasterizer. Isso permite criar protótipos 3D simples sem precisar de GPU ou bibliotecas complexas.

⚠️ **Nota**: Este é um sistema 3D básico para prototipagem. Para jogos 3D complexos, considere usar engines especializadas como Bevy ou wgpu.

## 📦 Componentes Principais


### Vec3 - Vetores 3D


```rust
use sevenx_engine::Vec3;

let position = Vec3::new(0.0, 1.0, 2.0);
let direction = Vec3::new(1.0, 0.0, 0.0);

// Operações
let length = position.length();
let normalized = direction.normalize();
let dot_product = position.dot(&direction);
let cross_product = position.cross(&direction);
```

### Mesh3D - Geometria 3D


```rust
use sevenx_engine::{Mesh3D, Vec3};

// Criar primitivas
let cube = Mesh3D::cube(2.0);
let sphere = Mesh3D::sphere(1.5, 16);

// Transformar mesh
let mut mesh = Mesh3D::cube(1.0);
mesh.position = Vec3::new(0.0, 0.0, -5.0);
mesh.rotation = Vec3::new(0.0, 45.0_f32.to_radians(), 0.0);
mesh.scale = Vec3::new(1.0, 2.0, 1.0);
```

### Camera3D - Câmera 3D


```rust
use sevenx_engine::{Camera3D, Vec3};

let mut camera = Camera3D::new(800, 600);

// Posicionar câmera
camera.position = Vec3::new(0.0, 2.0, 10.0);
camera.look_at(Vec3::zero());

// Mover câmera
camera.move_forward(5.0); // Move para frente

// Rotacionar ao redor do alvo
camera.rotate_around_target(0.1, 0.2);

// Configurar projeção
camera.fov = 60.0;
camera.near = 0.1;
camera.far = 100.0;
```

### Renderer3D - Renderizador


```rust
use sevenx_engine::{Renderer3D, Mesh3D};

let mut renderer = Renderer3D::new(800, 600);

// Configurações
renderer.wireframe = false; // Sólido ou wireframe
renderer.backface_culling = true; // Otimização

// Renderizar mesh
renderer.render_mesh(&cube, frame, 800, 600);
```

## 🎮 Exemplo Completo


```rust
use sevenx_engine::*;

struct Game3D {
    renderer3d: Renderer3D,
    cube: Mesh3D,
    sphere: Mesh3D,
    rotation: f32,
}

impl GameState for Game3D {
    fn new() -> Self {
        let mut renderer3d = Renderer3D::new(800, 600);
        renderer3d.camera.position = Vec3::new(0.0, 3.0, 10.0);
        renderer3d.camera.look_at(Vec3::zero());

        let mut cube = Mesh3D::cube(2.0);
        cube.position = Vec3::new(-3.0, 0.0, 0.0);

        let mut sphere = Mesh3D::sphere(1.5, 20);
        sphere.position = Vec3::new(3.0, 0.0, 0.0);

        Self {
            renderer3d,
            cube,
            sphere,
            rotation: 0.0,
        }
    }

    fn update(&mut self, dt: f32, input: &sevenx_engine::input::InputHandler, _world: &mut World) {
        // Rotaciona objetos
        self.rotation += dt;
        self.cube.rotation.y = self.rotation;
        self.sphere.rotation.x = self.rotation * 0.5;

        // Controles de câmera
        if input.is_key_pressed(KeyCode::KeyW) {
            self.renderer3d.camera.move_forward(5.0 * dt);
        }
        if input.is_key_pressed(KeyCode::KeyS) {
            self.renderer3d.camera.move_forward(-5.0 * dt);
        }
        if input.is_key_pressed(KeyCode::KeyA) {
            self.renderer3d.camera.rotate_around_target(0.0, 2.0 * dt);
        }
        if input.is_key_pressed(KeyCode::KeyD) {
            self.renderer3d.camera.rotate_around_target(0.0, -2.0 * dt);
        }

        // Toggle wireframe
        if input.is_key_just_pressed(KeyCode::Space) {
            self.renderer3d.wireframe = !self.renderer3d.wireframe;
        }
    }

    fn draw(&mut self, _world: &World, frame: &mut [u8]) {
        // Limpa tela
        for pixel in frame.chunks_exact_mut(4) {
            pixel.copy_from_slice(&[20, 20, 40, 255]);
        }

        // Renderiza objetos 3D
        self.renderer3d.render_mesh(&self.cube, frame, 800, 600);
        self.renderer3d.render_mesh(&self.sphere, frame, 800, 600);
    }
}

fn main() {
    let config = EngineConfig::default()
        .with_title("Meu Jogo 3D")
        .with_size(800, 600);

    Engine::with_config(config).run::<Game3D>();
}
```

## 🎨 Cores de Vértices


Você pode customizar cores por vértice:

```rust
let mut mesh = Mesh3D::cube(2.0);

// Modifica cor de um vértice
mesh.vertices[0].color = [255, 0, 0, 255]; // Vermelho
mesh.vertices[1].color = [0, 255, 0, 255]; // Verde
mesh.vertices[2].color = [0, 0, 255, 255]; // Azul
```

## ⚡ Performance


O software rasterizer tem limitações:
- **Bom para**: Protótipos, visualizações simples, efeitos especiais
- **Não recomendado para**: Jogos 3D complexos, muitos polígonos

Dicas de otimização:
- Use `backface_culling = true`
- Mantenha meshes com poucos polígonos (< 1000 triângulos)
- Use wireframe para debug
- Considere LOD (Level of Detail) manual

## 🔄 Misturando 2D e 3D


Você pode combinar renderização 2D e 3D:

```rust
fn draw(&mut self, world: &World, frame: &mut [u8]) {
    // 1. Renderiza 3D primeiro
    self.renderer3d.render_mesh(&self.cube, frame, 800, 600);
    
    // 2. Renderiza 2D por cima (UI, sprites)
    // Desenhe sprites normalmente aqui
}
```

## 📚 Próximos Passos


- Experimente com diferentes primitivas
- Crie suas próprias meshes customizadas
- Combine com iluminação 2D para efeitos interessantes
- Use post-processing para melhorar a aparência

Execute o exemplo:
```bash
cargo run --example 3d_demo
```