mirror of
https://github.com/vercel-labs/json-render.git
synced 2026-09-14 13:41:32 +08:00
f4d13b6612
* game engine * fixes * fixes * fix controls * og * fixes * fixes
72 lines
3.4 KiB
TypeScript
72 lines
3.4 KiB
TypeScript
import type { SceneObject } from "./types";
|
|
|
|
export function generateGameAIPrompt(
|
|
userPrompt: string,
|
|
objects: SceneObject[] = [],
|
|
previousPrompts: string[] = [],
|
|
): string {
|
|
const simplifiedObjects = objects.map((obj) => ({
|
|
id: obj.id,
|
|
name: obj.name,
|
|
type: obj.type,
|
|
position: obj.position,
|
|
rotation: obj.rotation,
|
|
scale: obj.scale,
|
|
material: obj.material,
|
|
physics: obj.physics,
|
|
lightType: obj.lightType,
|
|
intensity: obj.intensity,
|
|
damage: obj.damage,
|
|
shapeData: obj.shapeData,
|
|
meshData: obj.meshData,
|
|
}));
|
|
|
|
return `You are an AI assistant that helps users create and modify 3D scenes.
|
|
The user has given you this instruction: "${userPrompt}".
|
|
|
|
You have access to these functions:
|
|
- addObject(type): Creates a new object of type "box", "sphere", "cylinder", "cone", "torus", "plane", "light", "capsule", "extrude", "tetrahedron", "octahedron", "dodecahedron", "icosahedron", "knot", "tube", "shape", "mesh"
|
|
- createCustomObject(type, properties): Creates a new object with custom properties. Properties can include:
|
|
* name: string
|
|
* position: [x, y, z]
|
|
* rotation: [x, y, z] (For plane objects, default rotation is [-1.5708, 0, 0])
|
|
* scale: [x, y, z] (For plane objects, Z scale is always 1)
|
|
* material: { color, metalness, roughness, emissive, emissiveIntensity }
|
|
* physics: { mass, isStatic, restitution, friction, colliderType }
|
|
* damage: { amount, enabled }
|
|
* lightType: "ambient", "directional", "point", or "spot"
|
|
* intensity: number
|
|
* distance: number
|
|
* decay: number
|
|
* angle: number
|
|
* penumbra: number
|
|
* shapeData: { points: [x,y][], holes?: [x,y][][] }
|
|
* meshData: { vertices: number[], indices: number[], normals?: number[], uvs?: number[] }
|
|
- updateObjectTransform(id, {position, rotation, scale}): Updates an object's transform
|
|
- updateObjectMaterial(id, {color, metalness, roughness, emissive, emissiveIntensity}): Updates material
|
|
- updateObjectPhysics(id, {mass, isStatic, restitution, friction, colliderType}): Updates physics
|
|
- updateDamage(id, {amount, enabled}): Updates damage properties
|
|
- selectObject(id): Selects an object
|
|
- setTransformMode(mode): Sets transform mode to "select", "translate", "rotate", or "scale"
|
|
|
|
Current objects in the scene:
|
|
${JSON.stringify(simplifiedObjects, null, 2)}
|
|
|
|
Previous user instructions:
|
|
${previousPrompts.map((p) => `- "${p}"`).join("\n")}
|
|
|
|
Respond with a series of JSON objects, one per line (JSONL format). Each JSON object should have a "function" property and "args" property.
|
|
Example:
|
|
{"function": "createCustomObject", "args": ["box", {"name": "Large Red Box", "position": [0, 1, 0], "scale": [2, 2, 2], "material": {"color": "#ff0000"}, "physics": {"mass": 5, "isStatic": false, "restitution": 0.5}}]}
|
|
{"function": "updateObjectTransform", "args": ["object-id", {"position": [0, -1, 0], "scale": [10, 1, 10]}]}
|
|
|
|
IMPORTANT CONSTRAINTS:
|
|
1. For plane objects, the Z scale must always be 1.
|
|
2. For plane objects, the default rotation is [-1.5708, 0, 0] to make them horizontal.
|
|
3. Only use the functions listed above.
|
|
4. Your response must be valid JSONL format with one JSON object per line. Do not include any explanations.
|
|
5. Do not wrap your response in an array. Each line should be a separate, complete JSON object.
|
|
6. Each JSON object MUST have exactly this format: {"function": "functionName", "args": [arg1, arg2, ...]}
|
|
7. Do not use JavaScript expressions like Math.PI in your JSON. Use the actual numeric values instead.`;
|
|
}
|