addMaterialLayer
Add material layers to 3D scenes with configurable types, blend modes, and opacity settings for enhanced visual design in Spline.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| sceneId | Yes | Scene ID | |
| materialId | Yes | Material ID | |
| layerType | Yes | Layer type | |
| name | Yes | Layer name | |
| params | No | Layer-specific parameters | |
| blendMode | No | Layer blend mode | normal |
| opacity | No | Layer opacity | |
| maskLayer | No | Index of layer to use as mask | |
| position | No | Position in layer stack (0 = bottom) |
Implementation Reference
- The handler function for the 'addMaterialLayer' tool. It constructs layer data from parameters and sends a POST request to the API endpoint `/scenes/{sceneId}/materials/{materialId}/layers` to add the layer.async ({ sceneId, materialId, layerType, name, params, blendMode, opacity, maskLayer, position }) => { try { const layerData = { type: layerType, name, ...(params && { params }), blendMode: blendMode || 'normal', opacity: opacity || 1, ...(maskLayer !== undefined && { maskLayer }), ...(position !== undefined && { position }), }; const result = await apiClient.request('POST', `/scenes/${sceneId}/materials/${materialId}/layers`, layerData); return { content: [ { type: 'text', text: `Layer "${name}" added successfully to material ${materialId}` } ] }; } catch (error) { return { content: [ { type: 'text', text: `Error adding material layer: ${error.message}` } ], isError: true }; } }
- Zod schema defining the input parameters for the 'addMaterialLayer' tool, including sceneId, materialId, layerType, and other layer properties.sceneId: z.string().min(1).describe('Scene ID'), materialId: z.string().min(1).describe('Material ID'), layerType: z.enum([ 'color', 'lighting', 'image', 'video', 'depth', 'normal', 'gradient', 'noise', 'fresnel', 'rainbow', 'toon', 'outline', 'glass', 'matcap', 'displace', 'pattern' ]).describe('Layer type'), name: z.string().min(1).describe('Layer name'), params: z.record(z.any()).optional().describe('Layer-specific parameters'), blendMode: z.enum([ 'normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'colorDodge', 'colorBurn', 'hardLight', 'softLight', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity' ]).optional().default('normal').describe('Layer blend mode'), opacity: z.number().min(0).max(1).optional().default(1).describe('Layer opacity'), maskLayer: z.number().optional().describe('Index of layer to use as mask'), position: z.number().int().optional().describe('Position in layer stack (0 = bottom)'), },
- src/tools/advanced-material-tools.js:85-151 (registration)Registration of the 'addMaterialLayer' tool using server.tool(), including schema and handler function.server.tool( 'addMaterialLayer', { sceneId: z.string().min(1).describe('Scene ID'), materialId: z.string().min(1).describe('Material ID'), layerType: z.enum([ 'color', 'lighting', 'image', 'video', 'depth', 'normal', 'gradient', 'noise', 'fresnel', 'rainbow', 'toon', 'outline', 'glass', 'matcap', 'displace', 'pattern' ]).describe('Layer type'), name: z.string().min(1).describe('Layer name'), params: z.record(z.any()).optional().describe('Layer-specific parameters'), blendMode: z.enum([ 'normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'colorDodge', 'colorBurn', 'hardLight', 'softLight', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity' ]).optional().default('normal').describe('Layer blend mode'), opacity: z.number().min(0).max(1).optional().default(1).describe('Layer opacity'), maskLayer: z.number().optional().describe('Index of layer to use as mask'), position: z.number().int().optional().describe('Position in layer stack (0 = bottom)'), }, async ({ sceneId, materialId, layerType, name, params, blendMode, opacity, maskLayer, position }) => { try { const layerData = { type: layerType, name, ...(params && { params }), blendMode: blendMode || 'normal', opacity: opacity || 1, ...(maskLayer !== undefined && { maskLayer }), ...(position !== undefined && { position }), }; const result = await apiClient.request('POST', `/scenes/${sceneId}/materials/${materialId}/layers`, layerData); return { content: [ { type: 'text', text: `Layer "${name}" added successfully to material ${materialId}` } ] }; } catch (error) { return { content: [ { type: 'text', text: `Error adding material layer: ${error.message}` } ], isError: true }; } } );