private void CreateScene()
    {
        List <Shape> allShapes     = new List <Shape>(FindObjectsOfType <Shape>());
        int          numTransforms = FindObjectsOfType <AdvancedTransform>().Length;

        int transformIndex = 0;

        ShapeData[]     shapeData;
        TransformData[] transformData = null;


        if (allShapes.Count > 0)
        {
            shapeData = new ShapeData[allShapes.Count];

            if (numTransforms > 0)
            {
                transformData = new TransformData[numTransforms];
            }

            for (int i = 0; i < allShapes.Count; i++)
            {
                Shape   s   = allShapes[i];
                Vector3 col = new Vector3(s.color.r, s.color.g, s.color.b);

                Matrix4x4 transformationMatrix           = (Matrix4x4.Translate(s.Position) * Matrix4x4.Rotate(s.Rotation)).inverse;
                List <AdvancedTransform> shapeTransforms = new List <AdvancedTransform>(s.GetComponentsInParent <AdvancedTransform>());

                shapeData[i] = new ShapeData()
                {
                    transformation = transformationMatrix,
                    scale          = new Vector3(Mathf.Abs(s.Scale.x), Mathf.Abs(s.Scale.y), Mathf.Abs(s.Scale.z)),
                    color          = col,
                    shapeType      = (int)s.shapeType,
                    numTransforms  = shapeTransforms.Count,
                    roughness      = s.roughness,
                    metalness      = s.metalness
                };

                if (shapeTransforms.Count > 0)
                {
                    foreach (AdvancedTransform t in shapeTransforms)
                    {
                        transformData[transformIndex] = new TransformData()
                        {
                            transformType = (int)t.transformType,
                            scale         = t.scale
                        };
                        transformIndex++;
                    }
                }
            }
            rayMarchingShader.SetInt("numShapes", shapeData.Length);
        }
        else
        {
            shapeData = new ShapeData[1];
            rayMarchingShader.SetInt("numShapes", 0);
        }

        if (numTransforms == 0)
        {
            transformData = new TransformData[1];
        }

        ComputeBuffer shapeBuffer = new ComputeBuffer(shapeData.Length, ShapeData.GetSize());

        shapeBuffer.SetData(shapeData);
        rayMarchingShader.SetBuffer(0, "shapes", shapeBuffer);
        buffersToDispose.Add(shapeBuffer);

        ComputeBuffer transformBuffer = new ComputeBuffer(transformData.Length, TransformData.GetSize());

        transformBuffer.SetData(transformData);
        rayMarchingShader.SetBuffer(0, "advancedTransforms", transformBuffer);
        buffersToDispose.Add(transformBuffer);
    }