// GENERATE REPLICANT
        public override GameObject generate(bool makeGameObjects, AXParametricObject initiator_po, bool renderToOutputParameter)
        {
            //Debug.Log ("===> " + parametricObject.Name + " generate");

            if (parametricObject == null || !parametricObject.hasInputMeshReady("Input Mesh"))
            {
                return(null);
            }

            if (!parametricObject.isActive)
            {
                return(null);
            }

            preGenerate();

            AXParameter input_p = parametricObject.getParameter("Input Mesh");

            if (parametricObject == null || input_p == null || input_p.DependsOn == null)
            {
                return(null);
            }

            AXParametricObject src_po = input_p.DependsOn.Parent;

            if (src_po == null)
            {
                return(null);
            }

            Matrix4x4 srcLocalM = src_po.getLocalMatrix().inverse;


            // 1. cache source object
            List <AXParameter> geometryControlParameterList = parametricObject.getAllParametersOfPType(AXParameter.ParameterType.GeometryControl);

            src_po.cacheAndSetParameters(geometryControlParameterList);

            if (!makeGameObjects)
            {
                // 2. re_generate source PO with temporary values set by this Replicant
                src_po.generateOutputNow(false, parametricObject, false);

                // 3. Now that the input_sourcePO has been regenerated,
                //    grab the temporaryOutputMeshes meshes
                //    from the input sources and add them here
                List <AXMesh> ax_meshes = new List <AXMesh>();
                if (src_po.temporaryOutputMeshes != null)
                {
                    for (int mi = 0; mi < src_po.temporaryOutputMeshes.Count; mi++)
                    {
                        AXMesh amesh = src_po.temporaryOutputMeshes [mi];
                        ax_meshes.Add(amesh.Clone(srcLocalM * amesh.transMatrix));
                    }
                }
                parametricObject.finishMultiAXMeshAndOutput(ax_meshes);

                setBoundaryFromAXMeshes(ax_meshes);
            }
            // 4. Make GAME OBJECTS
            GameObject go = null;

            if (makeGameObjects)
            {
                go      = src_po.generator.generate(true, initiator_po, false);
                go.name = src_po.Name + " Replicant";
                AXGameObject axgo = go.GetComponent <AXGameObject>();
                if (axgo != null)
                {
                    axgo.makerPO_GUID = parametricObject.Guid;
                }
            }



            //  5. restore source object; as though we were never here!
            src_po.revertParametersFromCache();


            // Turn ax_meshes into GameObjects
            if (makeGameObjects)
            {
                Matrix4x4 tmx = parametricObject.getLocalMatrix();

                go.transform.rotation   = AXUtilities.QuaternionFromMatrix(tmx);
                go.transform.position   = AXUtilities.GetPosition(tmx);
                go.transform.localScale = parametricObject.getLocalScaleAxisRotated();

                return(go);
            }

            return(null);
        }