morfeo 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/config.mjs CHANGED
@@ -247,6 +247,8 @@ function validarCapas(capas, donde, err, comps) {
247
247
  }
248
248
  if (c.tipo === 'dividida') for (const lado of ['izq', 'der', 'arriba', 'abajo']) if (c[lado]?.capas) validarCapas(c[lado].capas, `${d}, ${lado}`, err, comps);
249
249
  if (c.tipo === 'linea' && (!Array.isArray(c.hitos) || !c.hitos.length)) err(`${d}: \`linea\` necesita \`hitos\`: [{anio: 1963, texto: '…', en: 'palabra'}]`);
250
+ // `tamano` es una escala del objeto dentro de su recuadro (1 = normal); el tamaño en pantalla es `ancho`
251
+ if ((c.tipo === 'modelo' || c.tipo === 'recurso') && Number(c.tamano) > 10) err(`${d}: \`tamano: ${c.tamano}\` es la escala del objeto (1 = normal, 2 = el doble): con eso la cámara queda dentro. Para el tamaño en pantalla usa \`ancho\` (en px).`);
250
252
  if (c.tipo === 'cintillo' && !c.nombre) err(`${d}: \`cintillo\` necesita \`nombre\``);
251
253
  if (c.tipo === 'llamada' && c.estado != null && !['entrante', 'curso', 'terminada'].includes(c.estado)) err(`${d}: estado "${c.estado}" no existe (entrante, curso o terminada)`);
252
254
  if (c.tipo === 'tierra' && (!esNum(c.lat) || !esNum(c.lon))) err(`${d}: \`tierra\` necesita \`lat\` y \`lon\` (números)`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "morfeo",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "description": "Genera videos verticales animados (Remotion + Three.js) con voz, música y subtítulos, desde un guion en código o escrito por IA.",
5
5
  "type": "module",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -270,7 +270,10 @@ const Post: React.FC<{post: Post3D; estado: Estado}> = ({post, estado}) => {
270
270
  const dist = Math.hypot(estado.pos[0] - estado.mirar[0], estado.pos[1] - estado.mirar[1], estado.pos[2] - estado.mirar[2]);
271
271
  const rango = typeof o.foco === 'number' ? o.foco : Math.max(1.2, dist * 0.55);
272
272
  const efectos: React.ReactElement[] = [];
273
- if (o.foco) efectos.push(<DepthOfField key="f" target={estado.mirar} worldFocusRange={rango} bokehScale={4} resolutionScale={0.5} />);
273
+ // `focusRange` se actualiza en vivo; `worldFocusRange` va en el useMemo de @react-three/postprocessing y, como la
274
+ // distancia cambia en cada cuadro, creaba un DepthOfFieldEffect nuevo por cuadro: en Windows (ANGLE) la GPU se
275
+ // quedaba sin recursos a los ~30 s de video (Shader Error en EffectMaterial y "reading 'alpha'" de null).
276
+ if (o.foco) efectos.push(<DepthOfField key="f" target={estado.mirar} focusRange={rango} bokehScale={4} resolutionScale={0.5} />);
274
277
  if (o.miniatura) efectos.push(<TiltShift2 key="m" blur={0.12 * o.miniatura} taper={0.6} start={[0.5, 0.0]} end={[0.5, 1.0]} />);
275
278
  if (o.brillo) efectos.push(<Bloom key="b" intensity={o.brillo} luminanceThreshold={0.85} luminanceSmoothing={0.2} mipmapBlur />);
276
279
  if (o.vinieta) efectos.push(<Vignette key="v" offset={0.3} darkness={o.vinieta} />);