Let a shader declare a color the sprite sets (#298)
game-maker / gate (push) Successful in 3m1s
game-maker / suite (push) Successful in 14m11s

A shader could only ask its sprites for numbers. A tint, an outline
colour or a glow colour had to be built from three Property nodes.

- New node Color property next to Property: Name and Default (a
  colour, white unless picked), output `color`. It becomes a colour
  row below the Shader dropdown and a vec3 uniform in the program.
- Number and colour properties share one set of names. A clash is
  the existing "Another property is named" problem.
- Like Color it cannot feed the Vertex output.
- Placed from the palette it is called tint, then tint2.
- The preview in the Shader tab shows a colour field for it. Like
  the sliders it starts at the sprite's value and never writes into
  the project.
- `declaredRows` takes the row builder, so the particle graph keeps
  its number rows unchanged.

Tests:
- Gate: 222 files, 3452 tests (3445 + 7)
- e2e 28: 89 checks (28l-v: default colour drawn, then the colour
  the sprite sets)
- e2e total 1704, counted (1703 + 1)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
adminandClaude Opus 5.5 committed 2026-10-03 11:43:54 +02:00
1 parent 4f4c149211
commit bf27e42e8a
13 files changed
+303 -57

No files matched your search

+28 -2
View File
@@ -2,9 +2,15 @@ import type { PortType } from '../graph/Graph';
import type { NodeDef, PortDef } from '../graph/NodeRegistry';
import type { SharedPortGroup } from '../graph/portTypes';
import { type PropertyBag, textOf } from '../model/Properties';
import { propertyNodeParams } from '../properties/declaredRows';
import { PROPERTY_DEFAULT_PARAM, propertyNodeParams } from '../properties/declaredRows';
import { flatDef } from '../properties/PropertySchema';
import { PROPERTY_NAME_PARAM, propertyName, SHADER_PROPERTY } from '../properties/shaders';
import {
DEFAULT_PROPERTY_COLOR,
PROPERTY_NAME_PARAM,
propertyName,
SHADER_COLOR_PROPERTY,
SHADER_PROPERTY,
} from '../properties/shaders';
export type GlslType = 'float' | 'vec3';
@@ -341,6 +347,25 @@ export const ShaderProperty: ShaderNodeDef = {
}),
};
/** The same for a colour (#298); like `Color`, there is none per corner. */
export const ShaderColorProperty: ShaderNodeDef = {
type: SHADER_COLOR_PROPERTY,
label: 'Color property',
category: 'shader',
description: 'A color the sprite sets: a color row below the Shader dropdown, and a color here.',
inputs: [],
outputs: [vec3Port('color')],
params: [
flatDef(PROPERTY_NAME_PARAM, 'text', { label: 'Name', value: 'value' }),
flatDef(PROPERTY_DEFAULT_PARAM, 'color', { label: 'Default', value: DEFAULT_PROPERTY_COLOR }),
],
perPixel: true,
derivePorts: ({ node }) => ({ label: propertyName(node) || ShaderColorProperty.label }),
emit: (_inputs, params) => ({
color: { code: uniformName(textOf(params[PROPERTY_NAME_PARAM] ?? '')), type: 'vec3' },
}),
};
export function uniformName(property: string): string {
return `u_${property}`;
}
@@ -550,6 +575,7 @@ export const SHADER_NODES: readonly ShaderNodeDef[] = [
ShaderOutput,
ShaderVertexOutput,
ShaderProperty,
ShaderColorProperty,
ShaderColor,
ShaderNumber,
ShaderAdd,