// Cube Pile.lmc // Copyright (c) 2007 by George Moromisato. All Rights Reserved. { name: "Cube Pile 1.0" desc: "Cube pile generator" version: 3 parameters: [ { name: "Mode" param: "renderMode" type: "choice" default: "draft" choices: [["draft", "Draft"], ["highQuality", "High-Quality"]] }, { name: "Style" param: "style" type: "choice" default: "holes" choices: [["holes", "Holes"], ["zGlow", "Z-Glow"]] }, { name: "Width" param: "canvasWidth" type: "integer" default: 256 }, { name: "Height" param: "canvasHeight" type: "integer" default: 256 }, { name: "Density" param: "density" type: "float" default: "0.7" }, { name: "Minimum Cube Size" param: "minCubeSize" type: "float" default: "0.05" }, { name: "Cube Jitter" param: "cubeJitter" type: "float" default: "0.01" }, { name: "Gap Size" param: "gapRatio" type: "float" default: "0.06" }, ] renderer: Code { var scene; var camera; var PI; var cubeShader1; var cubeShader2; function OnInitialize () { PI = 3.14159265; scene = CreateScene(); SetSceneTransparentBackground(True); if (renderMode == "draft") SetSceneParam("MarchStep", 0.05); else SetSceneParam("MarchStep", 0.025); camera = CreateCamera(2, -2, 1.5); SetObjParam(camera, "LookAt", 0, 0, 0); SetObjParam(camera, "Up", 0, 0, 1); SetObjParam(camera, "ViewAngle", 40); var light1 = CreateObj("AreaLight"); SetObjParam(light1, "Pos", 0.5, -3.0, 6.0); SetObjParam(light1, "Scale", 5.0, 5.0, 1.0); SetObjParam(light1, "Intensity", 2.0); if (renderMode == "highQuality") SetObjParam(light1, "ArraySize", 16); // Create some shaders var whiteShader = CreateObj("PhongShader"); SetObjParam(whiteShader, "Color", Color(255, 255, 255)); SetObjParam(whiteShader, "Brilliance", 0.5); SetObjParam(whiteShader, "Diffuse", 0.5); SetObjParam(whiteShader, "Roughness", 2.0); SetObjParam(whiteShader, "Specular", 0.5); var grayShader = CreateObj("PhongShader"); SetObjParam(grayShader, "Color", Color(64, 64, 64)); SetObjParam(grayShader, "Brilliance", 0.5); SetObjParam(grayShader, "Diffuse", 0.5); SetObjParam(grayShader, "Roughness", 2.0); SetObjParam(grayShader, "Specular", 0.5); var glowPalette = CreatePalette(); AddPaletteColor(glowPalette, Color(0, 255, 0)); AddPaletteGradient(glowPalette, Color(180, 255, 180), 32); var glowShader = CreateObj("TurbulenceShader"); SetObjParam(glowShader, "Style", "Plain"); SetObjParam(glowShader, "Palette", glowPalette); SetObjParam(glowShader, "RadialScaling", 1.0); SetObjParam(glowShader, "DensityFactor", 5.0); // Create cube cubeShader1 = whiteShader; cubeShader2 = glowShader; CreateComplexCube(0.0, 0.0, 0.0, 1.0, gapRatio); // Create glow /* var glow = CreateObj("GlowSphere"); SetObjParam(glow, "Diameters", [0.0, 1.0, 2.0]); SetObjParam(glow, "Densities", [0.0, 1.0, 0.0]); SetObjParam(glow, "Luminosity", 1.0); SetObjParam(glow, "Shader", glowShader); var glow = CreateCube(0.0, 0.0, 0.0, 1.0); SetObjParam(glow, "Shader", glowShader); SetObjParam(glow, "Luminosity", 1.0); */ // Create plane //var plane1 = CreateObj("Plane"); //SetObjParam(plane1, "Pos", 0, 0, -0.6); //SetObjParam(plane1, "Shader", grayShader); // Create the main canvas SetCanvasSize(canvasWidth, canvasHeight); } function OnRender (frame) { FillRect(GetCanvas(frame), 0, 0, canvasWidth, canvasHeight, Color(0, 0, 0)); RayTraceScene(scene, GetCanvas(frame), camera); } function CreateComplexCube (x, y, z, size, gapSize) { var halfSize = size / 2.0; // Below a certain size, just create the cube if ((size - gapSize) / 2.0 < minCubeSize) { var xJitter = (random() * cubeJitter) - (cubeJitter / 2.0); var yJitter = (random() * cubeJitter) - (cubeJitter / 2.0); var zJitter = (random() * cubeJitter) - (cubeJitter / 2.0); var theCube = CreateCube(x - halfSize + xJitter, y - halfSize + yJitter, z - halfSize + zJitter, size); if (style == "holes" || random() < density) SetObjParam(theCube, "Shader", cubeShader1); else SetObjParam(theCube, "Shader", cubeShader2); SetObjParam(theCube, "Luminosity", 1.0); } else { var smallCubeSize = (size - gapSize) / 2.0; var halfSmallCubeSize = smallCubeSize / 2.0; // Create eight cubes var z1 = z - halfSize + halfSmallCubeSize; var i = 0; var j = 0; var k = 0; while (i < 2) { var y1 = y - halfSize + halfSmallCubeSize; j = 0; while (j < 2) { var x1 = x - halfSize + halfSmallCubeSize; k = 0; while (k < 2) { if (style == "zGlow" || size > 0.3 || random() < density) CreateComplexCube(x1, y1, z1, smallCubeSize, gapSize); x1 = x1 + smallCubeSize + gapSize; k = k + 1; } y1 = y1 + smallCubeSize + gapSize; j = j + 1; } z1 = z1 + smallCubeSize + gapSize; i = i + 1; } } } } }