---
name: GraphEdge
lang: cpp
domain: viz
version: "2.0.0"
algebraic: product
definition: |
  struct GraphEdge {
      uint32_t source;
      uint32_t target;
      uint16_t type_id;
      uint8_t  style_override;
      uint8_t  flags;
      float    weight;
      uint32_t label_idx;
  };
description: "Arista del grafo: indices de nodos source/target, type_id (apariencia via RelationType), style_override (EDGE_*), flags (EF_DIRECTED/VISIBLE), weight (para attraction del force layout) y label_idx."
tags: [graph, edge, relation, type-id, flags, override]
uses_types: []
file_path: "cpp/functions/viz/graph_types.h"
---

## Campos

| Campo | Descripcion |
|---|---|
| `source` / `target` | Indices en `GraphData::nodes` |
| `type_id` | Indice en `GraphData::rel_types`. Determina color/style/width |
| `style_override` | `EDGE_*` (`SOLID`/`DASHED`/`DOTTED`). `EDGE_USE_TYPE` = heredar |
| `flags` | `EdgeFlags` mask: `EF_DIRECTED`, `EF_VISIBLE` |
| `weight` | Multiplica la fuerza de atraccion en el force layout |
| `label_idx` | Indice en el string pool. 0 = sin label |

## Helper

```cpp
GraphEdge e = graph_edge(/*src*/0, /*tgt*/5, /*weight*/2.0f, /*type_id*/1);
e.flags |= EF_DIRECTED;
```

`graph_edge()` deja `flags = EF_VISIBLE` y `style_override = EDGE_USE_TYPE`.

## Notas de diseño

- No tiene `color` directo: la apariencia siempre se deriva de `RelationType`.
  Las apps que necesiten variabilidad por arista lo modelan creando varios
  RelationType y asignando `type_id` distintos.
- El renderer (issue 0049d) reservaba 16 bytes alineados con un campo
  `flags` de 32-bit; en este modelo el campo de flags es 8-bit pero el
  buffer estatico del shader puede empacarse de forma distinta — la
  conversion ocurre en `graph_renderer.cpp`.
