# Render - 렌더링 서브시스템

**"화면에 그리기"**를 담당하는 통합 렌더링 계층입니다.

## 📦 모듈 구성

### `system.rs`
- **`RenderSystem`**: 렌더링의 최상위 조율자
- GPU 초기화, 파이프라인 생성, 렌더링 실행
- `core::System` trait 구현 (Engine이 직접 소유)

```rust
let mut render_system = RenderSystem::new();
render_system.initialize(window).await?;
render_system.render(&world, &asset_manager)?;
```

### `gpu/` - GPU 추상화
GPU 기반 리소스 초기화 및 관리

- **`context.rs`**: `GraphicsContext` (Device, Queue, Surface)
- **`pipeline.rs`**: `RenderPipeline` (셰이더, BindGroupLayout)

```rust
let graphics = GraphicsContext::new(window).await?;
let pipeline = RenderPipeline::new_sprite_pipeline(device, format);
```

### `resources/` - GPU 리소스
렌더링에 사용되는 데이터 타입

- **`vertex.rs`**: `Vertex` (위치, 색상, UV 좌표)
- **`texture.rs`**: 텍스처 로딩 함수

```rust
let texture = load_texture_from_file(device, queue, path)?;
```

### `pipeline/` - 렌더링 로직
실제 렌더링 실행 파이프라인

- **`batch.rs`**: `SpriteBatch` (스프라이트 배칭)
- **`commands.rs`**: `RenderCommands` (렌더 패스 실행)
- **`transform.rs`**: `Transform2D` (좌표 변환)

```rust
sprite_batch.begin_frame();
sprite_batch.collect_sprites(entities);
render_commands.execute_render_pass_direct(encoder, view, batch);
```

### `shaders/`
- **`basic.wgsl`**: 2D 스프라이트 기본 셰이더

## 🎯 설계 철학

### 유일 인스턴스 (Singleton-like)
`RenderSystem`은 Engine이 단 하나만 소유하며, GPU 리소스를 독점 관리합니다.

```
Engine
└── RenderSystem (1개)
    ├── GraphicsContext (Device, Queue, Surface)
    ├── RenderPipeline (셰이더, 파이프라인)
    └── SpriteBatch (배칭 버퍼)
```

### 캡슐화 (Encapsulation)
내부 구현(`GraphicsContext`, `SpriteBatch` 등)은 `pub(super)`로 숨기고, 외부에는 `RenderSystem`만 노출합니다.

**외부 공개:**
- `RenderSystem` - Engine이 사용
- `load_texture_from_file()` - AssetManager가 사용

**내부 전용:**
- `GraphicsContext`, `RenderPipeline`
- `Vertex`, `SpriteBatch`, `RenderCommands`

### 계층적 구조
GPU 추상화 → 리소스 → 파이프라인 → 시스템 순으로 명확히 분리

```
system.rs (조율)
    ↓
gpu/ (Device, Queue, Pipeline)
    ↓
resources/ (Vertex, Texture)
    ↓
pipeline/ (Batch, Commands, Transform)
```

## 📊 렌더링 흐름

### 초기화
```
RenderSystem::initialize(window)
├── GraphicsContext::new()      (GPU 초기화)
└── RenderPipeline::new()       (셰이더, 파이프라인)
```

### 렌더링 루프
```
RenderSystem::render(&World, &AssetManager)
├── SpriteBatch::begin_frame()           (배치 초기화)
├── SpriteBatch::collect_sprites()       (Entity → Vertex 변환)
├── GraphicsContext::get_current_frame() (Surface 텍스처)
├── RenderCommands::execute_render_pass_direct()
│   ├── create_vertex_buffer()           (정점 버퍼 생성)
│   ├── create_index_buffer()            (인덱스 버퍼 생성)
│   └── execute_pass()                   (렌더 패스 실행)
└── present()                            (화면 출력)
```

## 🔗 관련 계층

- **`core/`**: `System` trait, `Entity` 제공
- **`runtime/`**: `Engine`이 `RenderSystem` 소유
- **`asset/`**: `AssetManager`가 텍스처 로딩 함수 사용
- **`entity/components/`**: `Sprite`, `Transform` 컴포넌트 제공

## 🚀 사용 예시

### RenderSystem 초기화 (Engine 내부)
```rust
let mut render_system = RenderSystem::new();
render_system.initialize(window).await?;
```

### 렌더링 실행 (게임 루프)
```rust
render_system.render(&world, &mut asset_manager)?;
```

### 텍스처 로딩 (AssetManager)
```rust
use moltrun::render::load_texture_from_file;

let texture = load_texture_from_file(device, queue, "sprite.png")?;
```

### Sprite 컴포넌트 추가 (사용자)
```rust
use moltrun::entity::components::Sprite;

let entity_id = world.create_entity();
if let Some(entity) = world.get_entity_mut(entity_id) {
    entity.add_component(Sprite::new([1.0, 0.0, 0.0, 1.0])); // 빨간색
}
```
