From f1c3e24dd8dd51b21d07b8a8c806279a04fdf58a Mon Sep 17 00:00:00 2001 From: pvl-bot Date: Sat, 12 Aug 2023 17:47:33 -0400 Subject: [PATCH] Fix all imports and paths --- .gitignore | 1 - .gitmodules | 20 +- Dockerfile | 2 +- Makefile | 14 +- README.md | 4 +- docs/ConfiguringInfinigen.md | 54 +- docs/GeneratingFluidSimulations.md | 2 +- docs/GeneratingIndividualAssets.md | 7 +- docs/GroundTruthAnnotations.md | 8 +- docs/HelloWorld.md | 11 +- docs/ImplementingAssets.md | 42 +- examples/configs/base.gin | 30 +- examples/configs/natural.gin | 6 +- examples/configs/performance/simple.gin | 6 +- examples/configs/scene_types/arctic.gin | 2 +- examples/configs/scene_types/coral_reef.gin | 2 +- examples/configs/scene_types/kelp_forest.gin | 2 +- .../configs/scene_types/snowy_mountain.gin | 6 +- .../scene_types_fluidsim/simulated_river.gin | 2 +- .../scene_types_fluidsim/tilted_river.gin | 2 +- examples/generate_asset_demo.py | 47 +- examples/generate_individual_assets.py | 39 +- examples/generate_nature.py | 168 ++- examples/scripts/render_river_video.sh | 11 - examples/scripts/render_video_fire.sh | 6 - infinigen/assets/cactus/base.py | 10 +- infinigen/assets/cactus/columnar.py | 16 +- infinigen/assets/cactus/generate.py | 20 +- infinigen/assets/cactus/globular.py | 18 +- infinigen/assets/cactus/kalidium.py | 24 +- infinigen/assets/cactus/pricky_pear.py | 20 +- infinigen/assets/cactus/spike.py | 22 +- .../{underwater => }/corals/__init__.py | 0 .../assets/{underwater => }/corals/base.py | 2 +- .../{underwater => }/corals/diff_growth.py | 20 +- .../assets/{underwater => }/corals/elkhorn.py | 24 +- .../assets/{underwater => }/corals/fan.py | 22 +- .../{underwater => }/corals/generate.py | 18 +- .../{underwater => }/corals/laplacian.py | 16 +- .../corals/reaction_diffusion.py | 18 +- .../assets/{underwater => }/corals/star.py | 18 +- .../{underwater => }/corals/tentacles.py | 20 +- .../assets/{underwater => }/corals/tree.py | 22 +- .../assets/{underwater => }/corals/tube.py | 16 +- infinigen/assets/creatures/__init__.py | 16 +- infinigen/assets/creatures/beetle.py | 28 +- infinigen/assets/creatures/bird.py | 62 +- infinigen/assets/creatures/carnivore.py | 42 +- infinigen/assets/creatures/crustacean.py | 36 +- infinigen/assets/creatures/fish.py | 44 +- infinigen/assets/creatures/herbivore.py | 48 +- .../assets/creatures/insects/__init__.py | 2 +- .../insects/{assembled => }/dragonfly.py | 28 +- .../parts/antenna/dragonfly_antenna.py | 10 +- .../insects/parts/body/dragonfly_body.py | 14 +- .../insects/parts/eye/dragonfly_eye.py | 10 +- .../insects/parts/hair/principled_hair.py | 10 +- .../insects/parts/head/dragonfly_head.py | 20 +- .../insects/parts/leg/dragonfly_leg.py | 14 +- .../insects/parts/mouth/dragonfly_mouth.py | 10 +- .../insects/parts/tail/dragonfly_tail.py | 12 +- .../insects/parts/wing/dragonfly_wing.py | 10 +- .../creatures/insects/utils/geom_utils.py | 8 +- .../creatures/insects/utils/shader_utils.py | 8 +- infinigen/assets/creatures/jellyfish.py | 30 +- infinigen/assets/creatures/parts/beak.py | 12 +- infinigen/assets/creatures/parts/body.py | 24 +- infinigen/assets/creatures/parts/chameleon.py | 24 +- .../creatures/parts/crustacean/antenna.py | 12 +- .../assets/creatures/parts/crustacean/body.py | 22 +- .../assets/creatures/parts/crustacean/claw.py | 28 +- .../assets/creatures/parts/crustacean/eye.py | 8 +- .../assets/creatures/parts/crustacean/fin.py | 8 +- .../assets/creatures/parts/crustacean/leg.py | 14 +- .../assets/creatures/parts/crustacean/tail.py | 14 +- infinigen/assets/creatures/parts/eye.py | 22 +- infinigen/assets/creatures/parts/eye_new.py | 14 +- infinigen/assets/creatures/parts/fin_old.py | 16 +- infinigen/assets/creatures/parts/foot.py | 18 +- .../assets/creatures/parts/generic_nurbs.py | 23 +- infinigen/assets/creatures/parts/head.py | 36 +- .../assets/creatures/parts/head_detail.py | 24 +- infinigen/assets/creatures/parts/hoof.py | 22 +- infinigen/assets/creatures/parts/horn.py | 16 +- infinigen/assets/creatures/parts/leg.py | 18 +- .../{ => parts}/nurbs_data/body_bird_duck.npy | Bin .../{ => parts}/nurbs_data/body_bird_gull.npy | Bin .../nurbs_data/body_bird_robin.npy | Bin .../nurbs_data/body_feline_cheetah.npy | Bin .../nurbs_data/body_feline_housecat.npy | Bin .../nurbs_data/body_feline_tiger.npy | Bin .../nurbs_data/body_feline_tiger_2.npy | Bin .../nurbs_data/body_feline_wolf.npy | Bin .../nurbs_data/body_fish_bluefish.npy | Bin .../nurbs_data/body_fish_crappie.npy | Bin .../{ => parts}/nurbs_data/body_fish_eel.npy | Bin .../nurbs_data/body_fish_pickerel.npy | Bin .../nurbs_data/body_fish_pufferfish.npy | Bin .../nurbs_data/body_fish_spadefish.npy | Bin .../nurbs_data/body_herbivore_cow.npy | Bin .../nurbs_data/body_herbivore_giraffe.npy | Bin .../nurbs_data/body_herbivore_goat.npy | Bin .../nurbs_data/body_herbivore_llama.npy | Bin .../nurbs_data/body_insect_bee.npy | Bin .../nurbs_data/body_insect_beetle.npy | Bin .../nurbs_data/body_insect_tarantula.npy | Bin .../{ => parts}/nurbs_data/body_llama.npy | Bin .../nurbs_data/head_carnivore_tiger.npy | Bin .../nurbs_data/head_carnivore_wolf.npy | Bin .../nurbs_data/head_herbivore_cow.npy | Bin .../nurbs_data/head_herbivore_giraffe.npy | Bin .../nurbs_data/head_herbivore_goat.npy | Bin .../nurbs_data/head_herbivore_llama.npy | Bin .../nurbs_data/head_insect_beetle.npy | Bin .../nurbs_data/head_insect_wasp.npy | Bin .../assets/creatures/parts/reptile_detail.py | 12 +- .../assets/creatures/parts/ridged_fin.py | 22 +- infinigen/assets/creatures/parts/tail.py | 16 +- .../assets/creatures/parts/utils/draw.py | 12 +- infinigen/assets/creatures/parts/wings.py | 22 +- infinigen/assets/creatures/reptile.py | 67 +- .../creatures/util/animation}/__init__.py | 0 .../creatures/util/animation/curve_slither.py | 10 +- .../util/animation/driver_repeated.py | 2 +- .../creatures/util/animation/driver_wiggle.py | 6 +- .../assets/creatures/util/animation/idle.py | 6 +- .../creatures/util/animation/run_cycle.py | 6 +- infinigen/assets/creatures/util/boid_swarm.py | 10 +- infinigen/assets/creatures/util/cloth_sim.py | 10 +- infinigen/assets/creatures/util/creature.py | 24 +- .../assets/creatures/util/creature_parser.py | 12 +- .../assets/creatures/util/creature_util.py | 4 +- infinigen/assets/creatures/util/genome.py | 6 +- .../creatures/util/geometry/blending.py | 16 +- .../util/geometry/cpp_utils/__init__.py | 0 .../assets/creatures/util/geometry/curve.py | 2 +- .../assets/creatures/util/geometry/lofting.py | 5 +- .../creatures/util/geometry/metaballs.py | 2 +- .../assets/creatures/util/geometry/nurbs.py | 6 +- .../creatures/util/geometry/skin_ops.py | 6 +- .../assets/creatures/util/geonode_part.py | 6 +- infinigen/assets/creatures/util/hair.py | 10 +- .../assets/creatures/util/join_smoothing.py | 4 +- infinigen/assets/creatures/util/joining.py | 12 +- .../creatures/util/nodegroups/attach.py | 8 +- .../assets/creatures/util/nodegroups/curve.py | 8 +- .../creatures/util/nodegroups/geometry.py | 8 +- .../assets/creatures/util/nodegroups/hair.py | 10 +- .../assets/creatures/util/nodegroups/math.py | 8 +- .../creatures/util/nodegroups/sculpt_v1.py | 12 +- .../creatures/util/nodegroups/shader.py | 8 +- infinigen/assets/creatures/util/part_util.py | 8 +- infinigen/assets/creatures/util/rigging.py | 8 +- infinigen/assets/deformed_trees/base.py | 18 +- infinigen/assets/deformed_trees/fallen.py | 18 +- infinigen/assets/deformed_trees/generate.py | 10 +- infinigen/assets/deformed_trees/hollow.py | 18 +- infinigen/assets/deformed_trees/rotten.py | 20 +- infinigen/assets/deformed_trees/truncated.py | 14 +- infinigen/assets/fluid/__init__.py | 1 + infinigen/assets/fluid/asset_cache.py | 25 +- infinigen/assets/fluid/bounding_box.py | 8 +- .../assets/fluid/cached_factory_wrappers.py | 8 +- infinigen/assets/fluid/duplication_geomod.py | 8 +- infinigen/assets/fluid/flip_fluid.py | 31 +- infinigen/assets/fluid/fluid.py | 16 +- .../assets/fluid/fluid_scenecomp_additions.py | 14 +- infinigen/assets/fluid/generate.py | 10 +- .../assets/fluid/liquid_particle_material.py | 8 +- infinigen/assets/fluid/run_asset_cache.py | 2 +- infinigen/assets/fruits/apple.py | 16 +- infinigen/assets/fruits/blackberry.py | 16 +- infinigen/assets/fruits/coconutgreen.py | 16 +- infinigen/assets/fruits/coconuthairy.py | 16 +- .../assets/fruits/compositional_fruit.py | 36 +- infinigen/assets/fruits/cross_section_lib.py | 10 +- infinigen/assets/fruits/durian.py | 16 +- infinigen/assets/fruits/fruit_utils.py | 8 +- infinigen/assets/fruits/general_fruit.py | 44 +- infinigen/assets/fruits/pineapple.py | 16 +- infinigen/assets/fruits/seed_lib.py | 8 +- infinigen/assets/fruits/starfruit.py | 16 +- infinigen/assets/fruits/stem_lib.py | 12 +- infinigen/assets/fruits/strawberry.py | 16 +- .../assets/fruits/surfaces/apple_surface.py | 10 +- .../fruits/surfaces/blackberry_surface.py | 12 +- .../fruits/surfaces/coconutgreen_surface.py | 12 +- .../fruits/surfaces/coconuthairy_surface.py | 10 +- .../assets/fruits/surfaces/durian_surface.py | 10 +- .../fruits/surfaces/pineapple_surface.py | 14 +- .../fruits/surfaces/starfruit_surface.py | 10 +- .../fruits/surfaces/strawberry_surface.py | 12 +- .../assets/fruits/surfaces/surface_utils.py | 8 +- infinigen/assets/grassland/dandelion.py | 18 +- infinigen/assets/grassland/flower.py | 14 +- infinigen/assets/grassland/flowerplant.py | 18 +- infinigen/assets/grassland/grass_tuft.py | 12 +- infinigen/assets/leaves/leaf.py | 8 +- infinigen/assets/leaves/leaf_broadleaf.py | 22 +- infinigen/assets/leaves/leaf_ginko.py | 22 +- infinigen/assets/leaves/leaf_maple.py | 20 +- infinigen/assets/leaves/leaf_pine.py | 18 +- infinigen/assets/leaves/leaf_v2.py | 24 +- infinigen/assets/leaves/leaf_wrapped.py | 16 +- infinigen/assets/lighting/caustics_lamp.py | 14 +- infinigen/assets/lighting/glowing_rocks.py | 14 +- .../lighting/{lighting.py => sky_lighting.py} | 6 +- infinigen/assets/materials/__init__.py | 2 + .../aluminumdisp2tut.py | 12 +- .../atmosphere_light_haze.py | 9 +- .../assets/{surfaces => materials}/bark.py | 6 +- .../{surfaces => materials}/bark_birch.py | 6 +- .../{surfaces => materials}/bark_random.py | 8 +- .../{surfaces => materials}/basic_bsdf.py | 6 +- .../assets/{surfaces => materials}/beak.py | 8 +- .../assets/{surfaces => materials}/bird.py | 10 +- .../blackbody_shader.py | 10 +- .../assets/{surfaces => materials}/bone.py | 8 +- .../assets/{surfaces => materials}/chitin.py | 10 +- .../{surfaces => materials}/chunkyrock.py | 14 +- .../{surfaces => materials}/cobble_stone.py | 10 +- .../{surfaces => materials}/cracked_ground.py | 14 +- .../assets/{surfaces => materials}/dirt.py | 10 +- .../assets/{surfaces => materials}/eyeball.py | 10 +- .../face_size_visualizer.py | 8 +- .../fish_eye_shader.py | 10 +- .../{surfaces => materials}/fishbody.py | 10 +- .../assets/{surfaces => materials}/fishfin.py | 82 +- .../{surfaces => materials}/giraffe_attr.py | 12 +- .../grass_blade_texture.py | 8 +- .../assets/{surfaces => materials}/horn.py | 8 +- .../assets/{surfaces => materials}/ice.py | 18 +- .../assets/{surfaces => materials}/lava.py | 14 +- .../{surfaces => materials}/mountain.py | 16 +- .../assets/{surfaces => materials}/mud.py | 12 +- .../{surfaces => materials}/new_whitewater.py | 10 +- .../assets/{surfaces => materials}/nose.py | 8 +- .../reptile_brown_circle_attr.py | 12 +- .../reptile_gray_attr.py | 12 +- .../reptile_two_color_attr.py | 12 +- .../{surfaces => materials}/river_water.py | 10 +- .../assets/{surfaces => materials}/sand.py | 10 +- .../{surfaces => materials}/sandstone.py | 12 +- .../assets/{surfaces => materials}/scale.py | 8 +- .../simple_brownish.py | 8 +- .../simple_greenery.py | 8 +- .../{surfaces => materials}/simple_whitish.py | 8 +- .../assets/{surfaces => materials}/slimy.py | 6 +- .../{surfaces => materials}/smoke_material.py | 10 +- .../{surfaces => materials}/snake_plant.py | 8 +- .../{surfaces => materials}/snake_scale.py | 10 +- .../{surfaces => materials}/snake_shaders.py | 10 +- .../assets/{surfaces => materials}/snow.py | 6 +- .../assets/{surfaces => materials}/soil.py | 12 +- .../{surfaces => materials}/spider_plant.py | 8 +- .../spot_sparse_attr.py | 12 +- .../assets/{surfaces => materials}/stone.py | 10 +- .../{surfaces => materials}/succulent.py | 10 +- .../three_color_spots.py | 6 +- .../{surfaces => materials}/tiger_attr.py | 22 +- .../assets/{surfaces => materials}/tongue.py | 8 +- .../two_color_spots.py | 6 +- .../{surfaces => materials}/twocolorz.py | 6 +- infinigen/assets/materials/utils/__init__.py | 0 .../materials/utils}/surface_utils.py | 8 +- .../assets/{surfaces => materials}/water.py | 16 +- .../waterfall_material.py | 8 +- .../assets/{surfaces => materials}/wood.py | 10 +- .../{underwater => }/mollusk/__init__.py | 0 .../assets/{underwater => }/mollusk/base.py | 2 +- .../{underwater => }/mollusk/generate.py | 14 +- .../assets/{underwater => }/mollusk/shell.py | 24 +- .../assets/{underwater => }/mollusk/snail.py | 18 +- infinigen/assets/monocot/agave.py | 18 +- infinigen/assets/monocot/banana.py | 20 +- infinigen/assets/monocot/generate.py | 6 +- infinigen/assets/monocot/grasses.py | 32 +- infinigen/assets/monocot/growth.py | 30 +- infinigen/assets/monocot/kelp.py | 20 +- infinigen/assets/monocot/pinecone.py | 22 +- infinigen/assets/monocot/tussock.py | 10 +- infinigen/assets/monocot/veratrum.py | 24 +- infinigen/assets/mushroom/cap.py | 26 +- infinigen/assets/mushroom/generate.py | 14 +- infinigen/assets/mushroom/growth.py | 12 +- infinigen/assets/mushroom/stem.py | 24 +- infinigen/assets/rocks/__init__.py | 1 + infinigen/assets/rocks/blender_rock.py | 10 +- infinigen/assets/rocks/pile.py | 18 +- infinigen/assets/scatters/chopped_trees.py | 20 +- infinigen/assets/scatters/coral_reef.py | 16 +- .../assets/scatters/decorative_plants.py | 12 +- infinigen/assets/scatters/fern.py | 10 +- infinigen/assets/scatters/flowerplant.py | 20 +- infinigen/assets/scatters/grass.py | 16 +- infinigen/assets/scatters/ground_leaves.py | 6 +- infinigen/assets/scatters/ground_mushroom.py | 8 +- infinigen/assets/scatters/ground_twigs.py | 14 +- infinigen/assets/scatters/ivy.py | 26 +- infinigen/assets/scatters/jellyfish.py | 8 +- infinigen/assets/scatters/lichen.py | 22 +- infinigen/assets/scatters/mollusk.py | 16 +- infinigen/assets/scatters/monocot.py | 11 +- infinigen/assets/scatters/mushroom.py | 8 +- .../assets/scatters/{rocks.py => pebbles.py} | 12 +- infinigen/assets/scatters/pinecone.py | 10 +- infinigen/assets/scatters/seashells.py | 10 +- infinigen/assets/scatters/seaweed.py | 9 +- infinigen/assets/scatters/slime_mold.py | 18 +- infinigen/assets/scatters/snow_layer.py | 11 +- infinigen/assets/scatters/urchin.py | 9 +- infinigen/assets/scatters/utils/cluster.py | 8 +- infinigen/assets/scatters/utils/selection.py | 6 +- infinigen/assets/scatters/utils/wind.py | 2 +- infinigen/assets/small_plants/fern.py | 16 +- infinigen/assets/small_plants/leaf_general.py | 8 +- infinigen/assets/small_plants/leaf_heart.py | 8 +- .../assets/small_plants/num_leaf_grass.py | 18 +- infinigen/assets/small_plants/snake_plant.py | 14 +- infinigen/assets/small_plants/spider_plant.py | 16 +- infinigen/assets/small_plants/succulent.py | 16 +- infinigen/assets/surfaces/__init__.py | 2 - infinigen/assets/trees/__init__.py | 2 +- infinigen/assets/trees/branch.py | 16 +- infinigen/assets/trees/generate.py | 28 +- infinigen/assets/trees/tree.py | 6 +- infinigen/assets/trees/tree_flower.py | 14 +- infinigen/assets/trees/utils/geometrynodes.py | 4 +- infinigen/assets/trees/utils/helper.py | 2 +- .../assets/tropic_plants/coconut_tree.py | 16 +- .../assets/tropic_plants/leaf_banana_tree.py | 16 +- .../assets/tropic_plants/leaf_palm_plant.py | 4 +- .../assets/tropic_plants/leaf_palm_tree.py | 4 +- infinigen/assets/tropic_plants/palm_tree.py | 14 +- .../tropic_plants/tropic_plant_utils.py | 12 +- infinigen/assets/underwater/__init__.py | 1 + infinigen/assets/underwater/seaweed.py | 26 +- infinigen/assets/underwater/urchin.py | 24 +- infinigen/assets/utils/decorate.py | 10 +- infinigen/assets/utils/draw.py | 14 +- infinigen/assets/utils/laplacian.py | 4 +- infinigen/assets/utils/mesh.py | 10 +- infinigen/assets/utils/misc.py | 4 +- infinigen/assets/utils/nodegroup.py | 10 +- infinigen/assets/utils/object.py | 4 +- infinigen/assets/utils/physics.py | 4 +- infinigen/assets/utils/shortest_path.py | 6 +- infinigen/assets/utils/tag.py | 4 +- infinigen/assets/weather/__init__.py | 0 infinigen/assets/weather/cloud/cloud.py | 22 +- infinigen/assets/weather/cloud/generate.py | 20 +- infinigen/assets/weather/cloud/node.py | 2 +- infinigen/assets/weather/kole_clouds.py | 10 +- infinigen/assets/weather/particles.py | 18 +- infinigen/core/__init__.py | 0 infinigen/core/{core.py => execute_tasks.py} | 79 +- infinigen/core/nodes/color.py | 2 +- infinigen/core/nodes/compatibility.py | 2 +- .../core/nodes/node_transpiler/transpiler.py | 8 +- .../node_transpiler/transpiler_dev_script.py | 10 +- infinigen/core/nodes/node_utils.py | 8 +- infinigen/core/nodes/node_wrangler.py | 8 +- .../nodes/nodegroups/transfer_attributes.py | 8 +- infinigen/core/placement/__init__.py | 0 infinigen/core/placement/animation_policy.py | 8 +- infinigen/core/placement/camera.py | 51 +- infinigen/core/placement/density.py | 6 +- infinigen/core/placement/detail.py | 8 +- infinigen/core/placement/factory.py | 4 +- infinigen/core/placement/instance_scatter.py | 10 +- infinigen/core/placement/particles.py | 8 +- infinigen/core/placement/placement.py | 9 +- infinigen/core/placement/split_in_view.py | 8 +- infinigen/core/rendering/auto_exposure.py | 8 +- infinigen/core/rendering/render.py | 16 +- infinigen/core/rendering/resample.py | 18 +- infinigen/core/{surfaces => }/surface.py | 14 +- infinigen/core/util/__init__.py | 0 infinigen/core/util/blender.py | 2 +- infinigen/core/util/camera.py | 4 +- infinigen/core/util/exporting.py | 2 +- infinigen/core/util/logging.py | 1 - infinigen/core/util/pipeline.py | 6 +- infinigen/core/util/random.py | 6 +- .../.gitignore | 0 .../CMakeLists.txt | 10 +- .../blender_object.cpp | 0 .../blender_object.hpp | 0 .../buffer_arrays.cpp | 0 .../buffer_arrays.hpp | 0 .../camera_view.cpp | 0 .../camera_view.hpp | 0 .../compress_masks.py | 0 .../dependencies/argparse | 0 .../dependencies/cnpy | 0 .../dependencies/eigen | 0 .../dependencies/fast_obj | 0 .../glad/include/EGL/eglplatform.h | 0 .../glad/include/KHR/khrplatform.h | 0 .../dependencies/glad/include/glad/glad.h | 0 .../dependencies/glad/include/glad/glad_egl.h | 0 .../dependencies/glad/src/glad.c | 0 .../dependencies/glad/src/glad_egl.c | 0 .../dependencies/glfw | 0 .../dependencies/glm | 0 .../dependencies/indicators | 0 .../dependencies/json | 0 .../scharstein_flow_viz/README.txt | 0 .../scharstein_flow_viz/colorcode.cpp | 0 .../scharstein_flow_viz/colorcode.h | 0 .../dependencies/stb | 0 .../dependencies/tinycolormap | 0 .../glsl/hair.frag | 0 .../glsl/hair.geom | 0 .../glsl/hair.vert | 0 .../glsl/next_wings.vert | 0 .../glsl/spine.frag | 0 .../glsl/spine.geom | 0 .../glsl/wings.frag | 0 .../glsl/wings.geom | 0 .../glsl/wings.vert | 0 .../{custom_ground_truth => customgt}/io.cpp | 0 .../{custom_ground_truth => customgt}/io.hpp | 0 .../load_blender_mesh.cpp | 0 .../load_blender_mesh.hpp | 0 .../main.cpp | 2 +- .../shader.cpp | 0 .../shader.hpp | 0 .../{custom_ground_truth => customgt}/show.py | 0 .../string_tools.cpp | 0 .../string_tools.hpp | 0 .../utils.cpp | 0 .../utils.hpp | 0 infinigen/datagen/job_funcs.py | 2 +- infinigen/datagen/manage_jobs copy.py | 1278 ----------------- .../tools/blendscript_import_infinigen.py | 2 - .../tools/dev/generate_terrain_assets.py | 4 +- .../datagen/tools/dev/landtile_viewer.py | 4 +- infinigen/datagen/tools/dev/palette/readme.md | 4 +- infinigen/datagen/util/submitit_emulator.py | 2 +- infinigen/terrain/assets/caves/core.py | 11 +- .../terrain/assets/landtiles/ant_landscape.py | 9 +- infinigen/terrain/assets/landtiles/core.py | 4 +- infinigen/terrain/assets/landtiles/custom.py | 14 +- infinigen/terrain/assets/ocean.py | 8 +- .../terrain/assets/upsidedown_mountains.py | 10 +- infinigen/terrain/core.py | 20 +- infinigen/terrain/elements/atmosphere.py | 2 +- infinigen/terrain/elements/caves.py | 10 +- infinigen/terrain/elements/core.py | 4 +- infinigen/terrain/elements/ground.py | 6 +- infinigen/terrain/elements/landtiles.py | 11 +- infinigen/terrain/elements/mountains.py | 6 +- .../terrain/elements/upsidedown_mountains.py | 8 +- infinigen/terrain/elements/voronoi_rocks.py | 4 +- infinigen/terrain/elements/warped_rocks.py | 4 +- infinigen/terrain/elements/waterbody.py | 2 +- infinigen/terrain/land_process/erosion.py | 6 +- infinigen/terrain/land_process/snowfall.py | 7 +- .../terrain/mesher/_marching_cubes_lewiner.py | 2 +- .../terrain/mesher/cube_spherical_mesher.py | 6 +- .../mesher/frontview_spherical_mesher.py | 4 +- infinigen/terrain/mesher/spherical_mesher.py | 4 +- infinigen/terrain/mesher/uniform_mesher.py | 6 +- infinigen/terrain/scene.py | 22 +- .../source/common/surfaces/chunkyrock.h | 4 +- .../source/common/surfaces/cobble_stone.h | 4 +- .../source/common/surfaces/cracked_ground.h | 4 +- .../terrain/source/common/surfaces/dirt.h | 4 +- .../terrain/source/common/surfaces/ice.h | 4 +- .../terrain/source/common/surfaces/mountain.h | 4 +- .../terrain/source/common/surfaces/mud.h | 4 +- .../terrain/source/common/surfaces/sand.h | 4 +- .../source/common/surfaces/sandstone.h | 4 +- .../terrain/source/common/surfaces/snow.h | 4 +- .../terrain/source/common/surfaces/soil.h | 4 +- .../terrain/source/common/surfaces/stone.h | 4 +- infinigen/terrain/surface_kernel/core.py | 2 +- .../terrain/surface_kernel/kernelizer.py | 2 +- infinigen/terrain/utils/camera.py | 2 +- infinigen/terrain/utils/ctype_util.py | 3 +- infinigen/terrain/utils/kernelizer_util.py | 6 +- infinigen/terrain/utils/logging.py | 2 +- infinigen/terrain/utils/mesh.py | 6 +- .../tools/blendscript_import_infinigen.py | 25 + .../tools/install/compile_flip_fluids.sh | 2 +- infinigen/tools/install/compile_opengl.sh | 6 +- infinigen/tools/submit_asset_cache.py | 58 + .../tools/terrain/generate_terrain_assets.py | 83 ++ .../tools/{ => terrain}/kernelize_surfaces.py | 10 +- infinigen/tools/terrain/landtile_viewer.py | 40 + infinigen/tools/terrain/palette/.gitignore | 3 + infinigen/tools/terrain/palette/demo1.png | Bin 0 -> 193176 bytes infinigen/tools/terrain/palette/demo2.png | Bin 0 -> 18428 bytes infinigen/tools/terrain/palette/demo3.png | Bin 0 -> 650307 bytes infinigen/tools/terrain/palette/demo4.png | Bin 0 -> 82598 bytes infinigen/tools/terrain/palette/palette.py | 117 ++ infinigen/tools/terrain/palette/readme.md | 47 + infinigen/tools/terrain/params_parser.py | 49 + install.sh | 24 +- setup.py | 51 + 501 files changed, 3008 insertions(+), 3983 deletions(-) delete mode 100644 examples/scripts/render_river_video.sh delete mode 100644 examples/scripts/render_video_fire.sh rename infinigen/assets/{underwater => }/corals/__init__.py (100%) rename infinigen/assets/{underwater => }/corals/base.py (91%) rename infinigen/assets/{underwater => }/corals/diff_growth.py (88%) rename infinigen/assets/{underwater => }/corals/elkhorn.py (88%) rename infinigen/assets/{underwater => }/corals/fan.py (83%) rename infinigen/assets/{underwater => }/corals/generate.py (93%) rename infinigen/assets/{underwater => }/corals/laplacian.py (65%) rename infinigen/assets/{underwater => }/corals/reaction_diffusion.py (84%) rename infinigen/assets/{underwater => }/corals/star.py (91%) rename infinigen/assets/{underwater => }/corals/tentacles.py (88%) rename infinigen/assets/{underwater => }/corals/tree.py (89%) rename infinigen/assets/{underwater => }/corals/tube.py (88%) rename infinigen/assets/creatures/insects/{assembled => }/dragonfly.py (94%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_bird_duck.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_bird_gull.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_bird_robin.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_feline_cheetah.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_feline_housecat.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_feline_tiger.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_feline_tiger_2.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_feline_wolf.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_fish_bluefish.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_fish_crappie.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_fish_eel.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_fish_pickerel.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_fish_pufferfish.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_fish_spadefish.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_herbivore_cow.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_herbivore_giraffe.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_herbivore_goat.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_herbivore_llama.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_insect_bee.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_insect_beetle.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_insect_tarantula.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/body_llama.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/head_carnivore_tiger.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/head_carnivore_wolf.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/head_herbivore_cow.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/head_herbivore_giraffe.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/head_herbivore_goat.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/head_herbivore_llama.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/head_insect_beetle.npy (100%) rename infinigen/assets/creatures/{ => parts}/nurbs_data/head_insect_wasp.npy (100%) rename infinigen/{core/surfaces => assets/creatures/util/animation}/__init__.py (100%) create mode 100644 infinigen/assets/creatures/util/geometry/cpp_utils/__init__.py rename infinigen/assets/lighting/{lighting.py => sky_lighting.py} (94%) create mode 100644 infinigen/assets/materials/__init__.py rename infinigen/assets/{surfaces => materials}/aluminumdisp2tut.py (96%) rename infinigen/assets/{surfaces => materials}/atmosphere_light_haze.py (81%) rename infinigen/assets/{surfaces => materials}/bark.py (96%) rename infinigen/assets/{surfaces => materials}/bark_birch.py (98%) rename infinigen/assets/{surfaces => materials}/bark_random.py (99%) rename infinigen/assets/{surfaces => materials}/basic_bsdf.py (87%) rename infinigen/assets/{surfaces => materials}/beak.py (92%) rename infinigen/assets/{surfaces => materials}/bird.py (98%) rename infinigen/assets/{surfaces => materials}/blackbody_shader.py (90%) rename infinigen/assets/{surfaces => materials}/bone.py (95%) rename infinigen/assets/{surfaces => materials}/chitin.py (96%) rename infinigen/assets/{surfaces => materials}/chunkyrock.py (94%) rename infinigen/assets/{surfaces => materials}/cobble_stone.py (96%) rename infinigen/assets/{surfaces => materials}/cracked_ground.py (96%) rename infinigen/assets/{surfaces => materials}/dirt.py (97%) rename infinigen/assets/{surfaces => materials}/eyeball.py (92%) rename infinigen/assets/{surfaces => materials}/face_size_visualizer.py (88%) rename infinigen/assets/{surfaces => materials}/fish_eye_shader.py (97%) rename infinigen/assets/{surfaces => materials}/fishbody.py (99%) rename infinigen/assets/{surfaces => materials}/fishfin.py (77%) rename infinigen/assets/{surfaces => materials}/giraffe_attr.py (90%) rename infinigen/assets/{surfaces => materials}/grass_blade_texture.py (97%) rename infinigen/assets/{surfaces => materials}/horn.py (94%) rename infinigen/assets/{surfaces => materials}/ice.py (91%) rename infinigen/assets/{surfaces => materials}/lava.py (97%) rename infinigen/assets/{surfaces => materials}/mountain.py (96%) rename infinigen/assets/{surfaces => materials}/mud.py (95%) rename infinigen/assets/{surfaces => materials}/new_whitewater.py (84%) rename infinigen/assets/{surfaces => materials}/nose.py (88%) rename infinigen/assets/{surfaces => materials}/reptile_brown_circle_attr.py (97%) rename infinigen/assets/{surfaces => materials}/reptile_gray_attr.py (94%) rename infinigen/assets/{surfaces => materials}/reptile_two_color_attr.py (96%) rename infinigen/assets/{surfaces => materials}/river_water.py (97%) rename infinigen/assets/{surfaces => materials}/sand.py (95%) rename infinigen/assets/{surfaces => materials}/sandstone.py (98%) rename infinigen/assets/{surfaces => materials}/scale.py (98%) rename infinigen/assets/{surfaces => materials}/simple_brownish.py (86%) rename infinigen/assets/{surfaces => materials}/simple_greenery.py (90%) rename infinigen/assets/{surfaces => materials}/simple_whitish.py (87%) rename infinigen/assets/{surfaces => materials}/slimy.py (95%) rename infinigen/assets/{surfaces => materials}/smoke_material.py (74%) rename infinigen/assets/{surfaces => materials}/snake_plant.py (96%) rename infinigen/assets/{surfaces => materials}/snake_scale.py (98%) rename infinigen/assets/{surfaces => materials}/snake_shaders.py (97%) rename infinigen/assets/{surfaces => materials}/snow.py (96%) rename infinigen/assets/{surfaces => materials}/soil.py (97%) rename infinigen/assets/{surfaces => materials}/spider_plant.py (85%) rename infinigen/assets/{surfaces => materials}/spot_sparse_attr.py (93%) rename infinigen/assets/{surfaces => materials}/stone.py (97%) rename infinigen/assets/{surfaces => materials}/succulent.py (98%) rename infinigen/assets/{surfaces => materials}/three_color_spots.py (97%) rename infinigen/assets/{surfaces => materials}/tiger_attr.py (90%) rename infinigen/assets/{surfaces => materials}/tongue.py (86%) rename infinigen/assets/{surfaces => materials}/two_color_spots.py (95%) rename infinigen/assets/{surfaces => materials}/twocolorz.py (93%) create mode 100644 infinigen/assets/materials/utils/__init__.py rename infinigen/{core/surfaces => assets/materials/utils}/surface_utils.py (97%) rename infinigen/assets/{surfaces => materials}/water.py (96%) rename infinigen/assets/{surfaces => materials}/waterfall_material.py (94%) rename infinigen/assets/{surfaces => materials}/wood.py (92%) rename infinigen/assets/{underwater => }/mollusk/__init__.py (100%) rename infinigen/assets/{underwater => }/mollusk/base.py (90%) rename infinigen/assets/{underwater => }/mollusk/generate.py (93%) rename infinigen/assets/{underwater => }/mollusk/shell.py (88%) rename infinigen/assets/{underwater => }/mollusk/snail.py (93%) create mode 100644 infinigen/assets/rocks/__init__.py rename infinigen/assets/scatters/{rocks.py => pebbles.py} (70%) delete mode 100644 infinigen/assets/surfaces/__init__.py create mode 100644 infinigen/assets/underwater/__init__.py create mode 100644 infinigen/assets/weather/__init__.py create mode 100644 infinigen/core/__init__.py rename infinigen/core/{core.py => execute_tasks.py} (89%) create mode 100644 infinigen/core/placement/__init__.py rename infinigen/core/{surfaces => }/surface.py (96%) create mode 100644 infinigen/core/util/__init__.py rename infinigen/datagen/{custom_ground_truth => customgt}/.gitignore (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/CMakeLists.txt (79%) rename infinigen/datagen/{custom_ground_truth => customgt}/blender_object.cpp (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/blender_object.hpp (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/buffer_arrays.cpp (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/buffer_arrays.hpp (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/camera_view.cpp (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/camera_view.hpp (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/compress_masks.py (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/argparse (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/cnpy (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/eigen (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/fast_obj (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/glad/include/EGL/eglplatform.h (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/glad/include/KHR/khrplatform.h (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/glad/include/glad/glad.h (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/glad/include/glad/glad_egl.h (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/glad/src/glad.c (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/glad/src/glad_egl.c (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/glfw (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/glm (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/indicators (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/json (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/scharstein_flow_viz/README.txt (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/scharstein_flow_viz/colorcode.cpp (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/scharstein_flow_viz/colorcode.h (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/stb (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/dependencies/tinycolormap (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/glsl/hair.frag (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/glsl/hair.geom (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/glsl/hair.vert (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/glsl/next_wings.vert (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/glsl/spine.frag (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/glsl/spine.geom (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/glsl/wings.frag (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/glsl/wings.geom (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/glsl/wings.vert (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/io.cpp (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/io.hpp (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/load_blender_mesh.cpp (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/load_blender_mesh.hpp (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/main.cpp (99%) rename infinigen/datagen/{custom_ground_truth => customgt}/shader.cpp (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/shader.hpp (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/show.py (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/string_tools.cpp (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/string_tools.hpp (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/utils.cpp (100%) rename infinigen/datagen/{custom_ground_truth => customgt}/utils.hpp (100%) delete mode 100644 infinigen/datagen/manage_jobs copy.py create mode 100644 infinigen/tools/blendscript_import_infinigen.py create mode 100644 infinigen/tools/submit_asset_cache.py create mode 100644 infinigen/tools/terrain/generate_terrain_assets.py rename infinigen/tools/{ => terrain}/kernelize_surfaces.py (73%) create mode 100644 infinigen/tools/terrain/landtile_viewer.py create mode 100644 infinigen/tools/terrain/palette/.gitignore create mode 100644 infinigen/tools/terrain/palette/demo1.png create mode 100644 infinigen/tools/terrain/palette/demo2.png create mode 100644 infinigen/tools/terrain/palette/demo3.png create mode 100644 infinigen/tools/terrain/palette/demo4.png create mode 100644 infinigen/tools/terrain/palette/palette.py create mode 100644 infinigen/tools/terrain/palette/readme.md create mode 100644 infinigen/tools/terrain/params_parser.py create mode 100644 setup.py diff --git a/.gitignore b/.gitignore index 8b3a142d7..42006c990 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,6 @@ slurm-*.out __pycache__ *.blend *.blend1 -*/worldgen/terrain/gen_occlusions/dependencies/* *.obj *.DS_Store **._.DS_Store diff --git a/.gitmodules b/.gitmodules index 06a89c419..2776bb127 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,32 +2,32 @@ path = infinigen/infinigen_gpl url = https://github.com/princeton-vl/infinigen_gpl.git [submodule "infinigen/datagen/custom_ground_truth/dependencies/eigen"] - path = infinigen/datagen/custom_ground_truth/dependencies/eigen + path = infinigen/datagen/customgt/dependencies/eigen url = https://gitlab.com/libeigen/eigen.git [submodule "infinigen/datagen/custom_ground_truth/dependencies/argparse"] - path = infinigen/datagen/custom_ground_truth/dependencies/argparse + path = infinigen/datagen/customgt/dependencies/argparse url = https://github.com/p-ranav/argparse.git [submodule "infinigen/datagen/custom_ground_truth/dependencies/cnpy"] - path = infinigen/datagen/custom_ground_truth/dependencies/cnpy + path = infinigen/datagen/customgt/dependencies/cnpy url = https://github.com/rogersce/cnpy.git [submodule "infinigen/datagen/custom_ground_truth/dependencies/indicators"] - path = infinigen/datagen/custom_ground_truth/dependencies/indicators + path = infinigen/datagen/customgt/dependencies/indicators url = https://github.com/p-ranav/indicators.git [submodule "infinigen/datagen/custom_ground_truth/dependencies/tinycolormap"] - path = infinigen/datagen/custom_ground_truth/dependencies/tinycolormap + path = infinigen/datagen/customgt/dependencies/tinycolormap url = https://github.com/yuki-koyama/tinycolormap.git [submodule "infinigen/datagen/custom_ground_truth/dependencies/glm"] - path = infinigen/datagen/custom_ground_truth/dependencies/glm + path = infinigen/datagen/customgt/dependencies/glm url = https://github.com/g-truc/glm.git [submodule "infinigen/datagen/custom_ground_truth/dependencies/fast_obj"] - path = infinigen/datagen/custom_ground_truth/dependencies/fast_obj + path = infinigen/datagen/customgt/dependencies/fast_obj url = https://github.com/thisistherk/fast_obj.git [submodule "infinigen/datagen/custom_ground_truth/dependencies/json"] - path = infinigen/datagen/custom_ground_truth/dependencies/json + path = infinigen/datagen/customgt/dependencies/json url = https://github.com/nlohmann/json.git [submodule "infinigen/datagen/custom_ground_truth/dependencies/stb"] - path = infinigen/datagen/custom_ground_truth/dependencies/stb + path = infinigen/datagen/customgt/dependencies/stb url = https://github.com/nothings/stb.git [submodule "infinigen/datagen/custom_ground_truth/dependencies/glfw"] - path = infinigen/datagen/custom_ground_truth/dependencies/glfw + path = infinigen/datagen/customgt/dependencies/glfw url = https://github.com/glfw/glfw.git diff --git a/Dockerfile b/Dockerfile index 7b460e293..866e58161 100644 --- a/Dockerfile +++ b/Dockerfile @@ -32,7 +32,7 @@ fi RUN mkdir /opt/infinigen WORKDIR /opt/infinigen COPY . . -RUN chmod +x worldgen/tools/install/compile_opengl.sh +RUN chmod +x infinigen/tools/install/compile_opengl.sh RUN conda init bash \ && . ~/.bashrc \ && conda create --name infinigen python=3.10 \ diff --git a/Makefile b/Makefile index 70ead5f4a..fa677b2f3 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,7 @@ docker-run: -e "DISPLAY=$(DISPLAY)" \ -e "QT_X11_NO_MITSHM=1" \ -v "/tmp/.X11-unix:/tmp/.X11-unix:rw" \ - -v $(PWD)/worldgen/outputs:/opt/infinigen/worldgen/outputs \ + -v $(PWD)/outputs:/opt/infinigen/outputs \ -e "XAUTHORITY=$(XAUTH)" \ -e ROS_IP=127.0.0.1 \ --cap-add=SYS_PTRACE \ @@ -57,14 +57,14 @@ docker-run: -e "DISPLAY=$(DISPLAY)" \ -e "QT_X11_NO_MITSHM=1" \ -v "/tmp/.X11-unix:/tmp/.X11-unix:rw" \ - -v $(PWD)/worldgen/outputs:/opt/infinigen/worldgen/outputs \ + -v $(PWD)/outputs:/opt/infinigen/outputs \ -e "XAUTHORITY=$(XAUTH)" \ -e ROS_IP=127.0.0.1 \ --cap-add=SYS_PTRACE \ -v /etc/group:/etc/group:ro \ "$(DOCKER_TAG)" bash - docker exec infinigen /bin/bash -c worldgen/tools/install/compile_opengl.sh + docker exec infinigen /bin/bash -c infinigen/tools/install/compile_opengl.sh docker-run-no-opengl: echo "Launching Docker image without OpenGL ground truth" @@ -73,7 +73,7 @@ docker-run-no-opengl: --gpus=all \ --env NVIDIA_DISABLE_REQUIRE=1 \ -e "BLENDER=/opt/infinigen/blender/blender" \ - -v $(PWD)/worldgen/outputs:/opt/infinigen/worldgen/outputs \ + -v $(PWD)/outputs:/opt/infinigen/outputs \ "$(DOCKER_TAG)" /bin/bash docker-run-no-gpu: @@ -84,20 +84,20 @@ docker-run-no-gpu: -e "DISPLAY=$(DISPLAY)" \ -e "QT_X11_NO_MITSHM=1" \ -v "/tmp/.X11-unix:/tmp/.X11-unix:rw" \ - -v $(PWD)/worldgen/outputs:/opt/infinigen/worldgen/outputs \ + -v $(PWD)/outputs:/opt/infinigen/outputs \ -e "XAUTHORITY=$(XAUTH)" \ -e ROS_IP=127.0.0.1 \ --cap-add=SYS_PTRACE \ -v /etc/group:/etc/group:ro \ "$(DOCKER_TAG)" /bin/bash \ - docker exec infinigen /bin/bash -c worldgen/tools/install/compile_opengl.sh + docker exec infinigen /bin/bash -c infinigen/tools/install/compile_opengl.sh docker-run-no-gpu-opengl: echo "Launching Docker image without GPU passthrough or OpenGL" docker run -td --rm --privileged --net=host --ipc=host \ --name="infinigen" \ -e "BLENDER=/opt/infinigen/blender/blender" \ - -v $(PWD)/worldgen/outputs:/opt/infinigen/worldgen/outputs \ + -v $(PWD)/outputs:/opt/infinigen/outputs \ "$(DOCKER_TAG)" /bin/bash \ No newline at end of file diff --git a/README.md b/README.md index b2116d05d..3e5d6df35 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Please see our [project roadmap](https://infinigen.org/roadmap) and follow us at ### Contributing We welcome contributions! You can contribute in many ways: - **Contribute code to this repository** - We welcome code contributions. More guidelines coming soon. -- **Contribute procedural generators** - `worldgen/nodes/node_transpiler/dev_script.py` provides tools to convert artist-friendly [Blender Nodes](https://docs.blender.org/manual/en/2.79/render/blender_render/materials/nodes/introduction.html) into python code. Tutorials and guidelines coming soon. +- **Contribute procedural generators** - `infinigen/nodes/node_transpiler/dev_script.py` provides tools to convert artist-friendly [Blender Nodes](https://docs.blender.org/manual/en/2.79/render/blender_render/materials/nodes/introduction.html) into python code. Tutorials and guidelines coming soon. - **Contribute pre-generated data** - Anyone can contribute their computing power to create data and share it with the community. Please stay tuned for a repository of pre-generated data. ### Getting Help @@ -63,7 +63,7 @@ Please post this repository's Github Issues page for help. Please run your comma - What version of the code are you using (link a commit hash), and what if any modifications have you made (new configs, code edits) - What exact command did you run? - What were the output logs of the command you ran? - - If using `manage_datagen_jobs`, look in `outputs/MYJOB/MYSEED/logs/` to find the right one. + - If using `manage_jobs`, look in `outputs/MYJOB/MYSEED/logs/` to find the right one. - What was the exact python error and stacktrace, if applicable? ### Acknowledgements diff --git a/docs/ConfiguringInfinigen.md b/docs/ConfiguringInfinigen.md index e4bdc58a5..5563b380c 100644 --- a/docs/ConfiguringInfinigen.md +++ b/docs/ConfiguringInfinigen.md @@ -10,11 +10,11 @@ Generating scenes with Infinigen typically involves two main python scripts: 1. [examples/generate_nature.py](../examples/generate_nature.py) - our example scene composition script, which invokes and places assets to create a realistic nature scene. 1. [manage_jobs.py](../infinigen/datagen/manage_jobs.py) - a script which invokes the above scene composition script many times to generate a useful dataset. -`manage_datagen_jobs.py` controls how many and what jobs will be run, and `generate.py` determines what will happen during those jobs. Ultimately both programs must be configured correctly in order to make useful data. +`manage_jobs.py` controls how many and what jobs will be run, and `examples/generate_nature.py` determines what will happen during those jobs. Ultimately both programs must be configured correctly in order to make useful data. ### Scene tasks -To complete one Infinigen scene, `manage_datagen_jobs.py` will run several "tasks", each composed of a single execution of `generate.py`(You ran similar processes yourself in the step by step part of "Hello World"). +To complete one Infinigen scene, `manage_jobs.py` will run several "tasks", each composed of a single execution of `examples/generate_nature.py`(You ran similar processes yourself in the step by step part of "Hello World"). Typically, these tasks are as follows: 1. `coarse`, which generates coarse terrain shape, puts placeholders for creatures and large trees / obstacles, and generates all small assets (twigs, particles, etc) that will be "instanced", IE scattered across the terrain with repetition. @@ -31,15 +31,15 @@ Infinigen is designed to run many independent scenes in paralell. This means tha #### Overrides and Config Files -Both `manage_datagen_jobs.py` and `generate.py` can be configured via the commandline or config files, using [Google's "Gin Config"](https://github.com/google/gin-config). Gin allows you to insert new default keyword arguments ("kwargs") for any function decorated with `@gin.configurable`; many such functions exist in our codebase, and via gin overrides you can create datsets suiting many diverse applications, as is explained in the coming sections. +Both `manage_jobs.py` and `examples/generate_nature.py` can be configured via the commandline or config files, using [Google's "Gin Config"](https://github.com/google/gin-config). Gin allows you to insert new default keyword arguments ("kwargs") for any function decorated with `@gin.configurable`; many such functions exist in our codebase, and via gin overrides you can create datsets suiting many diverse applications, as is explained in the coming sections. -To use gin, simply add commandline arguments such as `-p compose_scene.rain_particles_chance = 1.0` to override the chance of rain, or `--pipeline_overrides iterate_scene_tasks.frame_range=[1,25]` to set a video's length to 24 frames. You can chain many statements together, separated by spaces, to configure many parts of the system at once. These statements depend on knowing the python names of the function and keyword argument you wish to override. To find parameters you wish to override, you should browse `worldgen/config/base.gin` and other configs, or `generate.py` and the definitions of any functions it calls. Better documentation and organization of the available parameters will come in future versions. +To use gin, simply add commandline arguments such as `-p compose_scene.rain_particles_chance = 1.0` to override the chance of rain, or `--pipeline_overrides iterate_scene_tasks.frame_range=[1,25]` to set a video's length to 24 frames. You can chain many statements together, separated by spaces, to configure many parts of the system at once. These statements depend on knowing the python names of the function and keyword argument you wish to override. To find parameters you wish to override, you should browse `examples/configs/base.gin` and other configs, or `examples/generate_nature.py` and the definitions of any functions it calls. Better documentation and organization of the available parameters will come in future versions. -If you find a useful and related combination of these commandline overrides, you can write them into a `.gin` file in `worldgen/configs`. Then, to load that config, just include the name of the file into the `--configs`. If your overrides target `manage_datagen_jobs` rather than `generate.py` you should place the config file in `worldgen/tools/pipeline_configs` and use `--pipeline_configs` rather than `--configs`. +If you find a useful and related combination of these commandline overrides, you can write them into a `.gin` file in `examples/configs`. Then, to load that config, just include the name of the file into the `--configs`. If your overrides target `manage_jobs` rather than `examples/generate_nature.py` you should place the config file in `datagen/configs` and use `--pipeline_configs` rather than `--configs`. -Our `generate.py` driver always loads [`worldgen/configs/base.gin`][../worldgen/configs/base.gin], and you can inspect / modify this file to see many common and useful gin override options. +Our `examples/generate_nature.py` driver always loads [`examples/configs/base.gin`][../examples/configs/base.gin], and you can inspect / modify this file to see many common and useful gin override options. -`generate.py` also expects that one file from (configs/scene_types/)[worldgen/config/scene_types] will be loaded. These scene_type configs contain gin overrides designed to encode the semantic constraints of real natural habitats (e.g. `worldgen/scene_types/desert.gin` causes sand to appear and cacti to be more likely). +`examples/generate_nature.py` also expects that one file from (configs/scene_types/)[examples/configs/scene_types] will be loaded. These scene_type configs contain gin overrides designed to encode the semantic constraints of real natural habitats (e.g. `examples/configs/scene_types/desert.gin` causes sand to appear and cacti to be more likely). ### Moving beyond "Hello World" @@ -57,8 +57,8 @@ Here is a breakdown of what every commandline argument does, and ideas for how y - `--specific_seed 0` forces the system to use a random seed of your choice, rather than choosing one at random. Change this seed to get a different random variation, or remove it to have the program choose a seed at random - `--num_scenes` decides how many unique scenes the program will attempt to generate before terminating. Once you have removed `--specific_seed`, you can increase this to generate many scenes in sequence or in paralell. - `--configs desert.gin simple.gin` forces the command to generate a desert scene, and to do so with relatively low mesh detail, low render resolution, low render samples, and some asset types disabled. - - Do `--configs snowy_mountain.gin simple.gin` to try out a different scene type (`snowy_mountain.gin` can instead be any scene_type option from `worldgen/configs/scene_types/`) - - Remove the `desert.gin` and just specify `--configs simple.gin` to use random scene types according to the weighted list in `worldgen/tools/pipeline_configs/base.gin`. + - Do `--configs snowy_mountain.gin simple.gin` to try out a different scene type (`snowy_mountain.gin` can instead be any scene_type option from `examples/configs/scene_types/`) + - Remove the `desert.gin` and just specify `--configs simple.gin` to use random scene types according to the weighted list in `datagen/configs/base.gin`. - You have the option of removing `simple.gin` and specify neither of the original configs. This turns off the many detail-reduction options included in `simple.gin`, and will create scenes closer to those in our intro video, albeit at significant compute costs. Removing `simple.gin` will likely cause crashes unless using a workstation/server with large amounts of RAM and VRAM. You can find more details on optimizing scene content for performance [here](#config-overrides-for-mesh-detail-and-performance). - `--pipeline_configs local_16GB.gin monocular.gin blender_gt.gin` - `local_16GB.gin` specifies to run only a single scene at a time, and to run each task as a local python process. See [here](#configuring-available-computing-resources) for more options @@ -74,11 +74,11 @@ This section highlights commandline options to help you deploy Infinigen on your ### Configuring available computing resources -`worldgen/tools/pipeline_configs/compute_platform` provides several preset configs to help you run the appropriate number and type of Infinigen tasks suitable to your hardware.
These configs are mutually exclusive, but you must include at least one.
+`datagen/configs/compute_platform` provides several preset configs to help you run the appropriate number and type of Infinigen tasks suitable to your hardware.
These configs are mutually exclusive, but you must include at least one.
-`local_16GB.gin` through `local_256GB.gin` are intended for laptops, desktop workstations, or a single headless node. These configs run each task as a child process on the same machine that ran `manage_datagen_jobs.py`. Each config runs the right number of concurrent jobs for the specified amount of RAM. If you have a different amount of RAM than the options provided, you should override `manage_datagen_jobs.num_concurrent`to your amount of system RAM divided by 20GB. Ultimately, the amount of concurrent process you can run will depend on the format (single-image vs. video) and complexity (detail, clutter, etc) of the scenes you wish to generate - see [here](#config-overrides-for-mesh-detail-and-performance) to customize. +`local_16GB.gin` through `local_256GB.gin` are intended for laptops, desktop workstations, or a single headless node. These configs run each task as a child process on the same machine that ran `manage_jobs.py`. Each config runs the right number of concurrent jobs for the specified amount of RAM. If you have a different amount of RAM than the options provided, you should override `manage_jobs.num_concurrent`to your amount of system RAM divided by 20GB. Ultimately, the amount of concurrent process you can run will depend on the format (single-image vs. video) and complexity (detail, clutter, etc) of the scenes you wish to generate - see [here](#config-overrides-for-mesh-detail-and-performance) to customize. -`slurm.gin` is a special config designed to deploy Infinigen onto SLURM computing clusters. When using this config, each task will be executed as a remote slurm job (using [submitit](https://github.com/facebookincubator/submitit)), with time-limit/CPU/RAM requests set as specified in `slurm.gin`. If your group has a SLURM partition name, please set `PARTITION = "mygroupname"` in `slurm.gin`. If you are able to run very long SLURM jobs (>= ~3 days) you may also consider submitting `manage_datagen_jobs` with `local_256GB.gin` as a single long slurm job. +`slurm.gin` is a special config designed to deploy Infinigen onto SLURM computing clusters. When using this config, each task will be executed as a remote slurm job (using [submitit](https://github.com/facebookincubator/submitit)), with time-limit/CPU/RAM requests set as specified in `slurm.gin`. If your group has a SLURM partition name, please set `PARTITION = "mygroupname"` in `slurm.gin`. If you are able to run very long SLURM jobs (>= ~3 days) you may also consider submitting `manage_jobs` with `local_256GB.gin` as a single long slurm job. Please submit a Github Issue for help with deploying Infinigen on your compute. @@ -101,31 +101,31 @@ If you have more than one GPU and are using a `local_*.gin` compute config, each ### Rendering Video, Stereo and other data formats -Generating a video, stereo or other dataset typically requires more render jobs, so we must instruct `manage_datagen_jobs.py` to run those jobs. `worldgen/tools/pipeline_configs/data_schema/` provides many options for you to use in your `--pipeline_configs`, including `monocular_video.gin` and `stereo.gin`.
These configs are typically mutually exclusive, and you must include at least one
+Generating a video, stereo or other dataset typically requires more render jobs, so we must instruct `manage_jobs.py` to run those jobs. `datagen/configs/data_schema/` provides many options for you to use in your `--pipeline_configs`, including `monocular_video.gin` and `stereo.gin`.
These configs are typically mutually exclusive, and you must include at least one
:exclamation: Our terrain system resolves its signed distance function (SDF) to view-specific meshes, which must be updated as the camera moves. For video rendering, we strongly recommend using the `high_quality_terrain` config to avoid perceptible flickering and temporal aliasing. This config meshes the SDF at very high detail, to create seamless video. However, it has high compute costs, so we recommend also using `--pipeline_config cuda_terrain` on a machine with an NVIDIA GPU. For applications with fast moving cameras, you may need to update the terrain mesh more frequently by decreasing `iterate_scene_tasks.view_block_size = 16`. To create longer videos, modify `iterate_scene_tasks.frame_range` in `monocular_video.gin` (note: we use 24fps video by default). `iterate_scene_tasks.view_block_size` controls how many frames will be grouped into each `fine_terrain` and render / ground-truth task. -If you need more than two cameras, or want to customize their placement, see `worldgen/config/base.gin`'s `camera.spawn_camera_rigs.camera_rig_config` for advice on existing options, or write your own code to instantiate a custom camera setup. +If you need more than two cameras, or want to customize their placement, see `examples/configs/base.gin`'s `camera.spawn_camera_rigs.camera_rig_config` for advice on existing options, or write your own code to instantiate a custom camera setup. ### Config Overrides to Customize Scene Content :bulb: If you only care about few specific assets, or want to export Infinigen assets to another project, instead see [Generating individual assets](GeneratingIndividualAssets.md). -You can achieve a great deal of customization by browsing and editing `worldgen/config/base.gin` - e.g. modifying cameras, lighting, asset placement, etc. +You can achieve a great deal of customization by browsing and editing `examples/configs/base.gin` - e.g. modifying cameras, lighting, asset placement, etc. - `base.gin` only provides the default values of these configs, and may be overridden by scene_type configs. To apply a setting globally across all scene types, you should put them in a new config placed at the end of your `--configs` argument (so that it's overrides are applied last), or use commandline overrides. -However, many options exist which are not present in base.gin. At present, you must browse `generate.py` to find the part of the code you wish to customize, and look through the relevant code for what more advanced @gin.configurable functions are available. You can also add @gin.configurable to most functions to allow additional configuration. More documentation on available parameters is coming soon. +However, many options exist which are not present in base.gin. At present, you must browse `examples/generate_nature.py` to find the part of the code you wish to customize, and look through the relevant code for what more advanced @gin.configurable functions are available. You can also add @gin.configurable to most functions to allow additional configuration. More documentation on available parameters is coming soon. -For most steps of `generate.py`'s `compose_scene` function, we use our `RandomStageExecutor` wrapper to decide whether the stage is run, and handle other bookkeeping. This means that if you want to decide the probability with which some asset is included in a scene, you can use the gin override `compose_scene.trees_chance=1.0` or something similar depending on the name string provided as the first argument of the relevant run_stage calls in this way, e.g. `compose_scene.rain_particles_chance=0.9`to make most scenes rainy, or `compose_scene.flowers_chance=0.1` to make flowers rarer. +For most steps of `examples/generate_nature.py`'s `compose_scene` function, we use our `RandomStageExecutor` wrapper to decide whether the stage is run, and handle other bookkeeping. This means that if you want to decide the probability with which some asset is included in a scene, you can use the gin override `compose_scene.trees_chance=1.0` or something similar depending on the name string provided as the first argument of the relevant run_stage calls in this way, e.g. `compose_scene.rain_particles_chance=0.9`to make most scenes rainy, or `compose_scene.flowers_chance=0.1` to make flowers rarer. -A common request is to just turn off things you don't want to see, which can be achieved by adding `compose_scene.trees_chance=0.0` or similar to your `-p` argument or a loaded config file. To conveniently turn off lots of things at the same time, we provide configs in `worldgen/configs/disable_assets` to disable things like all creatures, or all particles. +A common request is to just turn off things you don't want to see, which can be achieved by adding `compose_scene.trees_chance=0.0` or similar to your `-p` argument or a loaded config file. To conveniently turn off lots of things at the same time, we provide configs in `examples/configs/disable_assets` to disable things like all creatures, or all particles. -You will also encounter configs using what we term a "registry pattern", e.g. `worldgen/config/base_surface_registry.gin`'s `ground_collection`. "Registries", in this project, are a list of discrete generators, with weights indicating how relatively likely they are to be chosen each time the registry is sampled. +You will also encounter configs using what we term a "registry pattern", e.g. `examples/configs/base_surface_registry.gin`'s `ground_collection`. "Registries", in this project, are a list of discrete generators, with weights indicating how relatively likely they are to be chosen each time the registry is sampled. - For example, in `base_surface_registry.gin`, `surface.registry.beach` specifies `("sand", 10)` to indicate that sand has high weight to be chosen to be assigned for the beach category. - Weights are normalized by their overall sum to obtain a probability distribution. - - Name strings undergo lookup in the relevant source code folders, e.g. the name "sand" in a surface registry maps to `worldgen/surfaces/templates/sand.py`. + - Name strings undergo lookup in the relevant source code folders, e.g. the name "sand" in a surface registry maps to `infinigen/assets/materials/sand.py`. ### Config Overrides for mesh detail and performance @@ -143,7 +143,7 @@ Infinigen curbs memory costs by only populating assets up to a certain distance - Similarly to the above, `compose_scene.near_distance` controls the maximum distance to scatter tiny particles like pine needles. - Infinigen does not populate assets which are far outside the camera frustrum. You may attempt to reduce camera FOV to minimize how many assets are in view, but be warned there will be minimal or significantly diminishing returns on performance, due to the need to keep out-of-view assets loaded to retain accurate lighting/shadows. -We also provide `worldgen/configs/performance/dev.gin`, a config which sets many of the above performance parameters to achieve lower scenes. We often use this config to obtain previews for development purposes, but it may also be suitable for generating lower resolution images/scenes for some tasks. +We also provide `examples/configs/performance/dev.gin`, a config which sets many of the above performance parameters to achieve lower scenes. We often use this config to obtain previews for development purposes, but it may also be suitable for generating lower resolution images/scenes for some tasks. Our current system determines asset mesh resolution based on the _closest distance_ it comes to the camera during an entire trajectory. Therefore, longer videos are more expensive, as more assets will be closer to the camera at some point in the trajectory. Options exist to re-generate assets at new resolutions over the course of a video to curb these costs - please make a Github Issue for advice. @@ -152,9 +152,9 @@ If you find yourself bottlenecked by GPU time, you should consider the following - Reduce `base.gin`'s `full/render_image.num_samples = 8192` or `compose_scene.generate_resolution = (1920, 1080)`. This proportionally reduces rendering FLOPS, with some diminishing returns due to BVH setup time. - If your GPU(s) are _underutilized_, try the reverse of these tips. -Some scene type configs are also generally more expensive than others. `forest.gin` and `coral.gin` are very expensive due to dense detailed fauna, wheras `artic` and `snowy_mountain` are very cheap. Low-resource compute settings (<64GB) of RAM may only be able to handle a subset of our `worldgen/config/scene_type/` options, and you may wish to tune the ratios of scene_types by editing `worldgen/tools/pipeline_configs/base.gin` or otherwise overriding `sample_scene_spec.config_distribution`. +Some scene type configs are also generally more expensive than others. `forest.gin` and `coral.gin` are very expensive due to dense detailed fauna, wheras `artic` and `snowy_mountain` are very cheap. Low-resource compute settings (<64GB) of RAM may only be able to handle a subset of our `examples/configs/scene_type/` options, and you may wish to tune the ratios of scene_types by editing `datagen/configs/base.gin` or otherwise overriding `sample_scene_spec.config_distribution`. -### Other `manage_datagen_jobs.py` commandline options +### Other `manage_jobs.py` commandline options Please run `pythom -m infinigen.datagen.manage_jobs --help` for an up-to-date description of other commandline arguments. We always use `--cleanup big_files --warmup_sec 30000` for large render jobs. Optionally, you can also log render progress to Weights & Biases. @@ -204,7 +204,7 @@ python -m infinigen.datagen.manage_jobs --output_folder outputs/my_videos --num_ --overrides compose_scene.rain_particles_chance=1.0 ``` -:bulb: You can substitute the `rain_particles` in `rain_particles_chance` for any `run_stage` name argument string in `worldgen/generate.py`, such as `trees` or `ground_creatures`. +:bulb: You can substitute the `rain_particles` in `rain_particles_chance` for any `run_stage` name argument string in `examples/generate_nature.py`, such as `trees` or `ground_creatures`. Create images that only have terrain: ``` @@ -212,7 +212,7 @@ python -m infinigen.datagen.manage_jobs --output_folder outputs/my_videos --num_ --pipeline_config slurm monocular cuda_terrain opengl_gt \ --cleanup big_files --warmup_sec 30000 --config no_assets ``` -:bulb: You can substitute "no_assets" for `no_creatures` or `no_particles`, or the name of any file under `worldgen/config`. The command shown uses `worldgen/config/disable_assets/no_assets.gin`. +:bulb: You can substitute "no_assets" for `no_creatures` or `no_particles`, or the name of any file under `examples/configs`. The command shown uses `examples/configs/disable_assets/no_assets.gin`. Create videos at birds-eye-view camera altitudes: @@ -223,7 +223,7 @@ python -m infinigen.datagen.manage_jobs --output_folder outputs/my_videos --num_ --overrides camera.camera_pose_proposal.altitude=["uniform", 20, 30] ``` -:bulb: The command shown is overriding `worldgen/config/base.gin`'s default setting of `camera.camera_pose_proposal.altitude`. You can use a similar syntax to override any number of .gin config entries. Separate multiple entries with spaces. +:bulb: The command shown is overriding `examples/configs/base.gin`'s default setting of `camera.camera_pose_proposal.altitude`. You can use a similar syntax to override any number of .gin config entries. Separate multiple entries with spaces. Create 1 second video clips: ``` @@ -233,4 +233,4 @@ python -m infinigen.datagen.manage_jobs --output_folder outputs/my_videos --num_ --pipeline_overrides iterate_scene_tasks.frame_range=[1,25] ``` -:bulb: This command uses `--pipeline_overrides` rather than `--overrides` since it is providing a gin override to the `manage_datagen_jobs.py` process, not some part of the main `generate.py` driver. +:bulb: This command uses `--pipeline_overrides` rather than `--overrides` since it is providing a gin override to the `manage_jobs.py` process, not some part of the main `examples/generate_nature.py` driver. diff --git a/docs/GeneratingFluidSimulations.md b/docs/GeneratingFluidSimulations.md index 1c62e2f47..883a84ba1 100644 --- a/docs/GeneratingFluidSimulations.md +++ b/docs/GeneratingFluidSimulations.md @@ -4,7 +4,7 @@ This documentation details how to generate fire and water simulations like those ## Setup -To generate fluids, you run install.sh with the optional FLIP-Fluids setup step (`bash install.sh flip_fluids`), or, please run `bash worldgen/tools/install/compile_flip_fluids.sh` to install flip fluids now. +To generate fluids, you run install.sh with the optional FLIP-Fluids setup step (`bash install.sh flip_fluids`), or, please run `bash infinigen/tools/install/compile_flip_fluids.sh` to install flip fluids now. ## Example Commands diff --git a/docs/GeneratingIndividualAssets.md b/docs/GeneratingIndividualAssets.md index bfd43b93f..5d6b0f3b4 100644 --- a/docs/GeneratingIndividualAssets.md +++ b/docs/GeneratingIndividualAssets.md @@ -11,7 +11,6 @@ Limitations (to be addressed soon): Shown are three examples of using our `generate_individual_assets.py` script to create images and .blend files. ```bash -cd worldgen mkdir outputs python tools/generate_individual_assets.py -- -f CoralFactory -n 8 --save_blend python tools/generate_individual_assets.py -- -f seashells -n 1 --save_blend @@ -30,9 +29,9 @@ Please run `python tools/generate_individual_assets.py -- --help` for a full lis The most commonly used arguments are: - `-f` to specify the name(s) of assets or materials to generate. `-f NAME` can specify to generate three different types of objects: - - If `NAME` is the name of a class defined in `worldgen/assets`, then it will be treated as an AssetFactory and used to generate objects from scratch. For example, you can say `-f CactusFactory` or `-f CarnivoreFactory`, or use the name of any similar Factory class in the codebase. - - If `NAME` is the name of a file in `worldgen/surfaces/templates`, that material will be applied onto a sphere - - If `NAME` is the name of a file in `worldgen/surfaces/scatters`, that scatter generator will be applied nto a plane + - If `NAME` is the name of a class defined in `infinigen/assets`, then it will be treated as an AssetFactory and used to generate objects from scratch. For example, you can say `-f CactusFactory` or `-f CarnivoreFactory`, or use the name of any similar Factory class in the codebase. + - If `NAME` is the name of a file in `infinigen/assets/materials`, that material will be applied onto a sphere + - If `NAME` is the name of a file in `infinigen/assets/scatters`, that scatter generator will be applied nto a plane - `-n` adjusts the number of images / blend files to be generated. diff --git a/docs/GroundTruthAnnotations.md b/docs/GroundTruthAnnotations.md index 2837c4ad4..4131d45be 100644 --- a/docs/GroundTruthAnnotations.md +++ b/docs/GroundTruthAnnotations.md @@ -16,7 +16,7 @@ Infinigen can produce some dense annotations using Blender's built-in render passes. Users may prefer to use these annotations over our extended annotation system's since it requires only the bare-minimum installation. It is also able to run without a GPU. -These annotations are produced when using the `--pipeline_configs blender_gt` ground truth extraction config in [manage_datagen_jobs.py](/README.md#generate-images-in-one-command), or can be done manually as shown in the final step of the [Hello-World](/README.md#generate-a-scene-step-by-step) example. +These annotations are produced when using the `--pipeline_configs blender_gt` ground truth extraction config in [manage_jobs.py](/README.md#generate-images-in-one-command), or can be done manually as shown in the final step of the [Hello-World](/README.md#generate-a-scene-step-by-step) example. ## Advanced Annotation Pipeline :large_blue_diamond: @@ -61,7 +61,7 @@ bash install.sh opengl ``` Or, if you have already run `install.sh` earlier, you can just run ``` -bash worldgen/tools/install/compile_opengl.sh +bash infinigen/tools/install/compile_opengl.sh ``` ### Extended Hello-World @@ -70,11 +70,11 @@ Continuing the [Hello-World](/README.md#generate-a-scene-step-by-step) example, 4. Export the geometry from blender to disk ``` -$python generate.py -- --seed 0 --task mesh_save -g desert simple --input_folder outputs/helloworld/fine --output_folder outputs/helloworld/saved_mesh +python examples/generate_nature.py -- --seed 0 --task mesh_save -g desert simple --input_folder outputs/helloworld/fine --output_folder outputs/helloworld/saved_mesh ``` 5. Generate dense annotations ``` -../process_mesh/build/process_mesh --frame 1 -in outputs/helloworld/saved_mesh -out outputs/helloworld/frames +infinigen/datagen/customgt/build/customgt --frame 1 -in outputs/helloworld/saved_mesh -out outputs/helloworld/frames ``` 6. Summarize the file structure into a single JSON ``` diff --git a/docs/HelloWorld.md b/docs/HelloWorld.md index 354aff9b8..978f0410f 100644 --- a/docs/HelloWorld.md +++ b/docs/HelloWorld.md @@ -17,27 +17,26 @@ Infinigen generates scenes by running multiple tasks (usually executed automatic :exclamation: If you encounter any missing .so files, missing dependencies (such as `gin`), or similar crashes, please check again that all steps of installation ran successfully. If you cannot resolve any issues with installation, please see our README and 'Bug Report' Git Issue template for advice on posting Git Issues to get help quickly - you must include the full installation logs in your issue so that we can help debug. ``` -cd worldgen mkdir outputs # Generate a scene layout -python generate.py -- --seed 0 --task coarse -g desert.gin simple.gin --output_folder outputs/helloworld/coarse +python examples/generate_nature.py -- --seed 0 --task coarse -g desert.gin simple.gin --output_folder outputs/helloworld/coarse # Populate unique assets -python generate.py -- --seed 0 --task populate fine_terrain -g desert.gin simple.gin --input_folder outputs/helloworld/coarse --output_folder outputs/helloworld/fine +python examples/generate_nature.py -- --seed 0 --task populate fine_terrain -g desert.gin simple.gin --input_folder outputs/helloworld/coarse --output_folder outputs/helloworld/fine # Render RGB images -python generate.py -- --seed 0 --task render -g desert.gin simple.gin --input_folder outputs/helloworld/fine --output_folder outputs/helloworld/frames +python examples/generate_nature.py -- --seed 0 --task render -g desert.gin simple.gin --input_folder outputs/helloworld/fine --output_folder outputs/helloworld/frames # Render again for accurate ground-truth -python generate.py -- --seed 0 --task render -g desert.gin simple.gin --input_folder outputs/helloworld/fine --output_folder outputs/helloworld/frames -p render.render_image_func=@flat/render_image +python examples/generate_nature.py -- --seed 0 --task render -g desert.gin simple.gin --input_folder outputs/helloworld/fine --output_folder outputs/helloworld/frames -p render.render_image_func=@flat/render_image ``` Output logs should indicate what the code is working on. Use `--debug` for even more detail. After each command completes you can inspect it's `--output_folder` for results, including running `$BLENDER outputs/helloworld/coarse/scene.blend` or similar to view blender files. We hide many meshes by default for viewport stability; to view them, click "Render" or use the UI to unhide them. ## Generate image(s) in one command -We provide `tools/manage_datagen_jobs.py`, a utility which runs similar steps automatically. +We provide `tools/manage_jobs.py`, a utility which runs similar steps automatically. ``` python -m infinigen.datagen.manage_jobs --output_folder outputs/hello_world --num_scenes 1 --specific_seed 0 \ diff --git a/docs/ImplementingAssets.md b/docs/ImplementingAssets.md index b2d9a4710..348e11bb8 100644 --- a/docs/ImplementingAssets.md +++ b/docs/ImplementingAssets.md @@ -10,7 +10,7 @@ The workflow described in this guide requires some knowledge of python *and* the - You may have success trying out this guide anyway. If you can navigate the Blender UI (either by trial and error, or via the many great [online resources](https://www.youtube.com/watch?v=nIoXOplUvAw&t=34s)), this tutorial will help you use Blender as a powerful visual debugging tool to repeatedly test code you write in your usual IDE. - Ultimately you can work on Infinigen by only manipulating code/text files. The best approach to get started on this at present is to read the many existing python files in the repo. We will work on better documentation and APIs for python developers. -This guide does not cover how to add new elements to the terrain marching cubes mesh. This guide also does not cover adding different lighting, although you can use a similar nodegraph workflow as explained below to customize the existing lighting assets in the repo, such as the [sky light](../worldgen/lighting/lighting.py) or [caustics lamps](../worldgen/assets/caustics_lamp.py). +This guide does not cover how to add new elements to the terrain marching cubes mesh. This guide also does not cover adding different lighting, although you can use a similar node-based workflow to modify [the already existing lighting assets](infinigen/assets/lighting) in the repo. ## Setting up the Blender UI for interactive development @@ -18,7 +18,6 @@ Unless you intend to work solely on python/other code (and don't intend to inter To open the Blender UI, run the following in a terminal: ```bash -cd infinigen/worldgen $BLENDER dev_scene.blend ``` :warning: You must use $BLENDER, which refers to the blender installation located in infinigen/blender, as it has additional dependencies installed. Using another blender installation is fine to open or inspect files, but it will not be able to run any of Infinigen's code or tools. @@ -40,7 +39,7 @@ You do not have to use this UI configuration all the time, but the following ste ## Importing Infinigen's dependencies into the Blender UI -Finally, to import Infinigen into your Blender UI, click the 'Open' button on your `Text Editor` panel, then navigate to and open `worldgen/tools/blendscript_import_infinigen.py`. Click the play button to execute the script. +Finally, to import Infinigen into your Blender UI, click the 'Open' button on your `Text Editor` panel, then navigate to and open `infinigen/tools/blendscript_import_infinigen.py`. Click the play button to execute the script. :warning: You will need to re-run this script every time you restart Blender. @@ -49,12 +48,18 @@ Finally, to import Infinigen into your Blender UI, click the 'Open' button on yo Now that you have imported Infinigen into Blender, you can easily access all its assets and materials via the commandline. To start, we recommend using Infinigen's sky lighting while you make your asset, so you can get a better sense of what the asset will look like in full scenes. To sample a random sky lighting, run the following two steps in your Blender console: +<<<<<<< HEAD ```python from lighting import lighting lighting.add_lighting() +======= +``` +from infingen.assets.lighting import sky_lighting +sky_lighting.add_lighting() +>>>>>>> 5e32cd3eb (Fix all imports and paths) ``` -You can use this mechanism to access any asset or python file under the `worldgen/` folder. For example run `from surfaces.scatters import grass` then `grass.apply(bpy.context.active_object)` in the Python Console window to apply our grassland scatter generator directly onto whichever object is selected & highlighted orange in your UI. The first statement imports the python script shown in `worldgen/surfaces/scatters/grass.py`, and you can use a similar statement to test out any python file under the worldgen/ folder, by replacing `surfaces.scatters` and `grass` with the relevant subfolder names and python filename. +You can use this mechanism to access any asset or python file under the `infinigen/` folder. For example run `from infinigen.assets.scatters import grass` then `grass.apply(bpy.context.active_object)` in the Python Console window to apply our grassland scatter generator directly onto whichever object is selected & highlighted orange in your UI. The first statement imports the python script shown in `infinigen/assets/scatters/grass.py`. You can use a similar statement to test out any python file under the infinigen/ folder, by replacing `surfaces.scatters` and `grass` with the relevant subfolder names and python filename. ![White cube with procedural grass covering it](images/implementing_assets/setting_up_blender_ui_grassdemo.png) @@ -64,7 +69,7 @@ The Geometry Node and Shader Node windows in this screenshot show nodegraphs gen ## Implementing a new material or surface scatter -To add a material to Infinigen, we must create a python file similar to those in `worldgen/surfaces/templates`. You are free to write such a file by hand in python using our `NodeWrangler` utility, but we recommend instead implementing your material in Blender then using our Node Transpiler to convert it to python code. +To add a material to Infinigen, we must create a python file similar to those in `infinigen/assets/materials`. You are free to write such a file by hand in python using our `NodeWrangler` utility, but we recommend instead implementing your material in Blender then using our Node Transpiler to convert it to python code. To start, use the Blender UI to implement a material of your choice. Below, we show a simple snowy material comprised of a geometry nodegroup and a shader nodegroup applied to a highly subdivided cube. Please see the many excellent blender resources acknowledged in our README for help learning to use Blender's geometry and shader nodes. @@ -79,10 +84,10 @@ import bpy import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def shader_material(nw: NodeWrangler): # Code generated using version 2.6.4 of the node_transpiler @@ -126,18 +131,18 @@ The last line of this script calls `apply` on the currently selected object in t ![Example setup before transpiling](images/implementing_assets/transpiler_demo.png) -You can then click play on the `generated_surface_script` to run it, and it should reconstruct similar nodegraphs on this new object. To include your new material in the infinigen repository, edit the `transpiler_dev_script` to say `mode=write_file`, then run it again on your original nodegraph to dump a file into the `worldgen/` folder which you can then move to `surfaces/templates/mymaterial.py`. You can now import and test your material script via the commandline [as described earlier](#generating_assets_materials_via_blender_python_commandline) +You can then click play on the `generated_surface_script` to run it, and it should reconstruct similar nodegraphs on this new object. To include your new material in the infinigen repository, edit the `transpiler_dev_script` to say `mode=write_file`, then run it again. This will dump a new file named `generated_surface_script.py` which you can then move to `infinigen/assets/materials/mymaterial.py`. You can now import and test your material script via the commandline [as described earlier](#generating_assets_materials_via_blender_python_commandline) ## Implementing a new 3D asset -All asset generators in Infinigen are defined by python files in `worldgen/assets`, usually following this template: +All asset generators in Infinigen are defined by python files in `infinigen/assets`, usually following this template: ```python import bpy import numpy as np -from placement.factory import AssetFactory -from util.math import FixedSeed +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util.math import FixedSeed class MyAssetFactory(AssetFactory): @@ -153,12 +158,17 @@ class MyAssetFactory(AssetFactory): You can implement the `create_asset` function however you wish so long as it produces a Blender Object as a result. Many existing assets use various different strategies, which you can use as examples: - `assets/flower.py` uses mostly auto-generated code from transpiling a hand-designed geometry node-graph. - `assets/grassland/grass_tuft.py` uses pure NumPy code to create and define a mesh. -- `assets/trees/generate.py` combines transpiled materials & leaves with a python-only space colonization algorithm. +- `assets/trees/examples/generate_nature.py` combines transpiled materials & leaves with a python-only space colonization algorithm. The simplest implementation for a new asset is to create a geometry nodes equivelant, transpile it similarly to as shown above, copy the code into the same file as the template shown above, and implement the `create_asset` function as shown: +<<<<<<< HEAD ```python from util import blender as butil +======= +``` +from infinigen.core.util import blender as butil +>>>>>>> 5e32cd3eb (Fix all imports and paths) ... @@ -174,13 +184,13 @@ class MyAssetFactory(AssetFactory): return obj ``` -If you place the above text in a file located at `worldgen/assets/myasset.py`, you can add the following script to your Blender TextEditor and click play to repeatedly reload and test your asset generator as you continue to refine it. +If you place the above text in a file located at `infinigen/assets/myasset.py`, you can add the following script to your Blender TextEditor and click play to repeatedly reload and test your asset generator as you continue to refine it. ```python import bpy import importlib -from assets import myasset +from infinigen.assets import myasset importlib.reload(myasset) seed = 0 diff --git a/examples/configs/base.gin b/examples/configs/base.gin index 486e39064..f6afc5926 100644 --- a/examples/configs/base.gin +++ b/examples/configs/base.gin @@ -187,19 +187,19 @@ camera.spawn_camera_rigs.camera_rig_config = [ ] # TERRAIN SEED # -surfaces.templates.ice.geo_ice.random_seed = %OVERALL_SEED -surfaces.templates.lava.lava_geo.random_seed = %OVERALL_SEED -surfaces.templates.mud.geo_mud.random_seed = %OVERALL_SEED -surfaces.templates.cobble_stone.geo_cobblestone.random_seed = %OVERALL_SEED -surfaces.templates.dirt.geo_dirt.random_seed = %OVERALL_SEED -surfaces.templates.stone.geo_stone.random_seed = %OVERALL_SEED -surfaces.templates.cracked_ground.geo_cracked_ground.random_seed = %OVERALL_SEED -surfaces.templates.soil.geometry_soil.random_seed = %OVERALL_SEED -surfaces.templates.chunkyrock.geo_rocks.random_seed = %OVERALL_SEED - -surfaces.templates.mountain.shader.random_seed = %OVERALL_SEED -surfaces.templates.sand.shader.random_seed = %OVERALL_SEED -surfaces.templates.water.shader.random_seed = %OVERALL_SEED +assets.materials.ice.geo_ice.random_seed = %OVERALL_SEED +assets.materials.lava.lava_geo.random_seed = %OVERALL_SEED +assets.materials.mud.geo_mud.random_seed = %OVERALL_SEED +assets.materials.cobble_stone.geo_cobblestone.random_seed = %OVERALL_SEED +assets.materials.dirt.geo_dirt.random_seed = %OVERALL_SEED +assets.materials.stone.geo_stone.random_seed = %OVERALL_SEED +assets.materials.cracked_ground.geo_cracked_ground.random_seed = %OVERALL_SEED +assets.materials.soil.geometry_soil.random_seed = %OVERALL_SEED +assets.materials.chunkyrock.geo_rocks.random_seed = %OVERALL_SEED + +assets.materials.mountain.shader.random_seed = %OVERALL_SEED +assets.materials.sand.shader.random_seed = %OVERALL_SEED +assets.materials.water.shader.random_seed = %OVERALL_SEED compose_scene.ground_creatures_chance = 0.0 compose_scene.ground_creature_registry = [ @@ -225,6 +225,6 @@ group_collections.config = [ {'name': 'animhelper', 'hide_viewport': False, 'hide_render': True}, # curves and iks ] -include 'config/base_surface_registry.gin' -include 'config/natural.gin' +include 'examples/configs/base_surface_registry.gin' +include 'examples/configs/natural.gin' diff --git a/examples/configs/natural.gin b/examples/configs/natural.gin index 5e4169198..67ce4ac03 100644 --- a/examples/configs/natural.gin +++ b/examples/configs/natural.gin @@ -1,3 +1,3 @@ -# surfaces.templates.water.shader.color = ("palette", "water") -surfaces.templates.mountain.shader.color = ("palette", "mountain soil") -surfaces.templates.sandstone.shader.color = ("palette", "sandstone") \ No newline at end of file +# assets.materials.water.shader.color = ("palette", "water") +assets.materials.mountain.shader.color = ("palette", "mountain soil") +assets.materials.sandstone.shader.color = ("palette", "sandstone") \ No newline at end of file diff --git a/examples/configs/performance/simple.gin b/examples/configs/performance/simple.gin index 5320ec9bc..724381975 100644 --- a/examples/configs/performance/simple.gin +++ b/examples/configs/performance/simple.gin @@ -1,5 +1,5 @@ -include 'config/performance/dev.gin' -include 'config/disable_assets/no_creatures.gin' -include 'config/performance/fast_terrain_assets.gin' +include 'examples/configs/performance/dev.gin' +include 'examples/configs/disable_assets/no_creatures.gin' +include 'examples/configs/performance/fast_terrain_assets.gin' run_erosion.n_iters = [1,1] full/render_image.num_samples = 64 \ No newline at end of file diff --git a/examples/configs/scene_types/arctic.gin b/examples/configs/scene_types/arctic.gin index 989aa10c4..f042e6a90 100644 --- a/examples/configs/scene_types/arctic.gin +++ b/examples/configs/scene_types/arctic.gin @@ -29,7 +29,7 @@ scene.warped_rocks_chance = 0 scene.ground_ice_chance = 1 scene.waterbody_chance = 1 -include 'config/disable_assets/no_assets.gin' +include 'examples/configs/disable_assets/no_assets.gin' compose_scene.wind_chance = 0.5 compose_scene.turbulence_chance = 0.5 diff --git a/examples/configs/scene_types/coral_reef.gin b/examples/configs/scene_types/coral_reef.gin index 5ae259bb2..6fdb25b74 100644 --- a/examples/configs/scene_types/coral_reef.gin +++ b/examples/configs/scene_types/coral_reef.gin @@ -1,4 +1,4 @@ -include 'config/scene_types/under_water.gin' +include 'examples/configs/scene_types/under_water.gin' compose_scene.kelp_chance = 0.1 compose_scene.urchin_chance = 0.1 diff --git a/examples/configs/scene_types/kelp_forest.gin b/examples/configs/scene_types/kelp_forest.gin index ee4710de4..b20df1df5 100644 --- a/examples/configs/scene_types/kelp_forest.gin +++ b/examples/configs/scene_types/kelp_forest.gin @@ -1,4 +1,4 @@ -include 'config/scene_types/under_water.gin' +include 'examples/configs/scene_types/under_water.gin' multi_mountains_params.height = ("uniform", 1, 4) multi_mountains_params.min_freq = ("uniform", 0.01, 0.015) diff --git a/examples/configs/scene_types/snowy_mountain.gin b/examples/configs/scene_types/snowy_mountain.gin index a8b6b74a7..5b40e8066 100644 --- a/examples/configs/scene_types/snowy_mountain.gin +++ b/examples/configs/scene_types/snowy_mountain.gin @@ -1,4 +1,4 @@ -include 'config/disable_assets/no_assets.gin' +include 'examples/configs/disable_assets/no_assets.gin' surface.registry.rock_collection = [ ('mountain', 1), @@ -26,8 +26,8 @@ compose_scene.flying_creature_registry = [ (@FlyingBirdFactory, 1), ] -surfaces.templates.mountain.shader.layered_mountain = 0 -surfaces.templates.mountain.shader.snowy = 0 # TODO: re-enable once terrain flickering resolved +assets.materials.mountain.shader.layered_mountain = 0 +assets.materials.mountain.shader.snowy = 0 # TODO: re-enable once terrain flickering resolved compose_scene.boulders_chance = 1 camera.camera_pose_proposal.pitch = ("clip_gaussian", 90, 30, 90, 100) diff --git a/examples/configs/scene_types_fluidsim/simulated_river.gin b/examples/configs/scene_types_fluidsim/simulated_river.gin index 6c81ae815..13bdf5145 100644 --- a/examples/configs/scene_types_fluidsim/simulated_river.gin +++ b/examples/configs/scene_types_fluidsim/simulated_river.gin @@ -1,4 +1,4 @@ -include 'config/scene_types/river.gin' +include 'examples/configs/scene_types/river.gin' UniformMesher.enclosed=1 animate_cameras.policy_registry = @cam/AnimPolicyRandomForwardWalk diff --git a/examples/configs/scene_types_fluidsim/tilted_river.gin b/examples/configs/scene_types_fluidsim/tilted_river.gin index 44e5f224c..560ae7569 100644 --- a/examples/configs/scene_types_fluidsim/tilted_river.gin +++ b/examples/configs/scene_types_fluidsim/tilted_river.gin @@ -1,4 +1,4 @@ -include 'config/scene_types/river.gin' +include 'examples/configs/scene_types/river.gin' UniformMesher.enclosed=1 animate_cameras.policy_registry = @cam/AnimPolicyRandomForwardWalk diff --git a/examples/generate_asset_demo.py b/examples/generate_asset_demo.py index 2dc3f6185..9b61a7deb 100644 --- a/examples/generate_asset_demo.py +++ b/examples/generate_asset_demo.py @@ -16,22 +16,22 @@ import numpy as np from tqdm import tqdm, trange -sys.path.append(os.getcwd()) -from terrain import Terrain - -from assets.small_plants.fern import FernFactory -from assets.creatures.animation.run_cycle import follow_path -from lighting import lighting, kole_clouds -from surfaces.scatters import grass, rocks, pine_needle, pinecone -from surfaces.templates import mountain, sand, water, atmosphere_light_haze, sandstone, cracked_ground, \ - soil, dirt, cobble_stone, chunkyrock, stone, lava, ice, mud, snow, clouds - -from placement import placement, density, camera as cam_util -from placement.split_in_view import split_inview -from util import blender as butil - -import core as infinigen +from infinigen.terrain import Terrain +from infinigen.assets.small_plants.fern import FernFactory +from infinigen.assets.creatures.util.animation.run_cycle import follow_path +from infinigen.assets.lighting import sky_lighting +from infinigen.assets.weather import kole_clouds +from infinigen.assets.scatters import grass, pebbles, pine_needle, pinecone +from infinigen.assets.materials import ( + mountain, sand, water, atmosphere_light_haze, sandstone, cracked_ground, \ + soil, dirt, cobble_stone, chunkyrock, stone, lava, ice, mud, snow +) +from infinigen.core.placement import placement, density, camera as cam_util +from infinigen.core.placement.split_in_view import split_inview +from infinigen.core.util import blender as butil + +from infinigen.core import execute_tasks def find_flat_location( mesh, @@ -101,7 +101,7 @@ def compose_scene( **params ): - lighting.add_lighting() + sky_lighting.add_lighting() if params.get("fancy_clouds", 0): kole_clouds.add_kole_clouds() @@ -159,11 +159,11 @@ def compose_scene( pass elif background == 'grass': grass.apply(terrain_inview) - rocks.apply(terrain_inview) + pebbles.apply(terrain_inview) elif background == 'pine_forest': pine_needle.apply(terrain_inview) pinecone.apply(terrain_inview) - rocks.apply(terrain_inview) + pebbles.apply(terrain_inview) elif background == 'TODO ADD MORE OPTIONS HERE': pass else: @@ -196,10 +196,15 @@ def main(): datefmt='%H:%M:%S' ) - scene_seed = infinigen.apply_scene_seed(args) - infinigen.apply_gin_configs(args, scene_seed, skip_unknown=True) + scene_seed = execute_tasks.apply_scene_seed(args) + execute_tasks.apply_gin_configs( + args, + Path(__file__).parent/'configs', + mandatory_config_dir=Path(__file__).parent/'configs/scene_types', + skip_unknown=True + ) - infinigen.main( + execute_tasks.main( compose_scene_func=compose_scene, input_folder=args.input_folder, output_folder=args.output_folder, diff --git a/examples/generate_individual_assets.py b/examples/generate_individual_assets.py index 56e823d47..8e1f7040a 100644 --- a/examples/generate_individual_assets.py +++ b/examples/generate_individual_assets.py @@ -21,29 +21,24 @@ import bpy import gin import numpy as np - -sys.path.insert(0, os.getcwd()) from PIL import Image -from lighting import lighting -from surfaces import surface -from placement import density -from util import blender as butil -from fluid.fluid import set_obj_on_fire -from placement.factory import AssetFactory - -from rendering.render import enable_gpu -from assets.utils.decorate import assign_material, read_base_co -import tools.results.strip_alpha_background as strip_alpha_background -from util.math import FixedSeed -from util import blender as butil -from util.camera import get_3x4_P_matrix_from_blender -from util.logging import Suppress +from infinigen.assets.fluid.fluid import set_obj_on_fire +from infinigen.assets.utils.decorate import assign_material, read_base_co +from infinigen.assets.utils.tag import tag_object, tag_nodegroup, tag_system +from infinigen.assets.lighting import sky_lighting -from assets.utils.tag import tag_object, tag_nodegroup, tag_system +from infinigen.core import surface +from infinigen.core.placement import density, factory +from infinigen.core.rendering.render import enable_gpu +from infinigen.core.util.math import FixedSeed +from infinigen.core.util.camera import get_3x4_P_matrix_from_blender +from infinigen.core.util.logging import Suppress +from infinigen.core.util import blender as butil -import generate # to load most/all AssetFactory subclasses +from datagen.tools.results import strip_alpha_background as strip_alpha_background +import generate_nature # to load most/all factory.AssetFactory subclasses def build_scene_asset(factory_name, idx): factory = None @@ -114,7 +109,7 @@ def build_scene_surface(factory_name, idx): except ModuleNotFoundError: try: with gin.unlock_config(): - template = importlib.import_module(f'surfaces.templates.{factory_name}') + template = importlib.import_module(f'assets.materials.{factory_name}') bpy.ops.mesh.primitive_ico_sphere_add(radius=.8, subdivisions=9) asset = bpy.context.active_object template.apply(asset) @@ -140,7 +135,7 @@ def build_scene(path, idx, factory_name, args): camera, center = setup_camera(args) with FixedSeed(args.lighting): - lighting.add_lighting(camera) + sky_lighting.add_lighting(camera) nodes = bpy.data.worlds['World'].node_tree.nodes sky_texture = [n for n in nodes if n.name.startswith('Sky Texture')][-1] sky_texture.sun_elevation = np.deg2rad(args.elevation) @@ -286,13 +281,13 @@ def main(args): factories = list(args.factories) if 'ALL_ASSETS' in factories: - factories += [f.__name__ for f in AssetFactory.__subclasses__()] + factories += [f.__name__ for f in factory.AssetFactory.__subclasses__()] factories.remove('ALL_ASSETS') if 'ALL_SCATTERS' in factories: factories += [f.stem for f in Path('surfaces/scatters').iterdir()] factories.remove('ALL_SCATTERS') if 'ALL_MATERIALS' in factories: - factories += [f.stem for f in Path('surfaces/templates').iterdir()] + factories += [f.stem for f in Path('infinigen/assets/materials').iterdir()] factories.remove('ALL_MATERIALS') for factory in factories: diff --git a/examples/generate_nature.py b/examples/generate_nature.py index 9295c3da1..68fbb4d5c 100644 --- a/examples/generate_nature.py +++ b/examples/generate_nature.py @@ -15,68 +15,54 @@ import numpy as np from numpy.random import uniform, normal, randint -sys.path.append(os.getcwd()) - -from terrain import Terrain -from util.organization import Task, Attributes, Tags, ElementNames - -from lighting import lighting, kole_clouds +from infinigen.core.placement import ( + particles, placement, density, + camera as cam_util, + split_in_view, factory, + animation_policy, instance_scatter, detail, +) -from assets.trees.generate import TreeFactory, BushFactory, random_season, random_leaf_collection -from assets.glowing_rocks import GlowingRocksFactory -from assets.creatures import ( +from infinigen.assets.creatures import ( CarnivoreFactory, HerbivoreFactory, FishFactory, FishSchoolFactory, \ BeetleFactory, AntSwarmFactory, BirdFactory, SnakeFactory, \ - CrustaceanFactory, FlyingBirdFactory, CrabFactory, LobsterFactory, SpinyLobsterFactory + CrustaceanFactory, FlyingBirdFactory, CrabFactory, LobsterFactory, SpinyLobsterFactory, \ + DragonflyFactory ) -from assets.insects.assembled.dragonfly import DragonflyFactory -from assets.cloud.generate import CloudFactory -from assets.cactus import CactusFactory - -from fluid.flip_fluid import make_river, make_tilted_river -from fluid.fluid_scenecomp_additions import fire_scenecomp_options -import surfaces.scatters -from surfaces.scatters import ( - rocks, grass, snow_layer, ground_leaves, ground_twigs, \ +from infinigen.assets.scatters import ( + pebbles, grass, snow_layer, ground_leaves, ground_twigs, \ chopped_trees, pinecone, fern, flowerplant, monocot, ground_mushroom, \ - slime_mold, moss, ivy, lichen, mushroom, decorative_plants, seashells + slime_mold, moss, ivy, lichen, mushroom, decorative_plants, seashells, \ + pine_needle, seaweed, coral_reef, jellyfish, urchin ) -from surfaces.scatters.utils.selection import scatter_lower, scatter_upward -from surfaces.templates import ( + +from infinigen.assets.materials import ( mountain, sand, water, atmosphere_light_haze, sandstone, cracked_ground, \ - soil, dirt, cobble_stone, chunkyrock, stone, lava, ice, mud + soil, dirt, cobble_stone, chunkyrock, stone, lava, ice, mud, snow ) -from infinigen_gpl.surfaces import snow -from placement import ( - particles, placement, density, - camera as cam_util, - animation_policy, instance_scatter, detail +from infinigen.assets import ( + fluid, cactus, cactus, trees, monocot, rocks, underwater ) -from placement.split_in_view import split_inview -from assets import particles as particle_assets - -from surfaces.scatters import pine_needle, seaweed, coral_reef, jellyfish, urchin -from assets import boulder, cactus, caustics_lamp -from assets.monocot import kelp -from surfaces import surface - -import surfaces.scatters - -from placement.factory import make_asset_collection -from util import blender as butil -from util.logging import Timer -from util.math import FixedSeed, int_hash -from util.pipeline import RandomStageExecutor -from util.random import sample_registry, random_general +from infinigen.terrain import Terrain +from infinigen.assets.lighting import sky_lighting, glowing_rocks, caustics_lamp +from infinigen.assets.weather import kole_clouds, particles, cloud + +from infinigen.core.util import ( + blender as butil, + logging as logging_util, + pipeline, +) +from infinigen.core.util.organization import Tags +from infinigen.core.util.random import sample_registry, random_general +from infinigen.core.util.math import FixedSeed, int_hash -import core as infinigen +from infinigen.core import execute_tasks, surface @gin.configurable def compose_scene(output_folder, scene_seed, **params): - p = RandomStageExecutor(scene_seed, output_folder, params) + p = pipeline.RandomStageExecutor(scene_seed, output_folder, params) def add_coarse_terrain(): terrain = Terrain(scene_seed, surface.registry, task='coarse', on_the_fly_asset_folder=output_folder/"assets") @@ -97,7 +83,7 @@ def add_coarse_terrain(): p.run_stage('fancy_clouds', kole_clouds.add_kole_clouds) - season = p.run_stage('season', random_season, use_chance=False) + season = p.run_stage('season', trees.random_season, use_chance=False) logging.info(f'{season=}') def choose_forest_params(): @@ -113,7 +99,7 @@ def choose_forest_params(): def add_trees(terrain_mesh): for i, params in enumerate(tree_species_params): - fac = TreeFactory(np.random.randint(1e7), coarse=True) + fac = trees.TreeFactory(np.random.randint(1e7), coarse=True) selection = density.placement_mask(params['select_scale'], tag=land_domain) placement.scatter_placeholders_mesh(terrain_mesh, fac, selection=selection, altitude=-0.1, overall_density=params['density'], distance_min=params['distance_min']) @@ -123,7 +109,7 @@ def add_bushes(terrain_mesh): n_bush_species = randint(1, params.get("max_bush_species", 2) + 1) for i in range(n_bush_species): spec_density = params.get("bush_density", uniform(0.03, 0.12)) / n_bush_species - fac = BushFactory(int_hash((scene_seed, i)), coarse=True) + fac = trees.BushFactory(int_hash((scene_seed, i)), coarse=True) selection = density.placement_mask(uniform(0.015, 0.2), normal_thresh=0.3, select_thresh=uniform(0.5, 0.6), tag=land_domain) placement.scatter_placeholders_mesh(terrain_mesh, fac, altitude=-0.05, @@ -132,7 +118,7 @@ def add_bushes(terrain_mesh): p.run_stage('bushes', add_bushes, terrain_mesh) def add_clouds(terrain_mesh): - cloud_factory = CloudFactory(int_hash((scene_seed, 0)), coarse=True, terrain_mesh=terrain_mesh) + cloud_factory = cloud.CloudFactory(int_hash((scene_seed, 0)), coarse=True, terrain_mesh=terrain_mesh) placement.scatter_placeholders(cloud_factory.spawn_locations(), cloud_factory) p.run_stage('clouds', add_clouds, terrain_mesh) @@ -140,23 +126,23 @@ def add_boulders(terrain_mesh): n_boulder_species = randint(1, params.get("max_boulder_species", 5)) for i in range(n_boulder_species): selection = density.placement_mask(0.05, tag=nonliving_domain, select_thresh=uniform(0.55, 0.6)) - fac = boulder.BoulderFactory(int_hash((scene_seed, i)), coarse=True) + fac = rocks.BoulderFactory(int_hash((scene_seed, i)), coarse=True) placement.scatter_placeholders_mesh(terrain_mesh, fac, overall_density=params.get("boulder_density", uniform(.02, .05)) / n_boulder_species, selection=selection, altitude=-0.25) p.run_stage('boulders', add_boulders, terrain_mesh) - fire_scenecomp_options(p, terrain_mesh, params, tree_species_params) + fluid.cached_fire_scenecomp_options(p, terrain_mesh, params, tree_species_params) def add_glowing_rocks(terrain_mesh): selection = density.placement_mask(uniform(0.03, 0.3), normal_thresh=-1.1, select_thresh=0, tag=Tags.Cave) - fac = GlowingRocksFactory(int_hash((scene_seed, 0)), coarse=True) + fac = glowing_rocks.GlowingRocksFactory(int_hash((scene_seed, 0)), coarse=True) placement.scatter_placeholders_mesh(terrain_mesh, fac, overall_density=params.get("glow_rock_density", 0.025), selection=selection) p.run_stage('glowing_rocks', add_glowing_rocks, terrain_mesh) def add_kelp(terrain_mesh): - fac = kelp.KelpMonocotFactory(int_hash((scene_seed, 0)), coarse=True) + fac = monocot.KelpMonocotFactory(int_hash((scene_seed, 0)), coarse=True) selection = density.placement_mask(scale=0.05, tag=underwater_domain) placement.scatter_placeholders_mesh(terrain_mesh, fac, altitude=-0.05, overall_density=params.get('kelp_density', uniform(.2, 1)), @@ -187,11 +173,11 @@ def camera_preprocess(): ) cam = cam_util.get_camera(0, 0) - p.run_stage('lighting', lighting.add_lighting, cam, use_chance=False) + p.run_stage('lighting', sky_lighting.add_lighting, cam, use_chance=False) # determine a small area of the terrain for the creatures to run around on # must happen before camera is animated, as camera may want to follow them around - terrain_center, *_ = split_inview(terrain_mesh, cam=cam, + terrain_center, *_ = split_in_view.split_inview(terrain_mesh, cam=cam, start=0, end=0, outofview=False, vis_margin=5, dist_max=params["center_distance"], hide_render=True, suffix='center') deps = bpy.context.evaluated_depsgraph_get() @@ -219,11 +205,15 @@ def flying_creatures(): p.run_stage('animate_cameras', lambda: cam_util.animate_cameras( camera_rigs, scene_preprocessed, pois=pois), use_chance=False) - with Timer('Compute coarse terrain frustrums'): - terrain_inview, *_ = split_inview(terrain_mesh, verbose=True, outofview=False, print_areas=True, - cam=cam, vis_margin=2, dist_max=params['inview_distance'], hide_render=True, suffix='inview') - terrain_near, *_ = split_inview(terrain_mesh, verbose=True, outofview=False, print_areas=True, - cam=cam, vis_margin=2, dist_max=params['near_distance'], hide_render=True, suffix='near') + with logging_util.Timer('Compute coarse terrain frustrums'): + terrain_inview, *_ = split_in_view.split_inview( + terrain_mesh, verbose=True, outofview=False, print_areas=True, + cam=cam, vis_margin=2, dist_max=params['inview_distance'], hide_render=True, suffix='inview' + ) + terrain_near, *_ = split_in_view.split_inview( + terrain_mesh, verbose=True, outofview=False, print_areas=True, + cam=cam, vis_margin=2, dist_max=params['near_distance'], hide_render=True, suffix='near' + ) collider = butil.modify_mesh(butil.deep_clone_obj(terrain_near), 'COLLISION', apply=False, show_viewport=True) collider.name = collider.name + '.collider' @@ -260,25 +250,25 @@ def add_bug_swarm(): def add_rocks(target): selection = density.placement_mask(scale=0.15, select_thresh=0.5, normal_thresh=0.7, return_scalar=True, tag=nonliving_domain) - _, rock_col = surfaces.scatters.rocks.apply(target, selection=selection) + _, rock_col = pebbles.apply(target, selection=selection) return rock_col p.run_stage('rocks', add_rocks, terrain_inview) def add_ground_leaves(target): selection = density.placement_mask(scale=0.1, select_thresh=0.52, normal_thresh=0.7, return_scalar=True, tag=land_domain) - surfaces.scatters.ground_leaves.apply(target, selection=selection, season=season) + ground_leaves.apply(target, selection=selection, season=season) p.run_stage('ground_leaves', add_ground_leaves, terrain_near, prereq='trees') def add_ground_twigs(target): use_leaves = uniform() < 0.5 selection = density.placement_mask(scale=0.15, select_thresh=0.55, normal_thresh=0.7, return_scalar=True, tag=nonliving_domain) - surfaces.scatters.ground_twigs.apply(target, selection=selection, use_leaves=use_leaves) + ground_twigs.apply(target, selection=selection, use_leaves=use_leaves) p.run_stage('ground_twigs', add_ground_twigs, terrain_near) def add_chopped_trees(target): selection = density.placement_mask(scale=0.15, select_thresh=uniform(0.55, 0.6), normal_thresh=0.7, return_scalar=True, tag=nonliving_domain) - surfaces.scatters.chopped_trees.apply(target, selection=selection) + chopped_trees.apply(target, selection=selection) p.run_stage('chopped_trees', add_chopped_trees, terrain_inview) def add_grass(target): @@ -286,29 +276,29 @@ def add_grass(target): selection = density.placement_mask( normal_dir=(0, 0, 1), scale=0.1, tag=land_domain, return_scalar=True, select_thresh=uniform(select_max/2, select_max)) - surfaces.scatters.grass.apply(target, selection=selection) + grass.apply(target, selection=selection) p.run_stage('grass', add_grass, terrain_inview) def add_monocots(target): selection = density.placement_mask( normal_dir=(0, 0, 1), scale=0.2, tag=land_domain) - surfaces.scatters.monocot.apply(terrain_inview, grass=True, selection=selection) + monocot.apply(terrain_inview, grass=True, selection=selection) selection = density.placement_mask( normal_dir=(0, 0, 1), scale=0.2, select_thresh=0.55, tag=params.get("grass_habitats", None)) - surfaces.scatters.monocot.apply(target, grass=False, selection=selection) + monocot.apply(target, grass=False, selection=selection) p.run_stage('monocots', add_monocots, terrain_inview) def add_ferns(target): selection = density.placement_mask(normal_dir=(0, 0, 1), scale=0.1, select_thresh=0.6, return_scalar=True, tag=land_domain) - surfaces.scatters.fern.apply(target, selection=selection) + fern.apply(target, selection=selection) p.run_stage('ferns', add_ferns, terrain_inview) def add_flowers(target): selection = density.placement_mask(normal_dir=(0, 0, 1), scale=0.01, select_thresh=0.6, return_scalar=True, tag=land_domain) - surfaces.scatters.flowerplant.apply(target, selection=selection) + flowerplant.apply(target, selection=selection) p.run_stage('flowers', add_flowers, terrain_inview) def add_corals(target): @@ -320,7 +310,7 @@ def add_corals(target): density=params.get('horizontal_coral_density', 2.5)) p.run_stage('corals', add_corals, terrain_inview) - p.run_stage('mushroom', lambda: surfaces.scatters.ground_mushroom.Mushrooms().apply(terrain_near, + p.run_stage('mushroom', lambda: ground_mushroom.Mushrooms().apply(terrain_near, selection=density.placement_mask(scale=.1, select_thresh=.65, return_scalar=True, tag=land_domain), density=params.get('mushroom_density', 2))) @@ -331,43 +321,43 @@ def add_corals(target): p.run_stage('jellyfish', lambda: jellyfish.apply(terrain_inview, selection=density.placement_mask(scale=0.05, select_thresh=.5, tag=underwater_domain))) - p.run_stage('seashells', lambda: surfaces.scatters.seashells.apply(terrain_near, + p.run_stage('seashells', lambda: seashells.apply(terrain_near, selection=density.placement_mask(scale=0.05, select_thresh=.5, tag='landscape,', return_scalar=True))) - p.run_stage('pinecone', lambda: surfaces.scatters.pinecone.apply(terrain_near, + p.run_stage('pinecone', lambda: pinecone.apply(terrain_near, selection=density.placement_mask(scale=.1, select_thresh=.63, tag=land_domain))) p.run_stage('pine_needle', lambda: pine_needle.apply(terrain_near, selection=density.placement_mask(scale=uniform(0.05, 0.2), select_thresh=uniform(0.4, 0.55), tag=land_domain, return_scalar=True))) - p.run_stage('decorative_plants', lambda: surfaces.scatters.decorative_plants.apply(terrain_near, + p.run_stage('decorative_plants', lambda: decorative_plants.apply(terrain_near, selection=density.placement_mask(scale=uniform(0.05, 0.2), select_thresh=uniform(0.5, 0.65), tag=land_domain, return_scalar=True))) - p.run_stage('wind', particle_assets.wind_effector) - p.run_stage('turbulence', particle_assets.turbulence_effector) + p.run_stage('wind', particles.wind_effector) + p.run_stage('turbulence', particles.turbulence_effector) emitter_off = Vector((0, 0, 5)) # to allow space to fall into frame from off screen def add_leaf_particles(): return particles.particle_system( emitter=butil.spawn_plane(location=emitter_off, size=60), - subject=random_leaf_collection(n=5, season=season), + subject=trees.random_leaf_collection(n=5, season=season), settings=particles.falling_leaf_settings()) def add_rain_particles(): return particles.particle_system( emitter=butil.spawn_plane(location=emitter_off, size=30), - subject=make_asset_collection(particle_assets.RaindropFactory(scene_seed), 5), + subject=factory.make_asset_collection(particles.RaindropFactory(scene_seed), 5), settings=particles.rain_settings()) def add_dust_particles(): return particles.particle_system( emitter=butil.spawn_cube(location=Vector(), size=30), - subject=make_asset_collection(particle_assets.DustMoteFactory(scene_seed), 5), + subject=factory.make_asset_collection(particles.DustMoteFactory(scene_seed), 5), settings=particles.floating_dust_settings()) def add_marine_snow_particles(): return particles.particle_system( emitter=butil.spawn_cube(location=Vector(), size=30), - subject=make_asset_collection(particle_assets.DustMoteFactory(scene_seed), 5), + subject=factory.make_asset_collection(particles.DustMoteFactory(scene_seed), 5), settings=particles.marine_snow_setting()) def add_snow_particles(): return particles.particle_system( emitter=butil.spawn_plane(location=emitter_off, size=60), - subject=make_asset_collection(particle_assets.SnowflakeFactory(scene_seed), 5), + subject=factory.make_asset_collection(particles.SnowflakeFactory(scene_seed), 5), settings=particles.snow_settings()) particle_systems = [ @@ -379,7 +369,7 @@ def add_snow_particles(): ] for emitter, system in filter(lambda s: s is not None, particle_systems): - with Timer(f"Baking particle system"): + with logging_util.Timer(f"Baking particle system"): butil.constrain_object(emitter, "COPY_LOCATION", use_offset=True, target=cam.parent) particles.bake(emitter, system) butil.put_in_collection(emitter, butil.get_collection('particles')) @@ -389,10 +379,10 @@ def add_snow_particles(): c.all_objects for c in bpy.data.collections if c.name.startswith('placeholders:') )) - add_simulated_river = lambda: make_river(terrain_mesh, placeholders, output_folder=output_folder) + add_simulated_river = lambda: fluid.make_river(terrain_mesh, placeholders, output_folder=output_folder) p.run_stage('simulated_river', add_simulated_river, use_chance=False) - add_tilted_river = lambda: make_tilted_river(terrain_mesh, placeholders, output_folder=output_folder) + add_tilted_river = lambda: fluid.make_tilted_river(terrain_mesh, placeholders, output_folder=output_folder) p.run_stage('tilted_river', add_tilted_river, use_chance=False) p.save_results(output_folder/'pipeline_coarse.csv') @@ -427,10 +417,14 @@ def main(): datefmt='%H:%M:%S' ) - scene_seed = infinigen.apply_scene_seed(args) - infinigen.apply_gin_configs(args, scene_seed) + scene_seed = execute_tasks.apply_scene_seed(args) + execute_tasks.apply_gin_configs( + args, + Path(__file__).parent/'configs', + mandatory_config_dir=Path(__file__).parent/'configs/scene_types', + ) - infinigen.main( + execute_tasks.main( compose_scene_func=compose_scene, input_folder=args.input_folder, output_folder=args.output_folder, diff --git a/examples/scripts/render_river_video.sh b/examples/scripts/render_river_video.sh deleted file mode 100644 index ad627d111..000000000 --- a/examples/scripts/render_river_video.sh +++ /dev/null @@ -1,11 +0,0 @@ -# TEMP. REMOVE BEFORE MERGE. - -HOSTFIRST=$(hostname | tr "." "\n" | head -n 1) -JOBNAME=$(date '+%m_%d_%H_%M').$HOSTFIRST.$1 -if [ "$2" = "dev" ]; then - python -m infinigen.datagen.manage_jobs --output_folder $3/$JOBNAME --num_scenes 20 \ - --pipeline_config $1 monocular_video_river enable_gpu opengl_gt --wandb_mode online --cleanup none --warmup_sec 12000 --config trailer_river dev reuse_terrain_assets simulated_river -else - python -m infinigen.datagen.manage_jobs --output_folder $3/$JOBNAME --num_scenes 50 \ - --pipeline_config $1 monocular_video_river enable_gpu opengl_gt --wandb_mode online --cleanup big_files --warmup_sec 12000 --config trailer_river reuse_terrain_assets simulated_river high_quality_terrain -fi diff --git a/examples/scripts/render_video_fire.sh b/examples/scripts/render_video_fire.sh deleted file mode 100644 index 874d665e6..000000000 --- a/examples/scripts/render_video_fire.sh +++ /dev/null @@ -1,6 +0,0 @@ -# TEMP. REMOVE BEFORE MERGE. - -HOSTFIRST=$(hostname | tr "." "\n" | head -n 1) -JOBNAME=$(date '+%m_%d_%H_%M').$HOSTFIRST.$1 -python -m infinigen.datagen.manage_jobs --output_folder $3/$JOBNAME --num_scenes $2 \ - --pipeline_config $1 monocular_video enable_gpu opengl_gt --wandb_mode online --cleanup none --warmup_sec 10000 --config trailer high_quality_terrain reuse_terrain_assets use_on_the_fly_fire diff --git a/infinigen/assets/cactus/base.py b/infinigen/assets/cactus/base.py index fbcd57b18..b83ec5fa0 100644 --- a/infinigen/assets/cactus/base.py +++ b/infinigen/assets/cactus/base.py @@ -6,11 +6,11 @@ import bpy -from assets.cactus.spike import make_default_selections -from assets.utils.decorate import write_attribute -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from placement.factory import AssetFactory +from infinigen.assets.cactus.spike import make_default_selections +from infinigen.assets.utils.decorate import write_attribute +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.factory import AssetFactory class BaseCactusFactory(AssetFactory): spike_distance = .025 diff --git a/infinigen/assets/cactus/columnar.py b/infinigen/assets/cactus/columnar.py index 2e747ce9a..177105eaa 100644 --- a/infinigen/assets/cactus/columnar.py +++ b/infinigen/assets/cactus/columnar.py @@ -8,14 +8,14 @@ import numpy as np from numpy.random import uniform -from assets.utils.decorate import geo_extension -from assets.utils.nodegroup import align_tilt -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from assets.cactus.base import BaseCactusFactory -from assets.trees.tree import build_radius_tree -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.decorate import geo_extension +from infinigen.assets.utils.nodegroup import align_tilt +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.assets.cactus.base import BaseCactusFactory +from infinigen.assets.trees.tree import build_radius_tree +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class ColumnarBaseCactusFactory(BaseCactusFactory): diff --git a/infinigen/assets/cactus/generate.py b/infinigen/assets/cactus/generate.py index 52a63275c..91307a747 100644 --- a/infinigen/assets/cactus/generate.py +++ b/infinigen/assets/cactus/generate.py @@ -10,21 +10,21 @@ import numpy as np from numpy.random import uniform -import util.blender as butil +import infinigen.core.util.blender as butil from .base import BaseCactusFactory from .globular import GlobularBaseCactusFactory from .columnar import ColumnarBaseCactusFactory from .pricky_pear import PrickyPearBaseCactusFactory from .kalidium import KalidiumBaseCactusFactory -from assets.cactus import spike -from assets.utils.misc import build_color_ramp, log_uniform -from assets.utils.decorate import assign_material, join_objects -from nodes.node_wrangler import NodeWrangler, Nodes -from placement.detail import remesh_with_attrs -from surfaces import surface -from placement.factory import AssetFactory -from util.math import FixedSeed -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.cactus import spike +from infinigen.assets.utils.misc import build_color_ramp, log_uniform +from infinigen.assets.utils.decorate import assign_material, join_objects +from infinigen.core.nodes.node_wrangler import NodeWrangler, Nodes +from infinigen.core.placement.detail import remesh_with_attrs +from infinigen.core import surface +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util.math import FixedSeed +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class CactusFactory(AssetFactory): diff --git a/infinigen/assets/cactus/globular.py b/infinigen/assets/cactus/globular.py index 730e12671..0ccc5c516 100644 --- a/infinigen/assets/cactus/globular.py +++ b/infinigen/assets/cactus/globular.py @@ -7,17 +7,17 @@ import bpy from numpy.random import uniform -from assets.cactus.base import BaseCactusFactory +from infinigen.assets.cactus.base import BaseCactusFactory import numpy as np -from assets.utils.object import new_cube -from assets.utils.decorate import geo_extension -from assets.utils.misc import log_uniform -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.object import new_cube +from infinigen.assets.utils.decorate import geo_extension +from infinigen.assets.utils.misc import log_uniform +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class GlobularBaseCactusFactory(BaseCactusFactory): diff --git a/infinigen/assets/cactus/kalidium.py b/infinigen/assets/cactus/kalidium.py index 783de0547..3bc0d075f 100644 --- a/infinigen/assets/cactus/kalidium.py +++ b/infinigen/assets/cactus/kalidium.py @@ -8,20 +8,20 @@ import numpy as np from numpy.random import uniform -from assets.trees.tree import TreeVertices, build_radius_tree, recursive_path -from assets.utils.nodegroup import geo_radius -from assets.utils.object import data2mesh, mesh2obj, new_cube, origin2lowest -from assets.utils.decorate import displace_vertices, geo_extension, read_co, remove_vertices, separate_loose, \ +from infinigen.assets.trees.tree import TreeVertices, build_radius_tree, recursive_path +from infinigen.assets.utils.nodegroup import geo_radius +from infinigen.assets.utils.object import data2mesh, mesh2obj, new_cube, origin2lowest +from infinigen.assets.utils.decorate import displace_vertices, geo_extension, read_co, remove_vertices, separate_loose, \ subsurface2face_size -from assets.utils.shortest_path import geo_shortest_path -from nodes.node_info import Nodes +from infinigen.assets.utils.shortest_path import geo_shortest_path +from infinigen.core.nodes.node_info import Nodes -from placement.factory import AssetFactory, make_asset_collection -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from assets.cactus.base import BaseCactusFactory -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.assets.cactus.base import BaseCactusFactory +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class KalidiumBaseCactusFactory(BaseCactusFactory): diff --git a/infinigen/assets/cactus/pricky_pear.py b/infinigen/assets/cactus/pricky_pear.py index 50bfca81a..c7194cdee 100644 --- a/infinigen/assets/cactus/pricky_pear.py +++ b/infinigen/assets/cactus/pricky_pear.py @@ -8,16 +8,16 @@ import numpy as np from numpy.random import uniform -from assets.utils.object import new_cube -from assets.utils.decorate import geo_extension, join_objects -from assets.utils.misc import log_uniform -from surfaces.surface import write_attr_data -from util import blender as butil -from assets.cactus.base import BaseCactusFactory -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.object import new_cube +from infinigen.assets.utils.decorate import geo_extension, join_objects +from infinigen.assets.utils.misc import log_uniform +from infinigen.core.surface import write_attr_data +from infinigen.core.util import blender as butil +from infinigen.assets.cactus.base import BaseCactusFactory +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class PrickyPearBaseCactusFactory(BaseCactusFactory): spike_distance = .08 diff --git a/infinigen/assets/cactus/spike.py b/infinigen/assets/cactus/spike.py index 72cf3269c..055f952da 100644 --- a/infinigen/assets/cactus/spike.py +++ b/infinigen/assets/cactus/spike.py @@ -8,17 +8,17 @@ import numpy as np from numpy.random import uniform -from util import blender as butil -from assets.utils.misc import sample_direction -from assets.utils.decorate import assign_material -from assets.utils.nodegroup import geo_radius -from placement.factory import AssetFactory, make_asset_collection -from nodes.node_wrangler import NodeWrangler, Nodes -from surfaces import surface -from assets.trees.tree import build_radius_tree -import util.blender as butil -from util.blender import deep_clone_obj -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.util import blender as butil +from infinigen.assets.utils.misc import sample_direction +from infinigen.assets.utils.decorate import assign_material +from infinigen.assets.utils.nodegroup import geo_radius +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.core.nodes.node_wrangler import NodeWrangler, Nodes +from infinigen.core import surface +from infinigen.assets.trees.tree import build_radius_tree +import infinigen.core.util.blender as butil +from infinigen.core.util.blender import deep_clone_obj +from infinigen.assets.utils.tag import tag_object, tag_nodegroup def build_spikes(base_radius=.002, **kwargs): n_branch = 4 diff --git a/infinigen/assets/underwater/corals/__init__.py b/infinigen/assets/corals/__init__.py similarity index 100% rename from infinigen/assets/underwater/corals/__init__.py rename to infinigen/assets/corals/__init__.py diff --git a/infinigen/assets/underwater/corals/base.py b/infinigen/assets/corals/base.py similarity index 91% rename from infinigen/assets/underwater/corals/base.py rename to infinigen/assets/corals/base.py index b85b22b62..3fcec97e1 100644 --- a/infinigen/assets/underwater/corals/base.py +++ b/infinigen/assets/corals/base.py @@ -6,7 +6,7 @@ import bpy -from placement.factory import AssetFactory +from infinigen.core.placement.factory import AssetFactory class BaseCoralFactory(AssetFactory): diff --git a/infinigen/assets/underwater/corals/diff_growth.py b/infinigen/assets/corals/diff_growth.py similarity index 88% rename from infinigen/assets/underwater/corals/diff_growth.py rename to infinigen/assets/corals/diff_growth.py index a1a657237..cfd799951 100644 --- a/infinigen/assets/underwater/corals/diff_growth.py +++ b/infinigen/assets/corals/diff_growth.py @@ -7,16 +7,16 @@ import numpy as np from numpy.random import uniform -from assets.corals.base import BaseCoralFactory -from assets.corals.tentacles import make_upward_points_fn, make_radius_points_fn -from infinigen_gpl.extras.diff_growth import build_diff_growth -from assets.utils.object import mesh2obj, data2mesh -from assets.utils.decorate import geo_extension, read_co -from assets.utils.mesh import polygon_angles -import util.blender as butil -from surfaces import surface -from util.math import FixedSeed -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.corals.base import BaseCoralFactory +from infinigen.assets.corals.tentacles import make_upward_points_fn, make_radius_points_fn +from infinigen.infinigen_gpl.extras.diff_growth import build_diff_growth +from infinigen.assets.utils.object import mesh2obj, data2mesh +from infinigen.assets.utils.decorate import geo_extension, read_co +from infinigen.assets.utils.mesh import polygon_angles +import infinigen.core.util.blender as butil +from infinigen.core import surface +from infinigen.core.util.math import FixedSeed +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class DiffGrowthBaseCoralFactory(BaseCoralFactory): default_scale = [1] * 3 diff --git a/infinigen/assets/underwater/corals/elkhorn.py b/infinigen/assets/corals/elkhorn.py similarity index 88% rename from infinigen/assets/underwater/corals/elkhorn.py rename to infinigen/assets/corals/elkhorn.py index 966cbc631..90485844d 100644 --- a/infinigen/assets/underwater/corals/elkhorn.py +++ b/infinigen/assets/corals/elkhorn.py @@ -10,19 +10,19 @@ from mathutils import kdtree from numpy.random import uniform -from assets.corals.base import BaseCoralFactory -from assets.corals.tentacles import make_radius_points_fn -from assets.utils.decorate import displace_vertices, geo_extension, read_co, remove_vertices, \ +from infinigen.assets.corals.base import BaseCoralFactory +from infinigen.assets.corals.tentacles import make_radius_points_fn +from infinigen.assets.utils.decorate import displace_vertices, geo_extension, read_co, remove_vertices, \ separate_loose, write_co -from assets.utils.draw import make_circular_interp -from assets.utils.misc import log_uniform -from assets.utils.object import new_circle, origin2lowest -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from util.blender import deep_clone_obj -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.draw import make_circular_interp +from infinigen.assets.utils.misc import log_uniform +from infinigen.assets.utils.object import new_circle, origin2lowest +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.core.util.blender import deep_clone_obj +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class ElkhornBaseCoralFactory(BaseCoralFactory): tentacle_prob = 0. diff --git a/infinigen/assets/underwater/corals/fan.py b/infinigen/assets/corals/fan.py similarity index 83% rename from infinigen/assets/underwater/corals/fan.py rename to infinigen/assets/corals/fan.py index 3945cad25..403a39961 100644 --- a/infinigen/assets/underwater/corals/fan.py +++ b/infinigen/assets/corals/fan.py @@ -9,17 +9,17 @@ import numpy as np from numpy.random import uniform -import util.blender as butil -from assets.corals.base import BaseCoralFactory -from assets.utils.decorate import displace_vertices, geo_extension, read_co, subsurface2face_size, treeify -from assets.utils.draw import shape_by_angles -from assets.utils.nodegroup import geo_radius -from assets.utils.object import new_circle, origin2lowest -from assets.utils.shortest_path import geo_shortest_path -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from assets.utils.tag import tag_object, tag_nodegroup +import infinigen.core.util.blender as butil +from infinigen.assets.corals.base import BaseCoralFactory +from infinigen.assets.utils.decorate import displace_vertices, geo_extension, read_co, subsurface2face_size, treeify +from infinigen.assets.utils.draw import shape_by_angles +from infinigen.assets.utils.nodegroup import geo_radius +from infinigen.assets.utils.object import new_circle, origin2lowest +from infinigen.assets.utils.shortest_path import geo_shortest_path +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class FanBaseCoralFactory(BaseCoralFactory): tentacle_prob = 0. diff --git a/infinigen/assets/underwater/corals/generate.py b/infinigen/assets/corals/generate.py similarity index 93% rename from infinigen/assets/underwater/corals/generate.py rename to infinigen/assets/corals/generate.py index 5fd77f35b..0b99dbab4 100644 --- a/infinigen/assets/underwater/corals/generate.py +++ b/infinigen/assets/corals/generate.py @@ -10,16 +10,16 @@ import numpy as np from numpy.random import uniform -import util.blender as butil -from assets.utils.misc import build_color_ramp, log_uniform +import infinigen.core.util.blender as butil +from infinigen.assets.utils.misc import build_color_ramp, log_uniform from .fan import FanBaseCoralFactory from ..utils.decorate import assign_material, join_objects -from util.math import FixedSeed -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from placement.detail import remesh_with_attrs -from placement.factory import AssetFactory -from surfaces import surface +from infinigen.core.util.math import FixedSeed +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.detail import remesh_with_attrs +from infinigen.core.placement.factory import AssetFactory +from infinigen.core import surface from .base import BaseCoralFactory from .diff_growth import DiffGrowthBaseCoralFactory, LeatherBaseCoralFactory, TableBaseCoralFactory from .laplacian import CauliflowerBaseCoralFactory @@ -30,7 +30,7 @@ from .tube import TubeBaseCoralFactory from .star import StarBaseCoralFactory from . import tentacles -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class CoralFactory(AssetFactory): diff --git a/infinigen/assets/underwater/corals/laplacian.py b/infinigen/assets/corals/laplacian.py similarity index 65% rename from infinigen/assets/underwater/corals/laplacian.py rename to infinigen/assets/corals/laplacian.py index 63fa4a07a..261e5cd96 100644 --- a/infinigen/assets/underwater/corals/laplacian.py +++ b/infinigen/assets/corals/laplacian.py @@ -4,14 +4,14 @@ # Authors: Lingjie Mei -from assets.corals.base import BaseCoralFactory -from assets.corals.tentacles import make_radius_points_fn -from assets.utils.laplacian import build_laplacian_3d -from assets.utils.object import mesh2obj -from assets.utils.decorate import geo_extension -import util.blender as butil -from surfaces import surface -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.corals.base import BaseCoralFactory +from infinigen.assets.corals.tentacles import make_radius_points_fn +from infinigen.assets.utils.laplacian import build_laplacian_3d +from infinigen.assets.utils.object import mesh2obj +from infinigen.assets.utils.decorate import geo_extension +import infinigen.core.util.blender as butil +from infinigen.core import surface +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class CauliflowerBaseCoralFactory(BaseCoralFactory): tentacle_prob = 0.4 diff --git a/infinigen/assets/underwater/corals/reaction_diffusion.py b/infinigen/assets/corals/reaction_diffusion.py similarity index 84% rename from infinigen/assets/underwater/corals/reaction_diffusion.py rename to infinigen/assets/corals/reaction_diffusion.py index b7891af1a..f966ba9bf 100644 --- a/infinigen/assets/underwater/corals/reaction_diffusion.py +++ b/infinigen/assets/corals/reaction_diffusion.py @@ -7,15 +7,15 @@ import bpy import numpy as np -from assets.corals.base import BaseCoralFactory -from assets.utils.object import center, mesh2obj, new_icosphere -from assets.utils.decorate import geo_extension -from assets.utils.mesh import build_convex_mesh -from assets.utils.reaction_diffusion import feed2kill, make_periodic_weight_fn, reaction_diffusion -import util.blender as butil -from util.math import FixedSeed -from surfaces import surface -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.corals.base import BaseCoralFactory +from infinigen.assets.utils.object import center, mesh2obj, new_icosphere +from infinigen.assets.utils.decorate import geo_extension +from infinigen.assets.utils.mesh import build_convex_mesh +from infinigen.assets.utils.reaction_diffusion import feed2kill, make_periodic_weight_fn, reaction_diffusion +import infinigen.core.util.blender as butil +from infinigen.core.util.math import FixedSeed +from infinigen.core import surface +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class ReactionDiffusionBaseCoralFactory(BaseCoralFactory): tentacle_prob = 0. diff --git a/infinigen/assets/underwater/corals/star.py b/infinigen/assets/corals/star.py similarity index 91% rename from infinigen/assets/underwater/corals/star.py rename to infinigen/assets/corals/star.py index b5badb6bc..825db8d1e 100644 --- a/infinigen/assets/underwater/corals/star.py +++ b/infinigen/assets/corals/star.py @@ -10,15 +10,15 @@ from mathutils import Vector from numpy.random import uniform -import util.blender as butil -from assets.corals.base import BaseCoralFactory -from assets.utils.decorate import displace_vertices, geo_extension, join_objects -from assets.utils.object import new_empty, new_icosphere -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from util.blender import deep_clone_obj -from assets.utils.tag import tag_object, tag_nodegroup +import infinigen.core.util.blender as butil +from infinigen.assets.corals.base import BaseCoralFactory +from infinigen.assets.utils.decorate import displace_vertices, geo_extension, join_objects +from infinigen.assets.utils.object import new_empty, new_icosphere +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.core.util.blender import deep_clone_obj +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class StarBaseCoralFactory(BaseCoralFactory): tentacle_prob = 1. diff --git a/infinigen/assets/underwater/corals/tentacles.py b/infinigen/assets/corals/tentacles.py similarity index 88% rename from infinigen/assets/underwater/corals/tentacles.py rename to infinigen/assets/corals/tentacles.py index 96d20c3a3..af02c3ae6 100644 --- a/infinigen/assets/underwater/corals/tentacles.py +++ b/infinigen/assets/corals/tentacles.py @@ -8,16 +8,16 @@ import numpy as np from numpy.random import uniform -from assets.utils.misc import sample_direction -from assets.utils.decorate import assign_material -from assets.utils.nodegroup import geo_radius -from placement.factory import make_asset_collection -from nodes.node_wrangler import NodeWrangler, Nodes -from surfaces import surface -from assets.trees.tree import build_radius_tree -import util.blender as butil -from util.blender import deep_clone_obj -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.misc import sample_direction +from infinigen.assets.utils.decorate import assign_material +from infinigen.assets.utils.nodegroup import geo_radius +from infinigen.core.placement.factory import make_asset_collection +from infinigen.core.nodes.node_wrangler import NodeWrangler, Nodes +from infinigen.core import surface +from infinigen.assets.trees.tree import build_radius_tree +import infinigen.core.util.blender as butil +from infinigen.core.util.blender import deep_clone_obj +from infinigen.assets.utils.tag import tag_object, tag_nodegroup def build_tentacles(**kwargs): n_branch = 5 diff --git a/infinigen/assets/underwater/corals/tree.py b/infinigen/assets/corals/tree.py similarity index 89% rename from infinigen/assets/underwater/corals/tree.py rename to infinigen/assets/corals/tree.py index 5d79d81f8..0df8febc3 100644 --- a/infinigen/assets/underwater/corals/tree.py +++ b/infinigen/assets/corals/tree.py @@ -9,17 +9,17 @@ import numpy as np from numpy.random import uniform -from assets.corals.base import BaseCoralFactory -from assets.corals.tentacles import make_radius_points_fn -from assets.utils.decorate import separate_loose -from assets.utils.object import mesh2obj, data2mesh -from assets.utils.nodegroup import geo_radius -import util.blender as butil -from placement.detail import remesh_with_attrs -from util.math import FixedSeed -from surfaces import surface -from assets.trees.tree import build_radius_tree, recursive_path, FineTreeVertices -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.corals.base import BaseCoralFactory +from infinigen.assets.corals.tentacles import make_radius_points_fn +from infinigen.assets.utils.decorate import separate_loose +from infinigen.assets.utils.object import mesh2obj, data2mesh +from infinigen.assets.utils.nodegroup import geo_radius +import infinigen.core.util.blender as butil +from infinigen.core.placement.detail import remesh_with_attrs +from infinigen.core.util.math import FixedSeed +from infinigen.core import surface +from infinigen.assets.trees.tree import build_radius_tree, recursive_path, FineTreeVertices +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class TreeBaseCoralFactory(BaseCoralFactory): default_scale = [1] * 3 diff --git a/infinigen/assets/underwater/corals/tube.py b/infinigen/assets/corals/tube.py similarity index 88% rename from infinigen/assets/underwater/corals/tube.py rename to infinigen/assets/corals/tube.py index bb2123b11..34b2aa146 100644 --- a/infinigen/assets/underwater/corals/tube.py +++ b/infinigen/assets/corals/tube.py @@ -7,14 +7,14 @@ import bpy import numpy as np -from assets.corals.base import BaseCoralFactory -from assets.corals.tentacles import make_radius_points_fn -import util.blender as butil -from assets.utils.object import new_icosphere -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.corals.base import BaseCoralFactory +from infinigen.assets.corals.tentacles import make_radius_points_fn +import infinigen.core.util.blender as butil +from infinigen.assets.utils.object import new_icosphere +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class TubeBaseCoralFactory(BaseCoralFactory): default_scale = [.7] * 3 diff --git a/infinigen/assets/creatures/__init__.py b/infinigen/assets/creatures/__init__.py index c6ad9b534..edcb80a95 100644 --- a/infinigen/assets/creatures/__init__.py +++ b/infinigen/assets/creatures/__init__.py @@ -1,8 +1,8 @@ -from .genomes.beetle import BeetleFactory, AntSwarmFactory -from .genomes.bird import BirdFactory, FlyingBirdFactory -from .genomes.carnivore import CarnivoreFactory -from .genomes.fish import FishFactory, FishSchoolFactory -from .genomes.herbivore import HerbivoreFactory -from .genomes.crustacean import CrustaceanFactory, CrabFactory, LobsterFactory, SpinyLobsterFactory -from .genomes.reptile import FrogFactory, LizardFactory, SnakeFactory, ChameleonFactory -from .genomes.beetle import BeetleFactory, AntSwarmFactory \ No newline at end of file +from .beetle import BeetleFactory, AntSwarmFactory +from .bird import BirdFactory, FlyingBirdFactory +from .carnivore import CarnivoreFactory +from .fish import FishFactory, FishSchoolFactory +from .herbivore import HerbivoreFactory +from .crustacean import CrustaceanFactory, CrabFactory, LobsterFactory, SpinyLobsterFactory +from .reptile import FrogFactory, LizardFactory, SnakeFactory +from .insects.dragonfly import DragonflyFactory diff --git a/infinigen/assets/creatures/beetle.py b/infinigen/assets/creatures/beetle.py index 8947826ab..617e3fe81 100644 --- a/infinigen/assets/creatures/beetle.py +++ b/infinigen/assets/creatures/beetle.py @@ -12,18 +12,18 @@ from numpy.random import uniform as U, normal as N, randint import gin -from assets.creatures import genome -from assets.creatures.genome import Joint -from assets.creatures import parts -from assets.creatures.creature_util import offset_center -from assets.creatures import creature, hair as creature_hair, generate as creature_gen -from assets.creatures.animation import run_cycle as creature_animation -from assets.creatures.boid_swarm import BoidSwarmFactory +from infinigen.assets.creatures.util import genome +from infinigen.assets.creatures.util.genome import Joint +from infinigen.assets.creatures import parts +from infinigen.assets.creatures.util.creature_util import offset_center +from infinigen.assets.creatures.util import creature, hair as creature_hair, joining +from infinigen.assets.creatures.util.animation import run_cycle as creature_animation +from infinigen.assets.creatures.util.boid_swarm import BoidSwarmFactory -from placement.factory import AssetFactory, make_asset_collection -from util.math import lerp, clip_gaussian, FixedSeed -import surfaces.templates.chitin -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.core.util.math import lerp, clip_gaussian, FixedSeed +import infinigen.assets.materials.chitin +from infinigen.assets.utils.tag import tag_object, tag_nodegroup logger = logging.getLogger('beetle') @@ -62,7 +62,7 @@ def insect_hair_params(): def beetle_postprocessing(body_parts, extras, params): - main_template = surfaces.surface.registry.sample_registry(params['surface_registry']) + main_template = surface.registry.sample_registry(params['surface_registry']) main_template.apply(body_parts) def beetle_genome(): @@ -103,7 +103,7 @@ def beetle_genome(): parts=body, postprocess_params=dict( surface_registry=[ - (surfaces.templates.chitin, 1) + (assets.materials.chitin, 1) ], hair=insect_hair_params() ) @@ -122,7 +122,7 @@ def create_asset(self, i, hair=False, **kwargs): root, parts = creature.genome_to_creature(genome, name=f'beetle({self.factory_seed}, {i})') tag_object(root, 'beetle') offset_center(root) - joined, extras, arma, ik_targets = creature_gen.join_and_rig_parts(root, parts, genome, + joined, extras, arma, ik_targets = joining.join_and_rig_parts(root, parts, genome, rigging=(self.animation_mode is not None), postprocess_func=beetle_postprocessing, **kwargs) if self.animation_mode == 'walk_cycle': diff --git a/infinigen/assets/creatures/bird.py b/infinigen/assets/creatures/bird.py index f1f9cc4db..8c29de77d 100644 --- a/infinigen/assets/creatures/bird.py +++ b/infinigen/assets/creatures/bird.py @@ -14,31 +14,31 @@ from numpy.random import normal as N, uniform as U import gin -from assets.creatures import genome -from assets.creatures.genome import Joint -from assets.creatures import parts +from infinigen.assets.creatures.util import genome +from infinigen.assets.creatures.util.genome import Joint +from infinigen.assets.creatures import parts -from assets.creatures.creature_util import euler +from infinigen.assets.creatures.util.creature_util import euler -import surfaces.templates.basic_bsdf -import surfaces.templates.spot_sparse_attr -import surfaces.templates.reptile_brown_circle_attr -import surfaces.templates.reptile_two_color_attr -import surfaces.templates.bird +import infinigen.assets.materials.basic_bsdf +import infinigen.assets.materials.spot_sparse_attr +import infinigen.assets.materials.reptile_brown_circle_attr +import infinigen.assets.materials.reptile_two_color_attr +import infinigen.assets.materials.bird -from surfaces.templates import bone, tongue, eyeball, beak -from util.math import clip_gaussian, FixedSeed -from util.random import random_general as rg -from util import blender as butil +from infinigen.assets.materials import bone, tongue, eyeball, beak +from infinigen.core.util.math import clip_gaussian, FixedSeed +from infinigen.core.util.random import random_general as rg +from infinigen.core.util import blender as butil -from placement.factory import AssetFactory -from assets.creatures.creature_util import offset_center -from assets.creatures import creature, hair as creature_hair, generate as creature_gen -from assets.creatures.animation.driver_wiggle import animate_wiggle_bones -from assets.creatures.animation import idle, run_cycle -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.placement.factory import AssetFactory +from infinigen.assets.creatures.util.creature_util import offset_center +from infinigen.assets.creatures.util import creature, hair as creature_hair, joining +from infinigen.assets.creatures.util.animation.driver_wiggle import animate_wiggle_bones +from infinigen.assets.creatures.util.animation import idle, run_cycle +from infinigen.assets.utils.tag import tag_object, tag_nodegroup -from placement import animation_policy +from infinigen.core.placement import animation_policy def bird_hair_params(flying=True): @@ -75,7 +75,7 @@ def bird_postprocessing(body_parts, extras, params): get_extras = lambda k: [o for o in extras if k in o.name] - main_template = surfaces.surface.registry.sample_registry(params['surface_registry']) + main_template = surface.registry.sample_registry(params['surface_registry']) main_template.apply(body_parts + get_extras('BodyExtra') + get_extras('Feather')) tongue.apply(get_extras('Tongue')) @@ -150,10 +150,10 @@ def duck_genome(mode): animation=dict(), hair=bird_hair_params(flying=False), surface_registry=[ - (surfaces.templates.spot_sparse_attr, 4), - (surfaces.templates.reptile_brown_circle_attr, 0.5), - (surfaces.templates.reptile_two_color_attr, 0.5), - (surfaces.templates.bird, 5) + (assets.materials.spot_sparse_attr, 4), + (assets.materials.reptile_brown_circle_attr, 0.5), + (assets.materials.reptile_two_color_attr, 0.5), + (assets.materials.bird, 5) ] ) ) @@ -227,10 +227,10 @@ def flying_bird_genome(mode): animation=dict(), hair=bird_hair_params(flying=True), surface_registry=[ - #(surfaces.templates.spot_sparse_attr, 4), - #(surfaces.templates.reptile_brown_circle_attr, 0.5), - #(surfaces.templates.reptile_two_color_attr, 0.5), - (surfaces.templates.bird, 5) + #(assets.materials.spot_sparse_attr, 4), + #(assets.materials.reptile_brown_circle_attr, 0.5), + #(assets.materials.reptile_two_color_attr, 0.5), + (assets.materials.bird, 5) ] ) ) @@ -251,7 +251,7 @@ def create_asset(self, i, placeholder, hair=True, **kwargs): root, parts = creature.genome_to_creature(genome, name=f'bird({self.factory_seed}, {i})') tag_object(root, 'bird') offset_center(root) - joined, extras, arma, ik_targets = creature_gen.join_and_rig_parts(root, parts, genome, + joined, extras, arma, ik_targets = joining.join_and_rig_parts(root, parts, genome, rigging=dynamic, postprocess_func=bird_postprocessing, **kwargs) @@ -320,7 +320,7 @@ def create_asset(self, i, placeholder, hair=True, animate=False,**kwargs): genome = flying_bird_genome(self.animation_mode) root, parts = creature.genome_to_creature(genome, name=f'flying_bird({self.factory_seed}, {i})') - joined, extras, arma, ik_targets = creature_gen.join_and_rig_parts(root, parts, genome, + joined, extras, arma, ik_targets = joining.join_and_rig_parts(root, parts, genome, rigging=self.animation_mode is not None, postprocess_func=bird_postprocessing, **kwargs) joined_extras = butil.join_objects(extras) diff --git a/infinigen/assets/creatures/carnivore.py b/infinigen/assets/creatures/carnivore.py index 205f19eca..abd185beb 100644 --- a/infinigen/assets/creatures/carnivore.py +++ b/infinigen/assets/creatures/carnivore.py @@ -8,27 +8,27 @@ from numpy.random import uniform as U, normal as N import gin -from assets.creatures import genome -from assets.creatures.genome import Joint -from assets.creatures import parts -from util.math import clip_gaussian +from infinigen.assets.creatures.util import genome +from infinigen.assets.creatures.util.genome import Joint +from infinigen.assets.creatures import parts +from infinigen.core.util.math import clip_gaussian -import surfaces.templates.tiger_attr -import surfaces.templates.giraffe_attr -import surfaces.templates.spot_sparse_attr -from surfaces import surface +import infinigen.assets.materials.tiger_attr +import infinigen.assets.materials.giraffe_attr +import infinigen.assets.materials.spot_sparse_attr +from infinigen.core import surface -from surfaces.templates import bone, tongue, eyeball, nose +from infinigen.assets.materials import bone, tongue, eyeball, nose -from placement.factory import AssetFactory -from assets.creatures.creature_util import offset_center -from assets.creatures import creature, generate as creature_gen -from assets.creatures import hair as creature_hair, cloth_sim -from assets.creatures.animation import idle, run_cycle +from infinigen.core.placement.factory import AssetFactory +from infinigen.assets.creatures.util.creature_util import offset_center +from infinigen.assets.creatures.util import creature, joining +from infinigen.assets.creatures.util import hair as creature_hair, cloth_sim +from infinigen.assets.creatures.util.animation import idle, run_cycle -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.tag import tag_object, tag_nodegroup -from util import blender as butil +from infinigen.core.util import blender as butil def tiger_hair_params(): @@ -80,7 +80,7 @@ def tiger_postprocessing(body_parts, extras, params): get_extras = lambda k: [o for o in extras if k in o.name] - main_template = surfaces.surface.registry.sample_registry(params['surface_registry']) + main_template = surface.registry.sample_registry(params['surface_registry']) main_template.apply(body_parts + get_extras('BodyExtra')) tongue.apply(get_extras('Tongue')) @@ -169,9 +169,9 @@ def tiger_genome(): hair=tiger_hair_params(), skin=tiger_skin_sim_params(), surface_registry=[ - (surfaces.templates.tiger_attr, 3), - (surfaces.templates.giraffe_attr, 0.2), - (surfaces.templates.spot_sparse_attr, 2) + (assets.materials.tiger_attr, 3), + (assets.materials.giraffe_attr, 0.2), + (assets.materials.spot_sparse_attr, 2) ] ) ) @@ -196,7 +196,7 @@ def create_asset(self, i, placeholder, hair=True, simulate=False, **kwargs): dynamic = self.animation_mode is not None - joined, extras, arma, ik_targets = creature_gen.join_and_rig_parts( + joined, extras, arma, ik_targets = joining.join_and_rig_parts( root, parts, genome, rigging=dynamic, postprocess_func=tiger_postprocessing, **kwargs) diff --git a/infinigen/assets/creatures/crustacean.py b/infinigen/assets/creatures/crustacean.py index 26e9ec0ca..fa4e2cd3d 100644 --- a/infinigen/assets/creatures/crustacean.py +++ b/infinigen/assets/creatures/crustacean.py @@ -12,24 +12,24 @@ import numpy as np from numpy.random import uniform -from assets.creatures.creature import genome_to_creature -from assets.creatures.generate import join_and_rig_parts -from assets.creatures.genome import CreatureGenome, Joint, attach, part -from assets.creatures.parts.crustacean.antenna import LobsterAntennaFactory, SpinyLobsterAntennaFactory -from assets.creatures.parts.crustacean.claw import CrabClawFactory, LobsterClawFactory -from assets.creatures.parts.crustacean.eye import CrustaceanEyeFactory -from assets.creatures.parts.crustacean.fin import CrustaceanFinFactory -from assets.creatures.parts.crustacean.leg import CrabLegFactory, LobsterLegFactory -from assets.creatures.parts.crustacean.body import CrabBodyFactory, LobsterBodyFactory -from assets.creatures.parts.crustacean.tail import CrustaceanTailFactory -from assets.utils.decorate import assign_material, read_material_index, write_material_index -from assets.utils.misc import build_color_ramp, log_uniform -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from placement.factory import AssetFactory -from surfaces.surface import read_attr_data, shaderfunc_to_material -from util import blender as butil -from util.math import FixedSeed +from infinigen.assets.creatures.util.creature import genome_to_creature +from infinigen.assets.creatures.util.joining import join_and_rig_parts +from infinigen.assets.creatures.util.genome import CreatureGenome, Joint, attach, part +from infinigen.assets.creatures.parts.crustacean.antenna import LobsterAntennaFactory, SpinyLobsterAntennaFactory +from infinigen.assets.creatures.parts.crustacean.claw import CrabClawFactory, LobsterClawFactory +from infinigen.assets.creatures.parts.crustacean.eye import CrustaceanEyeFactory +from infinigen.assets.creatures.parts.crustacean.fin import CrustaceanFinFactory +from infinigen.assets.creatures.parts.crustacean.leg import CrabLegFactory, LobsterLegFactory +from infinigen.assets.creatures.parts.crustacean.body import CrabBodyFactory, LobsterBodyFactory +from infinigen.assets.creatures.parts.crustacean.tail import CrustaceanTailFactory +from infinigen.assets.utils.decorate import assign_material, read_material_index, write_material_index +from infinigen.assets.utils.misc import build_color_ramp, log_uniform +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.surface import read_attr_data, shaderfunc_to_material +from infinigen.core.util import blender as butil +from infinigen.core.util.math import FixedSeed n_legs = 4 n_limbs = 5 diff --git a/infinigen/assets/creatures/fish.py b/infinigen/assets/creatures/fish.py index 57a9ab0ea..51b35ab20 100644 --- a/infinigen/assets/creatures/fish.py +++ b/infinigen/assets/creatures/fish.py @@ -13,29 +13,29 @@ import numpy as np from numpy.random import uniform as U, normal as N, randint -import surfaces.templates.scale -import surfaces.templates.fishbody -from surfaces.templates import fishfin, eyeball -from surfaces import surface -from surfaces.surface_utils import sample_range +import infinigen.assets.materials.scale +import infinigen.assets.materials.fishbody +from infinigen.assets.materials import fishfin, eyeball +from infinigen.core import surface +from infinigen.assets.materials.utils.surface_utils import sample_range -from placement.factory import AssetFactory, make_asset_collection +from infinigen.core.placement.factory import AssetFactory, make_asset_collection -from assets.creatures import genome -from assets.creatures.genome import Joint -from assets.creatures import parts -from assets.creatures import creature, generate as creature_gen -from assets.creatures import cloth_sim -from assets.creatures.boid_swarm import BoidSwarmFactory +from infinigen.assets.creatures.util import genome +from infinigen.assets.creatures.util.genome import Joint +from infinigen.assets.creatures import parts +from infinigen.assets.creatures.util import creature, joining +from infinigen.assets.creatures.util import cloth_sim +from infinigen.assets.creatures.util.boid_swarm import BoidSwarmFactory -from util import blender as butil -from util.math import clip_gaussian, FixedSeed -from assets.creatures.animation.driver_wiggle import animate_wiggle_bones -from assets.creatures.creature_util import offset_center +from infinigen.core.util import blender as butil +from infinigen.core.util.math import clip_gaussian, FixedSeed +from infinigen.assets.creatures.util.animation.driver_wiggle import animate_wiggle_bones +from infinigen.assets.creatures.util.creature_util import offset_center -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.tag import tag_object, tag_nodegroup -from surfaces.templates import fish_eye_shader +from infinigen.assets.materials import fish_eye_shader def fin_params(scale=(1, 1, 1), dorsal=False): # scale = np.array((0.2, 1, 0.4)) * np.array((l / l_mean, 1, rad/r_mean)) * np.array(scale) @@ -76,7 +76,7 @@ def fin_params(scale=(1, 1, 1), dorsal=False): def fish_postprocessing(body_parts, extras, params): get_extras = lambda k: [o for o in extras if k in o.name] - main_template = surfaces.surface.registry.sample_registry(params['surface_registry']) + main_template = surface.registry.sample_registry(params['surface_registry']) main_template.apply(body_parts + get_extras('BodyExtra')) mat = body_parts[0].active_material @@ -169,8 +169,8 @@ def fish_genome(): cloth=fish_fin_cloth_sim_params(), anim=fish_swim_params(), surface_registry=[ - (surfaces.templates.fishbody, 3), - #(surfaces.templates.scale, 1), + (assets.materials.fishbody, 3), + #(assets.materials.scale, 1), ] ) ) @@ -246,7 +246,7 @@ def seeded_fish_postprocess(*args, **kwargs): with FixedSeed(self.factory_seed): fish_postprocessing(*args, **kwargs) - joined, extras, arma, ik_targets = creature_gen.join_and_rig_parts( + joined, extras, arma, ik_targets = joining.join_and_rig_parts( root, parts, instance_genome, rigging=(self.animation_mode is not None), rig_before_subdiv=True, postprocess_func=seeded_fish_postprocess, adapt_mode='subdivide', **kwargs) if self.animation_mode is not None and arma is not None: diff --git a/infinigen/assets/creatures/herbivore.py b/infinigen/assets/creatures/herbivore.py index fb2959489..116ea91c7 100644 --- a/infinigen/assets/creatures/herbivore.py +++ b/infinigen/assets/creatures/herbivore.py @@ -11,29 +11,29 @@ import numpy as np from numpy.random import uniform as U, normal as N -from assets.creatures import genome -from assets.creatures.genome import Joint -from assets.creatures import parts -from util.math import clip_gaussian +from infinigen.assets.creatures.util import genome +from infinigen.assets.creatures.util.genome import Joint +from infinigen.assets.creatures import parts +from infinigen.core.util.math import clip_gaussian -from surfaces import surface +from infinigen.core import surface -import surfaces.templates.tiger_attr -import surfaces.templates.giraffe_attr -import surfaces.templates.spot_sparse_attr -import surfaces.templates.reptile_brown_circle_attr -import surfaces.templates.reptile_gray_attr +import infinigen.assets.materials.tiger_attr +import infinigen.assets.materials.giraffe_attr +import infinigen.assets.materials.spot_sparse_attr +import infinigen.assets.materials.reptile_brown_circle_attr +import infinigen.assets.materials.reptile_gray_attr -from placement.factory import AssetFactory -from assets.creatures.creature_util import offset_center -from assets.creatures import creature, generate as creature_gen -from assets.creatures import hair as creature_hair, cloth_sim -from assets.creatures.animation import idle, run_cycle +from infinigen.core.placement.factory import AssetFactory +from infinigen.assets.creatures.util.creature_util import offset_center +from infinigen.assets.creatures.util import creature, joining +from infinigen.assets.creatures.util import hair as creature_hair, cloth_sim +from infinigen.assets.creatures.util.animation import idle, run_cycle -from surfaces.templates import bone, tongue, eyeball, nose, horn -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.materials import bone, tongue, eyeball, nose, horn +from infinigen.assets.utils.tag import tag_object, tag_nodegroup -from util import blender as butil +from infinigen.core.util import blender as butil def herbivore_hair(): @@ -71,7 +71,7 @@ def herbivore_postprocessing(body_parts, extras, params): get_extras = lambda k: [o for o in extras if k in o.name] - main_template = surfaces.surface.registry.sample_registry(params['surface_registry']) + main_template = surface.registry.sample_registry(params['surface_registry']) main_template.apply(body_parts + get_extras('BodyExtra')) tongue.apply(get_extras('Tongue')) @@ -166,14 +166,14 @@ def herbivore_genome(): if U() < 1: hair = herbivore_hair() registry = [ - (surfaces.templates.giraffe_attr, 1), - (surfaces.templates.spot_sparse_attr, 3) + (assets.materials.giraffe_attr, 1), + (assets.materials.spot_sparse_attr, 3) ] else: hair = None registry = [ - (surfaces.templates.reptile_brown_circle_attr, 1), - (surfaces.templates.reptile_gray_attr, 1) + (assets.materials.reptile_brown_circle_attr, 1), + (assets.materials.reptile_gray_attr, 1) ] return genome.CreatureGenome( @@ -209,7 +209,7 @@ def create_asset(self, i, placeholder, hair=True, simulate=False, **kwargs): dynamic = self.animation_mode is not None - joined, extras, arma, ik_targets = creature_gen.join_and_rig_parts( + joined, extras, arma, ik_targets = joining.join_and_rig_parts( root, parts, genome, rigging=dynamic, postprocess_func=herbivore_postprocessing, **kwargs) diff --git a/infinigen/assets/creatures/insects/__init__.py b/infinigen/assets/creatures/insects/__init__.py index 35615e347..e05ce4f40 100644 --- a/infinigen/assets/creatures/insects/__init__.py +++ b/infinigen/assets/creatures/insects/__init__.py @@ -1 +1 @@ -from .assembled.dragonfly import DragonflyFactory \ No newline at end of file +from .dragonfly import DragonflyFactory \ No newline at end of file diff --git a/infinigen/assets/creatures/insects/assembled/dragonfly.py b/infinigen/assets/creatures/insects/dragonfly.py similarity index 94% rename from infinigen/assets/creatures/insects/assembled/dragonfly.py rename to infinigen/assets/creatures/insects/dragonfly.py index 801953155..b5e9d0f77 100644 --- a/infinigen/assets/creatures/insects/assembled/dragonfly.py +++ b/infinigen/assets/creatures/insects/dragonfly.py @@ -10,23 +10,23 @@ import numpy as np from numpy.random import uniform as U, normal as N, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface -from assets.insects.utils.geom_utils import nodegroup_symmetric_clone -from assets.insects.parts.head.dragonfly_head import nodegroup_dragon_fly_head -from assets.insects.parts.body.dragonfly_body import nodegroup_dragonfly_body -from assets.insects.parts.tail.dragonfly_tail import nodegroup_dragonfly_tail -from assets.insects.parts.leg.dragonfly_leg import nodegroup_leg_control, nodegroup_dragonfly_leg -from assets.insects.parts.wing.dragonfly_wing import nodegroup_dragonfly_wing +from .utils.geom_utils import nodegroup_symmetric_clone +from .parts.head.dragonfly_head import nodegroup_dragon_fly_head +from .parts.body.dragonfly_body import nodegroup_dragonfly_body +from .parts.tail.dragonfly_tail import nodegroup_dragonfly_tail +from .parts.leg.dragonfly_leg import nodegroup_leg_control, nodegroup_dragonfly_leg +from .parts.wing.dragonfly_wing import nodegroup_dragonfly_wing -from placement import animation_policy +from infinigen.core.placement import animation_policy -from util.math import FixedSeed -from placement.factory import AssetFactory -from util import blender as butil +from infinigen.core.util.math import FixedSeed +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util import blender as butil def geometry_dragonfly(nw: NodeWrangler, **kwargs): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/creatures/insects/parts/antenna/dragonfly_antenna.py b/infinigen/assets/creatures/insects/parts/antenna/dragonfly_antenna.py index 9bc22bba3..5a98e3114 100644 --- a/infinigen/assets/creatures/insects/parts/antenna/dragonfly_antenna.py +++ b/infinigen/assets/creatures/insects/parts/antenna/dragonfly_antenna.py @@ -7,12 +7,12 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.insects.utils.geom_utils import nodegroup_simple_tube_v2 +from infinigen.assets.creatures.insects.utils.geom_utils import nodegroup_simple_tube_v2 @node_utils.to_nodegroup('nodegroup_dragonfly_antenna', singleton=False, type='GeometryNodeTree') def nodegroup_dragonfly_antenna(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/insects/parts/body/dragonfly_body.py b/infinigen/assets/creatures/insects/parts/body/dragonfly_body.py index a40dff84d..e0e0678a2 100644 --- a/infinigen/assets/creatures/insects/parts/body/dragonfly_body.py +++ b/infinigen/assets/creatures/insects/parts/body/dragonfly_body.py @@ -7,14 +7,14 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.insects.utils.geom_utils import nodegroup_circle_cross_section, nodegroup_surface_bump, nodegroup_random_rotation_scale, nodegroup_instance_on_points -from assets.insects.parts.hair.principled_hair import nodegroup_principled_hair -from assets.insects.utils.shader_utils import shader_black_w_noise_shader, nodegroup_add_noise, nodegroup_color_noise +from infinigen.assets.creatures.insects.utils.geom_utils import nodegroup_circle_cross_section, nodegroup_surface_bump, nodegroup_random_rotation_scale, nodegroup_instance_on_points +from infinigen.assets.creatures.insects.parts.hair.principled_hair import nodegroup_principled_hair +from infinigen.assets.creatures.insects.utils.shader_utils import shader_black_w_noise_shader, nodegroup_add_noise, nodegroup_color_noise def shader_dragonfly_body_shader(nw: NodeWrangler, base_color, v): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/creatures/insects/parts/eye/dragonfly_eye.py b/infinigen/assets/creatures/insects/parts/eye/dragonfly_eye.py index e6faedacb..bc0750e13 100644 --- a/infinigen/assets/creatures/insects/parts/eye/dragonfly_eye.py +++ b/infinigen/assets/creatures/insects/parts/eye/dragonfly_eye.py @@ -7,12 +7,12 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.insects.utils.shader_utils import nodegroup_color_noise +from infinigen.assets.creatures.insects.utils.shader_utils import nodegroup_color_noise def shader_dragonfly_eye_shader(nw: NodeWrangler, base_color, v): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/creatures/insects/parts/hair/principled_hair.py b/infinigen/assets/creatures/insects/parts/hair/principled_hair.py index 33e5ff792..0b219d7a7 100644 --- a/infinigen/assets/creatures/insects/parts/hair/principled_hair.py +++ b/infinigen/assets/creatures/insects/parts/hair/principled_hair.py @@ -7,12 +7,12 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.insects.utils.geom_utils import nodegroup_shape_quadratic, nodegroup_circle_cross_section +from infinigen.assets.creatures.insects.utils.geom_utils import nodegroup_shape_quadratic, nodegroup_circle_cross_section @node_utils.to_nodegroup('nodegroup_principled_hair', singleton=False, type='GeometryNodeTree') def nodegroup_principled_hair(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/insects/parts/head/dragonfly_head.py b/infinigen/assets/creatures/insects/parts/head/dragonfly_head.py index 556778c2b..abf0a82eb 100644 --- a/infinigen/assets/creatures/insects/parts/head/dragonfly_head.py +++ b/infinigen/assets/creatures/insects/parts/head/dragonfly_head.py @@ -7,17 +7,17 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.insects.utils.geom_utils import nodegroup_add_hair, nodegroup_attach_part, nodegroup_symmetric_clone, nodegroup_surface_bump -from assets.insects.parts.mouth.dragonfly_mouth import nodegroup_dragonfly_mouth -from assets.insects.parts.eye.dragonfly_eye import nodegroup_dragonfly_eye -from assets.insects.parts.antenna.dragonfly_antenna import nodegroup_dragonfly_antenna -from assets.insects.parts.hair.principled_hair import nodegroup_principled_hair -from assets.insects.utils.shader_utils import nodegroup_color_noise, shader_black_w_noise_shader +from infinigen.assets.creatures.insects.utils.geom_utils import nodegroup_add_hair, nodegroup_attach_part, nodegroup_symmetric_clone, nodegroup_surface_bump +from infinigen.assets.creatures.insects.parts.mouth.dragonfly_mouth import nodegroup_dragonfly_mouth +from infinigen.assets.creatures.insects.parts.eye.dragonfly_eye import nodegroup_dragonfly_eye +from infinigen.assets.creatures.insects.parts.antenna.dragonfly_antenna import nodegroup_dragonfly_antenna +from infinigen.assets.creatures.insects.parts.hair.principled_hair import nodegroup_principled_hair +from infinigen.assets.creatures.insects.utils.shader_utils import nodegroup_color_noise, shader_black_w_noise_shader def shader_dragonfly_head_shader(nw: NodeWrangler, base_color, v): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/creatures/insects/parts/leg/dragonfly_leg.py b/infinigen/assets/creatures/insects/parts/leg/dragonfly_leg.py index ad08251fb..6f76c5279 100644 --- a/infinigen/assets/creatures/insects/parts/leg/dragonfly_leg.py +++ b/infinigen/assets/creatures/insects/parts/leg/dragonfly_leg.py @@ -7,14 +7,14 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.insects.utils.shader_utils import shader_black_w_noise_shader -from assets.insects.utils.geom_utils import nodegroup_shape_quadratic, nodegroup_surface_bump -from assets.insects.parts.hair.principled_hair import nodegroup_principled_hair +from infinigen.assets.creatures.insects.utils.shader_utils import shader_black_w_noise_shader +from infinigen.assets.creatures.insects.utils.geom_utils import nodegroup_shape_quadratic, nodegroup_surface_bump +from infinigen.assets.creatures.insects.parts.hair.principled_hair import nodegroup_principled_hair @node_utils.to_nodegroup('nodegroup_leg_control', singleton=False, type='GeometryNodeTree') def nodegroup_leg_control(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/insects/parts/mouth/dragonfly_mouth.py b/infinigen/assets/creatures/insects/parts/mouth/dragonfly_mouth.py index 02c322be6..fa174e2a9 100644 --- a/infinigen/assets/creatures/insects/parts/mouth/dragonfly_mouth.py +++ b/infinigen/assets/creatures/insects/parts/mouth/dragonfly_mouth.py @@ -7,12 +7,12 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.insects.utils.geom_utils import nodegroup_simple_tube_v2 +from infinigen.assets.creatures.insects.utils.geom_utils import nodegroup_simple_tube_v2 @node_utils.to_nodegroup('nodegroup_dragonfly_mouth', singleton=False, type='GeometryNodeTree') def nodegroup_dragonfly_mouth(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/insects/parts/tail/dragonfly_tail.py b/infinigen/assets/creatures/insects/parts/tail/dragonfly_tail.py index f5ad1f92b..151bde3e0 100644 --- a/infinigen/assets/creatures/insects/parts/tail/dragonfly_tail.py +++ b/infinigen/assets/creatures/insects/parts/tail/dragonfly_tail.py @@ -7,13 +7,13 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.insects.utils.shader_utils import nodegroup_color_noise, nodegroup_add_noise -from assets.insects.utils.geom_utils import nodegroup_random_rotation_scale, nodegroup_circle_cross_section, nodegroup_shape_quadratic, nodegroup_surface_bump, nodegroup_instance_on_points +from infinigen.assets.creatures.insects.utils.shader_utils import nodegroup_color_noise, nodegroup_add_noise +from infinigen.assets.creatures.insects.utils.geom_utils import nodegroup_random_rotation_scale, nodegroup_circle_cross_section, nodegroup_shape_quadratic, nodegroup_surface_bump, nodegroup_instance_on_points def shader_dragonfly_tail_shader(nw: NodeWrangler, base_color, v, ring_length): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/creatures/insects/parts/wing/dragonfly_wing.py b/infinigen/assets/creatures/insects/parts/wing/dragonfly_wing.py index 472198d65..43b14b206 100644 --- a/infinigen/assets/creatures/insects/parts/wing/dragonfly_wing.py +++ b/infinigen/assets/creatures/insects/parts/wing/dragonfly_wing.py @@ -7,12 +7,12 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.insects.utils.shader_utils import nodegroup_add_noise +from infinigen.assets.creatures.insects.utils.shader_utils import nodegroup_add_noise @node_utils.to_nodegroup('nodegroup_dragonfly_wing', singleton=False, type='GeometryNodeTree') def nodegroup_dragonfly_wing(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/insects/utils/geom_utils.py b/infinigen/assets/creatures/insects/utils/geom_utils.py index de631ac0f..5673d863f 100644 --- a/infinigen/assets/creatures/insects/utils/geom_utils.py +++ b/infinigen/assets/creatures/insects/utils/geom_utils.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface @node_utils.to_nodegroup('nodegroup_symmetric_clone', singleton=False, type='GeometryNodeTree') def nodegroup_symmetric_clone(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/insects/utils/shader_utils.py b/infinigen/assets/creatures/insects/utils/shader_utils.py index 1bca13577..88d723661 100644 --- a/infinigen/assets/creatures/insects/utils/shader_utils.py +++ b/infinigen/assets/creatures/insects/utils/shader_utils.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def shader_black_w_noise_shader(nw: NodeWrangler): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/creatures/jellyfish.py b/infinigen/assets/creatures/jellyfish.py index 75b19f9bd..8b39e5bdb 100644 --- a/infinigen/assets/creatures/jellyfish.py +++ b/infinigen/assets/creatures/jellyfish.py @@ -13,22 +13,22 @@ from numpy.random import uniform from scipy.interpolate import interp1d -import util.blender as butil -from assets.creatures.animation.driver_repeated import repeated_driver -from assets.utils.nodegroup import geo_base_selection -from assets.utils.object import data2mesh, mesh2obj, new_circle, new_empty, new_icosphere, origin2highest -from assets.utils.decorate import assign_material, geo_extension, join_objects, read_co, remove_vertices, \ +import infinigen.core.util.blender as butil +from infinigen.assets.creatures.util.animation.driver_repeated import repeated_driver +from infinigen.assets.utils.nodegroup import geo_base_selection +from infinigen.assets.utils.object import data2mesh, mesh2obj, new_circle, new_empty, new_icosphere, origin2highest +from infinigen.assets.utils.decorate import assign_material, geo_extension, join_objects, read_co, remove_vertices, \ subsurface2face_size, write_attribute -from assets.utils.misc import log_uniform -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from placement.factory import AssetFactory -from surfaces import surface -from surfaces.surface import read_attr_data, shaderfunc_to_material, write_attr_data - -from util.blender import deep_clone_obj -from util.math import FixedSeed -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.misc import log_uniform +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.factory import AssetFactory +from infinigen.core import surface +from infinigen.core.surface import read_attr_data, shaderfunc_to_material, write_attr_data + +from infinigen.core.util.blender import deep_clone_obj +from infinigen.core.util.math import FixedSeed +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class JellyfishFactory(AssetFactory): diff --git a/infinigen/assets/creatures/parts/beak.py b/infinigen/assets/creatures/parts/beak.py index fd1e3890f..da77a65da 100644 --- a/infinigen/assets/creatures/parts/beak.py +++ b/infinigen/assets/creatures/parts/beak.py @@ -8,13 +8,13 @@ import numpy as np from math import sin, cos, pi, exp -from assets.creatures.creature import PartFactory, Part -from assets.creatures.genome import Joint, IKParams -from assets.creatures.util import part_util -from util import blender as butil +from infinigen.assets.creatures.util.creature import PartFactory, Part +from infinigen.assets.creatures.util.genome import Joint, IKParams +from infinigen.assets.creatures.util import part_util +from infinigen.core.util import blender as butil -from assets.creatures.geometry import nurbs as nurbs_util -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.creatures.util.geometry import nurbs as nurbs_util +from infinigen.assets.utils.tag import tag_object, tag_nodegroup def square(x): return x * x diff --git a/infinigen/assets/creatures/parts/body.py b/infinigen/assets/creatures/parts/body.py index c8a7e78c2..c8cd5d039 100644 --- a/infinigen/assets/creatures/parts/body.py +++ b/infinigen/assets/creatures/parts/body.py @@ -7,21 +7,21 @@ import numpy as np from numpy.random import normal as N, uniform -from assets.creatures import creature_util as cutil -from assets.creatures.creature import Part, PartFactory -from assets.creatures.geometry import nurbs +from infinigen.assets.creatures.util import creature_util as cutil +from infinigen.assets.creatures.util.creature import Part, PartFactory +from infinigen.assets.creatures.util.geometry import nurbs -from nodes import node_utils -from nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler -from assets.creatures.genome import Joint, IKParams -from assets.creatures.nodegroups.curve import nodegroup_polar_bezier, nodegroup_simple_tube_v2 -from assets.creatures.nodegroups.geometry import nodegroup_symmetric_clone -from assets.creatures.nodegroups.attach import nodegroup_surface_muscle +from infinigen.assets.creatures.util.genome import Joint, IKParams +from infinigen.assets.creatures.util.nodegroups.curve import nodegroup_polar_bezier, nodegroup_simple_tube_v2 +from infinigen.assets.creatures.util.nodegroups.geometry import nodegroup_symmetric_clone +from infinigen.assets.creatures.util.nodegroups.attach import nodegroup_surface_muscle -from assets.creatures.util import part_util -from assets.creatures.geometry import lofting, nurbs -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.creatures.util import part_util +from infinigen.assets.creatures.util.geometry import lofting, nurbs +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_quadruped_body', singleton=False, type='GeometryNodeTree') def nodegroup_quadruped_body(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/parts/chameleon.py b/infinigen/assets/creatures/parts/chameleon.py index 443374a04..4ebe8f924 100644 --- a/infinigen/assets/creatures/parts/chameleon.py +++ b/infinigen/assets/creatures/parts/chameleon.py @@ -8,20 +8,20 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface - -from assets.creatures.creature import PartFactory, Part -from assets.creatures.genome import Joint, IKParams -from assets.creatures.util import part_util -from util import blender as butil +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface + +from infinigen.assets.creatures.util.creature import PartFactory, Part +from infinigen.assets.creatures.util.genome import Joint, IKParams +from infinigen.assets.creatures.util import part_util +from infinigen.core.util import blender as butil from scipy.interpolate import interp1d -from assets.creatures.util.part_util import nodegroup_to_part +from infinigen.assets.creatures.util.part_util import nodegroup_to_part -from assets.creatures.geometry import nurbs as nurbs_util -from surfaces import surface +from infinigen.assets.creatures.util.geometry import nurbs as nurbs_util +from infinigen.core import surface import logging import numpy as np diff --git a/infinigen/assets/creatures/parts/crustacean/antenna.py b/infinigen/assets/creatures/parts/crustacean/antenna.py index 523ad93b3..6e0efce51 100644 --- a/infinigen/assets/creatures/parts/crustacean/antenna.py +++ b/infinigen/assets/creatures/parts/crustacean/antenna.py @@ -7,12 +7,12 @@ import numpy as np from numpy.random import uniform -from assets.creatures.animation.driver_repeated import bend_bones_lerp -from assets.creatures.creature import Part -from assets.creatures.genome import Joint -from assets.creatures.parts.crustacean.leg import CrabLegFactory -from assets.utils.decorate import displace_vertices, join_objects -from assets.utils.misc import log_uniform +from infinigen.assets.creatures.util.animation.driver_repeated import bend_bones_lerp +from infinigen.assets.creatures.util.creature import Part +from infinigen.assets.creatures.util.genome import Joint +from infinigen.assets.creatures.parts.crustacean.leg import CrabLegFactory +from infinigen.assets.utils.decorate import displace_vertices, join_objects +from infinigen.assets.utils.misc import log_uniform class LobsterAntennaFactory(CrabLegFactory): diff --git a/infinigen/assets/creatures/parts/crustacean/body.py b/infinigen/assets/creatures/parts/crustacean/body.py index 20b0df914..2acab889e 100644 --- a/infinigen/assets/creatures/parts/crustacean/body.py +++ b/infinigen/assets/creatures/parts/crustacean/body.py @@ -8,17 +8,17 @@ from numpy.random import uniform from scipy.interpolate import interp1d -from assets.creatures.creature import Part, PartFactory -from assets.creatures.parts.utils.draw import geo_symmetric_texture -from assets.utils.decorate import add_distance_to_boundary, displace_vertices, join_objects, read_co -from assets.utils.draw import leaf, spin -from assets.utils.misc import log_uniform -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from placement.placement import placeholder_locs -from surfaces import surface -from surfaces.surface import write_attr_data -from util import blender as butil +from infinigen.assets.creatures.util.creature import Part, PartFactory +from infinigen.assets.creatures.parts.utils.draw import geo_symmetric_texture +from infinigen.assets.utils.decorate import add_distance_to_boundary, displace_vertices, join_objects, read_co +from infinigen.assets.utils.draw import leaf, spin +from infinigen.assets.utils.misc import log_uniform +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.placement import placeholder_locs +from infinigen.core import surface +from infinigen.core.surface import write_attr_data +from infinigen.core.util import blender as butil class CrabBodyFactory(PartFactory): diff --git a/infinigen/assets/creatures/parts/crustacean/claw.py b/infinigen/assets/creatures/parts/crustacean/claw.py index 784df8eea..7b5d1199e 100644 --- a/infinigen/assets/creatures/parts/crustacean/claw.py +++ b/infinigen/assets/creatures/parts/crustacean/claw.py @@ -8,20 +8,20 @@ from numpy.random import uniform from scipy.interpolate import interp1d -from assets.creatures.animation.driver_repeated import bend_bones_lerp -from assets.creatures.creature import Part -from assets.creatures.genome import Joint -from assets.creatures.parts.crustacean.leg import CrabLegFactory -from assets.creatures.parts.utils.draw import decorate_segment -from assets.utils.decorate import displace_vertices, join_objects, read_co, remove_vertices -from assets.utils.draw import spin -from assets.utils.misc import log_uniform -from assets.utils.nodegroup import geo_base_selection -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from surfaces.surface import write_attr_data -from util import blender as butil +from infinigen.assets.creatures.util.animation.driver_repeated import bend_bones_lerp +from infinigen.assets.creatures.util.creature import Part +from infinigen.assets.creatures.util.genome import Joint +from infinigen.assets.creatures.parts.crustacean.leg import CrabLegFactory +from infinigen.assets.creatures.parts.utils.draw import decorate_segment +from infinigen.assets.utils.decorate import displace_vertices, join_objects, read_co, remove_vertices +from infinigen.assets.utils.draw import spin +from infinigen.assets.utils.misc import log_uniform +from infinigen.assets.utils.nodegroup import geo_base_selection +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.core.surface import write_attr_data +from infinigen.core.util import blender as butil class CrabClawFactory(CrabLegFactory): diff --git a/infinigen/assets/creatures/parts/crustacean/eye.py b/infinigen/assets/creatures/parts/crustacean/eye.py index 8f0a8836f..47a557bc4 100644 --- a/infinigen/assets/creatures/parts/crustacean/eye.py +++ b/infinigen/assets/creatures/parts/crustacean/eye.py @@ -8,10 +8,10 @@ import numpy as np from numpy.random import uniform -from assets.creatures.creature import Part, PartFactory -from assets.utils.decorate import join_objects -from assets.utils.object import new_icosphere, origin2leftmost -from placement.detail import remesh_with_attrs +from infinigen.assets.creatures.util.creature import Part, PartFactory +from infinigen.assets.utils.decorate import join_objects +from infinigen.assets.utils.object import new_icosphere, origin2leftmost +from infinigen.core.placement.detail import remesh_with_attrs class CrustaceanEyeFactory(PartFactory): diff --git a/infinigen/assets/creatures/parts/crustacean/fin.py b/infinigen/assets/creatures/parts/crustacean/fin.py index 7613fd40c..f4bb48e7c 100644 --- a/infinigen/assets/creatures/parts/crustacean/fin.py +++ b/infinigen/assets/creatures/parts/crustacean/fin.py @@ -7,10 +7,10 @@ import numpy as np from numpy.random import uniform -from assets.creatures.creature import Part, PartFactory -from assets.utils.draw import leaf -from surfaces.surface import write_attr_data -from util import blender as butil +from infinigen.assets.creatures.util.creature import Part, PartFactory +from infinigen.assets.utils.draw import leaf +from infinigen.core.surface import write_attr_data +from infinigen.core.util import blender as butil class CrustaceanFinFactory(PartFactory): diff --git a/infinigen/assets/creatures/parts/crustacean/leg.py b/infinigen/assets/creatures/parts/crustacean/leg.py index 91f06a61c..8208a834d 100644 --- a/infinigen/assets/creatures/parts/crustacean/leg.py +++ b/infinigen/assets/creatures/parts/crustacean/leg.py @@ -7,13 +7,13 @@ import numpy as np from numpy.random import uniform -from assets.creatures.animation.driver_repeated import bend_bones_lerp -from assets.creatures.creature import Part, PartFactory -from assets.creatures.genome import Joint -from assets.creatures.parts.utils.draw import make_segments -from assets.utils.decorate import join_objects, read_co -from assets.utils.misc import log_uniform -from surfaces.surface import write_attr_data +from infinigen.assets.creatures.util.animation.driver_repeated import bend_bones_lerp +from infinigen.assets.creatures.util.creature import Part, PartFactory +from infinigen.assets.creatures.util.genome import Joint +from infinigen.assets.creatures.parts.utils.draw import make_segments +from infinigen.assets.utils.decorate import join_objects, read_co +from infinigen.assets.utils.misc import log_uniform +from infinigen.core.surface import write_attr_data class CrabLegFactory(PartFactory): diff --git a/infinigen/assets/creatures/parts/crustacean/tail.py b/infinigen/assets/creatures/parts/crustacean/tail.py index 0ca29898b..f6fa88cae 100644 --- a/infinigen/assets/creatures/parts/crustacean/tail.py +++ b/infinigen/assets/creatures/parts/crustacean/tail.py @@ -8,13 +8,13 @@ from numpy.random import uniform from scipy.interpolate import interp1d -from assets.creatures.animation.driver_repeated import bend_bones_lerp -from assets.creatures.creature import Part, PartFactory -from assets.creatures.genome import Joint -from assets.creatures.parts.utils.draw import make_segments -from assets.utils.decorate import join_objects, read_co -from assets.utils.misc import log_uniform -from surfaces.surface import write_attr_data +from infinigen.assets.creatures.util.animation.driver_repeated import bend_bones_lerp +from infinigen.assets.creatures.util.creature import Part, PartFactory +from infinigen.assets.creatures.util.genome import Joint +from infinigen.assets.creatures.parts.utils.draw import make_segments +from infinigen.assets.utils.decorate import join_objects, read_co +from infinigen.assets.utils.misc import log_uniform +from infinigen.core.surface import write_attr_data class CrustaceanTailFactory(PartFactory): diff --git a/infinigen/assets/creatures/parts/eye.py b/infinigen/assets/creatures/parts/eye.py index e1c5303d7..4536fc11d 100644 --- a/infinigen/assets/creatures/parts/eye.py +++ b/infinigen/assets/creatures/parts/eye.py @@ -10,20 +10,20 @@ import numpy as np from numpy.random import uniform, normal as N, randint -from util.math import clip_gaussian -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface -from surfaces.surface_utils import nodegroup_norm_value, nodegroup_norm_vec +from infinigen.core.util.math import clip_gaussian +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface +from infinigen.assets.materials.utils.surface_utils import nodegroup_norm_value, nodegroup_norm_vec -from assets.creatures.nodegroups.curve import nodegroup_simple_tube, nodegroup_warped_circle_curve, nodegroup_smooth_taper, nodegroup_profile_part -from assets.creatures.nodegroups.math import nodegroup_aspect_to_dim +from infinigen.assets.creatures.util.nodegroups.curve import nodegroup_simple_tube, nodegroup_warped_circle_curve, nodegroup_smooth_taper, nodegroup_profile_part +from infinigen.assets.creatures.util.nodegroups.math import nodegroup_aspect_to_dim -from assets.creatures.creature import PartFactory -from assets.creatures.util import part_util -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.creatures.util.creature import PartFactory +from infinigen.assets.creatures.util import part_util +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_eyelid', singleton=True, type='GeometryNodeTree') def nodegroup_eyelid(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/parts/eye_new.py b/infinigen/assets/creatures/parts/eye_new.py index cabf01960..bd0a30552 100644 --- a/infinigen/assets/creatures/parts/eye_new.py +++ b/infinigen/assets/creatures/parts/eye_new.py @@ -8,17 +8,17 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform as U, normal as N, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.creatures.creature import PartFactory -from assets.creatures.util import part_util +from infinigen.assets.creatures.util.creature import PartFactory +from infinigen.assets.creatures.util import part_util @node_utils.to_nodegroup('nodegroup_circle', singleton=False, type='GeometryNodeTree') def nodegroup_circle(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/parts/fin_old.py b/infinigen/assets/creatures/parts/fin_old.py index 410a3202a..28913c1a1 100644 --- a/infinigen/assets/creatures/parts/fin_old.py +++ b/infinigen/assets/creatures/parts/fin_old.py @@ -9,17 +9,17 @@ import numpy as np from numpy.random import uniform, normal -from assets.creatures.genome import Joint, IKParams +from infinigen.assets.creatures.util.genome import Joint, IKParams -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from assets.creatures.nodegroups.curve import nodegroup_simple_tube_v2 -from assets.creatures.nodegroups.attach import nodegroup_attach_part +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.assets.creatures.util.nodegroups.curve import nodegroup_simple_tube_v2 +from infinigen.assets.creatures.util.nodegroups.attach import nodegroup_attach_part -from assets.creatures.creature import PartFactory -from assets.creatures.util.part_util import nodegroup_to_part -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.creatures.util.creature import PartFactory +from infinigen.assets.creatures.util.part_util import nodegroup_to_part +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_fish_fin', singleton=False, type='GeometryNodeTree') def nodegroup_fish_fin(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/parts/foot.py b/infinigen/assets/creatures/parts/foot.py index 8bb00b22f..e5df80357 100644 --- a/infinigen/assets/creatures/parts/foot.py +++ b/infinigen/assets/creatures/parts/foot.py @@ -9,17 +9,17 @@ import numpy as np from numpy.random import uniform, normal as N -from assets.creatures.genome import Joint, IKParams +from infinigen.assets.creatures.util.genome import Joint, IKParams -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from assets.creatures.nodegroups.curve import nodegroup_simple_tube, nodegroup_simple_tube_v2 -from assets.creatures.nodegroups.attach import nodegroup_surface_muscle, nodegroup_attach_part -from assets.creatures.nodegroups.math import nodegroup_deg2_rad +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.assets.creatures.util.nodegroups.curve import nodegroup_simple_tube, nodegroup_simple_tube_v2 +from infinigen.assets.creatures.util.nodegroups.attach import nodegroup_surface_muscle, nodegroup_attach_part +from infinigen.assets.creatures.util.nodegroups.math import nodegroup_deg2_rad -from assets.creatures.creature import Part, PartFactory -from assets.creatures.util.part_util import nodegroup_to_part -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.creatures.util.creature import Part, PartFactory +from infinigen.assets.creatures.util.part_util import nodegroup_to_part +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_tiger_toe', singleton=False, type='GeometryNodeTree') def nodegroup_tiger_toe(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/parts/generic_nurbs.py b/infinigen/assets/creatures/parts/generic_nurbs.py index 9e25d0b55..b3a08abab 100644 --- a/infinigen/assets/creatures/parts/generic_nurbs.py +++ b/infinigen/assets/creatures/parts/generic_nurbs.py @@ -9,23 +9,20 @@ import bpy from pathlib import Path import numpy as np +from infinigen.assets.creatures.util.creature import Part, PartFactory -from assets.creatures import creature_util as cutil -from assets.creatures.creature import Part, PartFactory -from assets.creatures.geometry import nurbs +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.assets.creatures.util.genome import Joint, IKParams +from infinigen.assets.creatures.util import part_util +from infinigen.assets.creatures.util.geometry import lofting -from assets.creatures.genome import Joint, IKParams -from assets.creatures.util import part_util -from assets.creatures.geometry import lofting, nurbs +from infinigen.core.util import blender as butil +from infinigen.core.util.logging import Suppress +from infinigen.assets.utils.tag import tag_object, tag_nodegroup -from util import blender as butil -from util.logging import Suppress -from assets.utils.tag import tag_object, tag_nodegroup - -NURBS_BASE_PATH = Path('assets/creatures/genomes/nurbs/') +NURBS_BASE_PATH = Path('infinigen/assets/creatures/parts/nurbs_data/') load_nurbs = lambda p: np.load(p)[..., :3] # strip W coordinate if present ALL_NURBS = {p.stem: load_nurbs(p) for p in NURBS_BASE_PATH.iterdir()} diff --git a/infinigen/assets/creatures/parts/head.py b/infinigen/assets/creatures/parts/head.py index eb535581a..e6f17d518 100644 --- a/infinigen/assets/creatures/parts/head.py +++ b/infinigen/assets/creatures/parts/head.py @@ -7,25 +7,23 @@ import bpy import numpy as np from numpy.random import uniform, normal as N, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface - -from util.math import clip_gaussian -from assets.creatures import creature_util as cutil - -from assets.creatures.genome import Joint, IKParams - -from assets.creatures.nodegroups.curve import nodegroup_simple_tube, nodegroup_polar_bezier, nodegroup_simple_tube_v2, nodegroup_warped_circle_curve -from assets.creatures.nodegroups.attach import nodegroup_surface_muscle, nodegroup_part_surface_simple, nodegroup_attach_part, nodegroup_smooth_taper, nodegroup_profile_part -from assets.creatures.nodegroups.geometry import nodegroup_solidify, nodegroup_symmetric_clone -from assets.creatures.nodegroups.math import nodegroup_deg2_rad - -from assets.creatures.creature import PartFactory -from assets.creatures.util import part_util -from assets.creatures.parts.eye import nodegroup_mammal_eye -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface + +from infinigen.core.util.math import clip_gaussian +from infinigen.assets.creatures.util.genome import Joint, IKParams + +from infinigen.assets.creatures.util.nodegroups.curve import nodegroup_simple_tube, nodegroup_polar_bezier, nodegroup_simple_tube_v2, nodegroup_warped_circle_curve +from infinigen.assets.creatures.util.nodegroups.attach import nodegroup_surface_muscle, nodegroup_part_surface_simple, nodegroup_attach_part, nodegroup_smooth_taper, nodegroup_profile_part +from infinigen.assets.creatures.util.nodegroups.geometry import nodegroup_solidify, nodegroup_symmetric_clone +from infinigen.assets.creatures.util.nodegroups.math import nodegroup_deg2_rad + +from infinigen.assets.creatures.util.creature import PartFactory +from infinigen.assets.creatures.util import part_util +from infinigen.assets.creatures.parts.eye import nodegroup_mammal_eye +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_carnivore_jaw', singleton=True, type='GeometryNodeTree') def nodegroup_carnivore_jaw(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/parts/head_detail.py b/infinigen/assets/creatures/parts/head_detail.py index 81166eed8..b342d7d6d 100644 --- a/infinigen/assets/creatures/parts/head_detail.py +++ b/infinigen/assets/creatures/parts/head_detail.py @@ -10,18 +10,18 @@ import numpy as np from numpy.random import normal as N, uniform as U -from assets.creatures.creature import PartFactory -from assets.creatures.genome import Joint, IKParams -from assets.creatures.util.part_util import nodegroup_to_part - -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from assets.creatures.nodegroups.curve import nodegroup_polar_bezier, nodegroup_simple_tube_v2 -from assets.creatures.nodegroups.attach import nodegroup_surface_muscle -from assets.creatures.nodegroups.geometry import nodegroup_solidify, nodegroup_symmetric_clone, nodegroup_taper -from util.math import clip_gaussian -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.creatures.util.creature import PartFactory +from infinigen.assets.creatures.util.genome import Joint, IKParams +from infinigen.assets.creatures.util.part_util import nodegroup_to_part + +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.assets.creatures.util.nodegroups.curve import nodegroup_polar_bezier, nodegroup_simple_tube_v2 +from infinigen.assets.creatures.util.nodegroups.attach import nodegroup_surface_muscle +from infinigen.assets.creatures.util.nodegroups.geometry import nodegroup_solidify, nodegroup_symmetric_clone, nodegroup_taper +from infinigen.core.util.math import clip_gaussian +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_cat_ear', singleton=False, type='GeometryNodeTree') def nodegroup_cat_ear(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/parts/hoof.py b/infinigen/assets/creatures/parts/hoof.py index 8320c0c77..16b379883 100644 --- a/infinigen/assets/creatures/parts/hoof.py +++ b/infinigen/assets/creatures/parts/hoof.py @@ -12,20 +12,20 @@ from math import sin, cos, pi, exp from numpy.random import uniform as U, normal as N -from assets.creatures.creature import PartFactory, Part -from assets.creatures.genome import Joint, IKParams -from assets.creatures.util import part_util -from util import blender as butil +from infinigen.assets.creatures.util.creature import PartFactory, Part +from infinigen.assets.creatures.util.genome import Joint, IKParams +from infinigen.assets.creatures.util import part_util +from infinigen.core.util import blender as butil -from assets.creatures.nodegroups.curve import nodegroup_simple_tube, nodegroup_simple_tube_v2 -from assets.creatures.nodegroups.attach import nodegroup_surface_muscle -from assets.creatures.util.part_util import nodegroup_to_part +from infinigen.assets.creatures.util.nodegroups.curve import nodegroup_simple_tube, nodegroup_simple_tube_v2 +from infinigen.assets.creatures.util.nodegroups.attach import nodegroup_surface_muscle +from infinigen.assets.creatures.util.part_util import nodegroup_to_part -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils -from assets.creatures.geometry import nurbs as nurbs_util -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.creatures.util.geometry import nurbs as nurbs_util +from infinigen.assets.utils.tag import tag_object, tag_nodegroup def square(x): return x * x diff --git a/infinigen/assets/creatures/parts/horn.py b/infinigen/assets/creatures/parts/horn.py index 93f54e2ba..615c8d0c9 100644 --- a/infinigen/assets/creatures/parts/horn.py +++ b/infinigen/assets/creatures/parts/horn.py @@ -13,15 +13,15 @@ import numpy as np from numpy.random import normal as N, uniform as U -from assets.creatures.creature import PartFactory -from assets.creatures.genome import Joint, IKParams -from assets.creatures.util.part_util import nodegroup_to_part -from assets.creatures.util import part_util +from infinigen.assets.creatures.util.creature import PartFactory +from infinigen.assets.creatures.util.genome import Joint, IKParams +from infinigen.assets.creatures.util.part_util import nodegroup_to_part +from infinigen.assets.creatures.util import part_util -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_noise', singleton=False, type='GeometryNodeTree') def nodegroup_noise(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/parts/leg.py b/infinigen/assets/creatures/parts/leg.py index 4df930ff0..2cf9a5d4a 100644 --- a/infinigen/assets/creatures/parts/leg.py +++ b/infinigen/assets/creatures/parts/leg.py @@ -10,18 +10,18 @@ import numpy as np from numpy.random import uniform as U, normal as N -from util.math import clip_gaussian +from infinigen.core.util.math import clip_gaussian -from assets.creatures.genome import Joint, IKParams +from infinigen.assets.creatures.util.genome import Joint, IKParams -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from assets.creatures.nodegroups.curve import nodegroup_simple_tube, nodegroup_simple_tube_v2 -from assets.creatures.nodegroups.attach import nodegroup_surface_muscle +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.assets.creatures.util.nodegroups.curve import nodegroup_simple_tube, nodegroup_simple_tube_v2 +from infinigen.assets.creatures.util.nodegroups.attach import nodegroup_surface_muscle -from assets.creatures.creature import PartFactory -from assets.creatures.util.part_util import nodegroup_to_part -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.creatures.util.creature import PartFactory +from infinigen.assets.creatures.util.part_util import nodegroup_to_part +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_quadruped_back_leg', singleton=False, type='GeometryNodeTree') def nodegroup_quadruped_back_leg(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/nurbs_data/body_bird_duck.npy b/infinigen/assets/creatures/parts/nurbs_data/body_bird_duck.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_bird_duck.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_bird_duck.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_bird_gull.npy b/infinigen/assets/creatures/parts/nurbs_data/body_bird_gull.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_bird_gull.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_bird_gull.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_bird_robin.npy b/infinigen/assets/creatures/parts/nurbs_data/body_bird_robin.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_bird_robin.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_bird_robin.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_feline_cheetah.npy b/infinigen/assets/creatures/parts/nurbs_data/body_feline_cheetah.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_feline_cheetah.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_feline_cheetah.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_feline_housecat.npy b/infinigen/assets/creatures/parts/nurbs_data/body_feline_housecat.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_feline_housecat.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_feline_housecat.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_feline_tiger.npy b/infinigen/assets/creatures/parts/nurbs_data/body_feline_tiger.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_feline_tiger.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_feline_tiger.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_feline_tiger_2.npy b/infinigen/assets/creatures/parts/nurbs_data/body_feline_tiger_2.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_feline_tiger_2.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_feline_tiger_2.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_feline_wolf.npy b/infinigen/assets/creatures/parts/nurbs_data/body_feline_wolf.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_feline_wolf.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_feline_wolf.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_fish_bluefish.npy b/infinigen/assets/creatures/parts/nurbs_data/body_fish_bluefish.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_fish_bluefish.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_fish_bluefish.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_fish_crappie.npy b/infinigen/assets/creatures/parts/nurbs_data/body_fish_crappie.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_fish_crappie.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_fish_crappie.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_fish_eel.npy b/infinigen/assets/creatures/parts/nurbs_data/body_fish_eel.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_fish_eel.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_fish_eel.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_fish_pickerel.npy b/infinigen/assets/creatures/parts/nurbs_data/body_fish_pickerel.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_fish_pickerel.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_fish_pickerel.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_fish_pufferfish.npy b/infinigen/assets/creatures/parts/nurbs_data/body_fish_pufferfish.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_fish_pufferfish.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_fish_pufferfish.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_fish_spadefish.npy b/infinigen/assets/creatures/parts/nurbs_data/body_fish_spadefish.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_fish_spadefish.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_fish_spadefish.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_herbivore_cow.npy b/infinigen/assets/creatures/parts/nurbs_data/body_herbivore_cow.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_herbivore_cow.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_herbivore_cow.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_herbivore_giraffe.npy b/infinigen/assets/creatures/parts/nurbs_data/body_herbivore_giraffe.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_herbivore_giraffe.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_herbivore_giraffe.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_herbivore_goat.npy b/infinigen/assets/creatures/parts/nurbs_data/body_herbivore_goat.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_herbivore_goat.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_herbivore_goat.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_herbivore_llama.npy b/infinigen/assets/creatures/parts/nurbs_data/body_herbivore_llama.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_herbivore_llama.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_herbivore_llama.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_insect_bee.npy b/infinigen/assets/creatures/parts/nurbs_data/body_insect_bee.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_insect_bee.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_insect_bee.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_insect_beetle.npy b/infinigen/assets/creatures/parts/nurbs_data/body_insect_beetle.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_insect_beetle.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_insect_beetle.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_insect_tarantula.npy b/infinigen/assets/creatures/parts/nurbs_data/body_insect_tarantula.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_insect_tarantula.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_insect_tarantula.npy diff --git a/infinigen/assets/creatures/nurbs_data/body_llama.npy b/infinigen/assets/creatures/parts/nurbs_data/body_llama.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/body_llama.npy rename to infinigen/assets/creatures/parts/nurbs_data/body_llama.npy diff --git a/infinigen/assets/creatures/nurbs_data/head_carnivore_tiger.npy b/infinigen/assets/creatures/parts/nurbs_data/head_carnivore_tiger.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/head_carnivore_tiger.npy rename to infinigen/assets/creatures/parts/nurbs_data/head_carnivore_tiger.npy diff --git a/infinigen/assets/creatures/nurbs_data/head_carnivore_wolf.npy b/infinigen/assets/creatures/parts/nurbs_data/head_carnivore_wolf.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/head_carnivore_wolf.npy rename to infinigen/assets/creatures/parts/nurbs_data/head_carnivore_wolf.npy diff --git a/infinigen/assets/creatures/nurbs_data/head_herbivore_cow.npy b/infinigen/assets/creatures/parts/nurbs_data/head_herbivore_cow.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/head_herbivore_cow.npy rename to infinigen/assets/creatures/parts/nurbs_data/head_herbivore_cow.npy diff --git a/infinigen/assets/creatures/nurbs_data/head_herbivore_giraffe.npy b/infinigen/assets/creatures/parts/nurbs_data/head_herbivore_giraffe.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/head_herbivore_giraffe.npy rename to infinigen/assets/creatures/parts/nurbs_data/head_herbivore_giraffe.npy diff --git a/infinigen/assets/creatures/nurbs_data/head_herbivore_goat.npy b/infinigen/assets/creatures/parts/nurbs_data/head_herbivore_goat.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/head_herbivore_goat.npy rename to infinigen/assets/creatures/parts/nurbs_data/head_herbivore_goat.npy diff --git a/infinigen/assets/creatures/nurbs_data/head_herbivore_llama.npy b/infinigen/assets/creatures/parts/nurbs_data/head_herbivore_llama.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/head_herbivore_llama.npy rename to infinigen/assets/creatures/parts/nurbs_data/head_herbivore_llama.npy diff --git a/infinigen/assets/creatures/nurbs_data/head_insect_beetle.npy b/infinigen/assets/creatures/parts/nurbs_data/head_insect_beetle.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/head_insect_beetle.npy rename to infinigen/assets/creatures/parts/nurbs_data/head_insect_beetle.npy diff --git a/infinigen/assets/creatures/nurbs_data/head_insect_wasp.npy b/infinigen/assets/creatures/parts/nurbs_data/head_insect_wasp.npy similarity index 100% rename from infinigen/assets/creatures/nurbs_data/head_insect_wasp.npy rename to infinigen/assets/creatures/parts/nurbs_data/head_insect_wasp.npy diff --git a/infinigen/assets/creatures/parts/reptile_detail.py b/infinigen/assets/creatures/parts/reptile_detail.py index 11b0d4c54..136ded6c0 100644 --- a/infinigen/assets/creatures/parts/reptile_detail.py +++ b/infinigen/assets/creatures/parts/reptile_detail.py @@ -9,14 +9,14 @@ import numpy as np from math import sin, cos, pi, exp, sqrt -from assets.creatures.creature import PartFactory, Part -from assets.creatures.genome import Joint, IKParams -from assets.creatures.util import part_util -from util import blender as butil +from infinigen.assets.creatures.util.creature import PartFactory, Part +from infinigen.assets.creatures.util.genome import Joint, IKParams +from infinigen.assets.creatures.util import part_util +from infinigen.core.util import blender as butil from scipy.interpolate import interp1d -from assets.creatures.geometry import nurbs as nurbs_util -from surfaces import surface +from infinigen.assets.creatures.util.geometry import nurbs as nurbs_util +from infinigen.core import surface logger = logging.getLogger(__name__) diff --git a/infinigen/assets/creatures/parts/ridged_fin.py b/infinigen/assets/creatures/parts/ridged_fin.py index 7d5b4c70b..df2ee929d 100644 --- a/infinigen/assets/creatures/parts/ridged_fin.py +++ b/infinigen/assets/creatures/parts/ridged_fin.py @@ -10,19 +10,19 @@ from numpy.random import uniform, normal import random -from assets.creatures.genome import Joint, IKParams +from infinigen.assets.creatures.util.genome import Joint, IKParams -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from surfaces.surface import set_geomod_inputs -from surfaces.surface_utils import clip, sample_range, sample_ratio +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.surface import set_geomod_inputs +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio -from assets.creatures.nodegroups.curve import nodegroup_simple_tube_v2 -from assets.creatures.nodegroups.attach import nodegroup_attach_part -from assets.creatures.creature import PartFactory, Part -from assets.creatures.util.part_util import nodegroup_to_part -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.creatures.util.nodegroups.curve import nodegroup_simple_tube_v2 +from infinigen.assets.creatures.util.nodegroups.attach import nodegroup_attach_part +from infinigen.assets.creatures.util.creature import PartFactory, Part +from infinigen.assets.creatures.util.part_util import nodegroup_to_part +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_mix2_values', singleton=True, type='GeometryNodeTree') def nodegroup_mix2_values(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/parts/tail.py b/infinigen/assets/creatures/parts/tail.py index 05b2f3cfe..78c088a4f 100644 --- a/infinigen/assets/creatures/parts/tail.py +++ b/infinigen/assets/creatures/parts/tail.py @@ -7,16 +7,16 @@ import numpy as np from numpy.random import normal as N -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils -from assets.creatures.genome import Joint, IKParams -from assets.creatures.nodegroups.curve import nodegroup_simple_tube_v2 -from assets.creatures.nodegroups.attach import nodegroup_surface_muscle +from infinigen.assets.creatures.util.genome import Joint, IKParams +from infinigen.assets.creatures.util.nodegroups.curve import nodegroup_simple_tube_v2 +from infinigen.assets.creatures.util.nodegroups.attach import nodegroup_surface_muscle -from assets.creatures.creature import PartFactory -from assets.creatures.util.part_util import nodegroup_to_part -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.creatures.util.creature import PartFactory +from infinigen.assets.creatures.util.part_util import nodegroup_to_part +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_tail', singleton=False, type='GeometryNodeTree') def nodegroup_tail(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/parts/utils/draw.py b/infinigen/assets/creatures/parts/utils/draw.py index f083e166e..44f022501 100644 --- a/infinigen/assets/creatures/parts/utils/draw.py +++ b/infinigen/assets/creatures/parts/utils/draw.py @@ -6,12 +6,12 @@ import numpy as np -from assets.utils.decorate import displace_vertices -from assets.utils.draw import spin -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from util import blender as butil +from infinigen.assets.utils.decorate import displace_vertices +from infinigen.assets.utils.draw import spin +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.core.util import blender as butil def make_segments(x_cuts, y_cuts, x_anchors, y_anchors, params): diff --git a/infinigen/assets/creatures/parts/wings.py b/infinigen/assets/creatures/parts/wings.py index ff656b193..779048f8d 100644 --- a/infinigen/assets/creatures/parts/wings.py +++ b/infinigen/assets/creatures/parts/wings.py @@ -11,20 +11,20 @@ import numpy as np from numpy.random import uniform as U, normal as N -from util.math import clip_gaussian +from infinigen.core.util.math import clip_gaussian -from assets.creatures.genome import Joint, IKParams +from infinigen.assets.creatures.util.genome import Joint, IKParams -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from assets.creatures.nodegroups.curve import nodegroup_simple_tube, nodegroup_simple_tube_v2 -from assets.creatures.nodegroups.attach import nodegroup_surface_muscle -from assets.creatures.nodegroups.math import nodegroup_deg2_rad -from assets.creatures.nodegroups.geometry import nodegroup_symmetric_clone +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.assets.creatures.util.nodegroups.curve import nodegroup_simple_tube, nodegroup_simple_tube_v2 +from infinigen.assets.creatures.util.nodegroups.attach import nodegroup_surface_muscle +from infinigen.assets.creatures.util.nodegroups.math import nodegroup_deg2_rad +from infinigen.assets.creatures.util.nodegroups.geometry import nodegroup_symmetric_clone -from assets.creatures.creature import PartFactory -from assets.creatures.util.part_util import nodegroup_to_part -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.creatures.util.creature import PartFactory +from infinigen.assets.creatures.util.part_util import nodegroup_to_part +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_feather', singleton=False, type='GeometryNodeTree') def nodegroup_feather(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/reptile.py b/infinigen/assets/creatures/reptile.py index 111de46e4..fa54a0aeb 100644 --- a/infinigen/assets/creatures/reptile.py +++ b/infinigen/assets/creatures/reptile.py @@ -15,39 +15,36 @@ import numpy as np from numpy.random import normal as N, uniform as U -from assets.creatures import genome -from assets.creatures.genome import Joint -from assets.creatures import parts +from infinigen.assets.creatures.util import genome +from infinigen.assets.creatures.util.genome import Joint +from infinigen.assets.creatures import parts -from assets.creatures.creature_util import euler +from infinigen.assets.creatures.util.creature_util import euler -import surfaces.templates.basic_bsdf -import surfaces.templates.spot_sparse_attr -import surfaces.templates.snake_scale -import surfaces.templates.snake_shaders -import surfaces.templates.bird -import surfaces.templates.scale +import infinigen.assets.materials.spot_sparse_attr +import infinigen.assets.materials.snake_scale +import infinigen.assets.materials.snake_shaders +import infinigen.assets.materials.bird +import infinigen.assets.materials.scale -from assets.creatures import creature, generate as creature_gen, animation as creature_animation -from assets.creatures import cloth_sim -from util import blender as butil +from infinigen.assets.creatures.util import creature, joining, animation as creature_animation +from infinigen.core.util import blender as butil -from surfaces.templates import bone, tongue, eyeball, nose, horn -from surfaces import surface +from infinigen.assets.materials import bone, tongue, eyeball, nose, horn +from infinigen.core import surface -from placement.factory import AssetFactory +from infinigen.core.placement.factory import AssetFactory -from assets.creatures import creature, generate as creature_gen -from assets.creatures import cloth_sim +from infinigen.assets.creatures.util import creature, joining -from util.math import clip_gaussian, FixedSeed -from util import blender as butil -from util.random import random_general +from infinigen.core.util.math import clip_gaussian, FixedSeed +from infinigen.core.util import blender as butil +from infinigen.core.util.random import random_general -from assets.creatures.animation import curve_slither -from placement import animation_policy +from infinigen.assets.creatures.util.animation import curve_slither +from infinigen.core.placement import animation_policy -from assets.creatures.animation.run_cycle import follow_path +from infinigen.assets.creatures.util.animation.run_cycle import follow_path def dinosaur(): @@ -118,7 +115,7 @@ def dinosaur(): postprocess_params=dict( animation=dict(), surface_registry=[ - (surfaces.templates.snake_scale, 1), + (assets.materials.snake_scale, 1), ] ) ) @@ -181,7 +178,7 @@ def lizard_genome(): postprocess_params=dict( anim=lizard_run_params(), surface_registry=[ - (surfaces.templates.snake_scale, 1), + (assets.materials.snake_scale, 1), ] ) ) @@ -230,7 +227,7 @@ def snake_genome(): postprocess_params=dict( anim=snake_swim_params(), surface_registry=[ - (surfaces.templates.snake_scale, 1), + (assets.materials.snake_scale, 1), ] ) ) @@ -246,7 +243,7 @@ def chameleon_genome(): postprocess_params=dict( anim=snake_swim_params(), surface_registry=[ - (surfaces.templates.snake_scale, 1), + (assets.materials.snake_scale, 1), ] ) ) @@ -307,7 +304,7 @@ def frog_genome(): speed_m_s=0.5 ), surface_registry=[ - (surfaces.templates.snake_scale, 1), + (assets.materials.snake_scale, 1), ] ) ) @@ -379,7 +376,7 @@ def animate_lizard_run(root, arma, params, ik_targets): def reptile_postprocessing(body_parts, extras, params): get_extras = lambda k: [o for o in extras if k in o.name] - main_template = surfaces.surface.registry.sample_registry(params['surface_registry']) + main_template = surface.registry.sample_registry(params['surface_registry']) body = body_parts + get_extras('BodyExtra') main_template.apply(body) @@ -390,7 +387,7 @@ def reptile_postprocessing(body_parts, extras, params): def chameleon_postprocessing(body_parts, extras, params): get_extras = lambda k: [o for o in extras if k in o.name] - main_template = surfaces.surface.registry.sample_registry(params['surface_registry']) + main_template = surface.registry.sample_registry(params['surface_registry']) body = body_parts + get_extras('BodyExtra') main_template.apply(body) @@ -409,7 +406,7 @@ def create_asset(self, i, animate=False, rigging=False, cloth=False, **kwargs): genome = lizard_genome() root, parts = creature.genome_to_creature(genome, name=f'lizard({self.factory_seed}, {i})') - joined, extras, arma, ik_targets = creature_gen.join_and_rig_parts(root, parts, genome, + joined, extras, arma, ik_targets = joining.join_and_rig_parts(root, parts, genome, postprocess_func=reptile_postprocessing, adapt_mode='remesh', rigging=rigging, **kwargs) if animate and arma is not None: pass @@ -434,7 +431,7 @@ def create_asset(self, i, animate=False, rigging=False, simulate=False, **kwargs genome = frog_genome() root, parts = creature.genome_to_creature(genome, name=f'frog({self.factory_seed}, {i})') - joined, extras, arma, ik_targets = creature_gen.join_and_rig_parts(root, parts, genome, + joined, extras, arma, ik_targets = joining.join_and_rig_parts(root, parts, genome, postprocess_func=reptile_postprocessing, adapt_mode='remesh', rigging=rigging, **kwargs) if animate and arma is not None: pass @@ -492,7 +489,7 @@ def create_asset(self, i, placeholder, **kwargs): genome = snake_genome() root, parts = creature.genome_to_creature(genome, name=f'snake({self.factory_seed}, {i})') - joined, extras, arma, ik_targets = creature_gen.join_and_rig_parts(root, parts, genome, + joined, extras, arma, ik_targets = joining.join_and_rig_parts(root, parts, genome, postprocess_func=reptile_postprocessing, adaptive_resolution=False, rigging=False, **kwargs) joined = butil.join_objects([joined] + extras) @@ -536,7 +533,7 @@ def create_asset(self, i, placeholder, **kwargs): genome = chameleon_genome() root, parts = creature.genome_to_creature(genome, name=f'snake({self.factory_seed}, {i})') - joined, extras, arma, ik_targets = creature_gen.join_and_rig_parts(root, parts, genome, + joined, extras, arma, ik_targets = joining.join_and_rig_parts(root, parts, genome, postprocess_func=reptile_postprocessing, adaptive_resolution=False, rigging=False, **kwargs) joined = butil.join_objects([joined] + extras) diff --git a/infinigen/core/surfaces/__init__.py b/infinigen/assets/creatures/util/animation/__init__.py similarity index 100% rename from infinigen/core/surfaces/__init__.py rename to infinigen/assets/creatures/util/animation/__init__.py diff --git a/infinigen/assets/creatures/util/animation/curve_slither.py b/infinigen/assets/creatures/util/animation/curve_slither.py index e4615c9a5..c515467d5 100644 --- a/infinigen/assets/creatures/util/animation/curve_slither.py +++ b/infinigen/assets/creatures/util/animation/curve_slither.py @@ -16,13 +16,13 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface import pdb -from util import blender as butil +from infinigen.core.util import blender as butil @node_utils.to_nodegroup('nodegroup_add_wiggles', singleton=True, type='GeometryNodeTree') def nodegroup_add_wiggles(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/util/animation/driver_repeated.py b/infinigen/assets/creatures/util/animation/driver_repeated.py index e77e1a0b5..0dfa58750 100644 --- a/infinigen/assets/creatures/util/animation/driver_repeated.py +++ b/infinigen/assets/creatures/util/animation/driver_repeated.py @@ -7,7 +7,7 @@ import numpy as np from numpy.random import uniform as U, uniform -from util.math import FixedSeed, int_hash +from infinigen.core.util.math import FixedSeed, int_hash def repeated_driver(start, end, freq, off=None, seed=None): diff --git a/infinigen/assets/creatures/util/animation/driver_wiggle.py b/infinigen/assets/creatures/util/animation/driver_wiggle.py index 5e3cdf4d1..db3cb80c3 100644 --- a/infinigen/assets/creatures/util/animation/driver_wiggle.py +++ b/infinigen/assets/creatures/util/animation/driver_wiggle.py @@ -15,9 +15,9 @@ import pdb -from assets.creatures import creature, creature_util as cutil -from util.math import clip_gaussian, randomspacing, lerp -from util import blender as butil +from infinigen.assets.creatures.util import creature, creature_util as cutil +from infinigen.core.util.math import clip_gaussian, randomspacing, lerp +from infinigen.core.util import blender as butil logger = logging.getLogger('creatures.animation') diff --git a/infinigen/assets/creatures/util/animation/idle.py b/infinigen/assets/creatures/util/animation/idle.py index 295d5daa8..7d9adac33 100644 --- a/infinigen/assets/creatures/util/animation/idle.py +++ b/infinigen/assets/creatures/util/animation/idle.py @@ -15,9 +15,9 @@ import pdb -from assets.creatures import creature, creature_util as cutil -from util.math import clip_gaussian, randomspacing, lerp -from util import blender as butil +from infinigen.assets.creatures.util import creature, creature_util as cutil +from infinigen.core.util.math import clip_gaussian, randomspacing, lerp +from infinigen.core.util import blender as butil def compute_ik_length_height(targets): bounds = [] diff --git a/infinigen/assets/creatures/util/animation/run_cycle.py b/infinigen/assets/creatures/util/animation/run_cycle.py index c62025b69..627843f79 100644 --- a/infinigen/assets/creatures/util/animation/run_cycle.py +++ b/infinigen/assets/creatures/util/animation/run_cycle.py @@ -17,9 +17,9 @@ import pdb -from assets.creatures import creature, creature_util as cutil -from util.math import clip_gaussian, randomspacing, lerp -from util import blender as butil +from infinigen.assets.creatures.util import creature, creature_util as cutil +from infinigen.core.util.math import clip_gaussian, randomspacing, lerp +from infinigen.core.util import blender as butil logger = logging.getLogger('creatures.animation') diff --git a/infinigen/assets/creatures/util/boid_swarm.py b/infinigen/assets/creatures/util/boid_swarm.py index f884e9ee0..25e64b14a 100644 --- a/infinigen/assets/creatures/util/boid_swarm.py +++ b/infinigen/assets/creatures/util/boid_swarm.py @@ -12,12 +12,12 @@ import numpy as np from numpy.random import uniform as U, normal as N -from placement.factory import AssetFactory -from placement import particles, animation_policy +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.placement import particles, animation_policy -from util import blender as butil -from util.math import FixedSeed -from util.random import random_general +from infinigen.core.util import blender as butil +from infinigen.core.util.math import FixedSeed +from infinigen.core.util.random import random_general logger = logging.getLogger('boids') diff --git a/infinigen/assets/creatures/util/cloth_sim.py b/infinigen/assets/creatures/util/cloth_sim.py index de4d591a9..8d4d7d867 100644 --- a/infinigen/assets/creatures/util/cloth_sim.py +++ b/infinigen/assets/creatures/util/cloth_sim.py @@ -12,12 +12,12 @@ import bpy -from surfaces.surface import attribute_to_vertex_group +from infinigen.core.surface import attribute_to_vertex_group -from util import blender as butil -from util.math import dict_convex_comb -from util.logging import Timer -from nodes.node_wrangler import NodeWrangler, Nodes +from infinigen.core.util import blender as butil +from infinigen.core.util.math import dict_convex_comb +from infinigen.core.util.logging import Timer +from infinigen.core.nodes.node_wrangler import NodeWrangler, Nodes logger = logging.getLogger('cloth') diff --git a/infinigen/assets/creatures/util/creature.py b/infinigen/assets/creatures/util/creature.py index dac704bcb..e35fff702 100644 --- a/infinigen/assets/creatures/util/creature.py +++ b/infinigen/assets/creatures/util/creature.py @@ -16,18 +16,18 @@ import numpy as np -from assets.creatures.geometry import lofting, skin_ops -from assets.creatures.creature_util import interp_dict, euler -from assets.creatures import genome -from assets.creatures.util import tree, join_smoothing - -from assets.creatures import genome - -from surfaces import surface -from placement import detail -from util import blender as butil, logging as logging_util -from util.math import homogenize, lerp_sample, lerp -from nodes.node_wrangler import Nodes +from infinigen.assets.creatures.util.geometry import lofting, skin_ops +from infinigen.assets.creatures.util.creature_util import interp_dict, euler +from infinigen.assets.creatures.util import genome +from infinigen.assets.creatures.util import tree, join_smoothing + +from infinigen.assets.creatures.util import genome + +from infinigen.core import surface +from infinigen.core.placement import detail +from infinigen.core.util import blender as butil, logging as logging_util +from infinigen.core.util.math import homogenize, lerp_sample, lerp +from infinigen.core.nodes.node_wrangler import Nodes logger = logging.getLogger('creatures') diff --git a/infinigen/assets/creatures/util/creature_parser.py b/infinigen/assets/creatures/util/creature_parser.py index 1519458f7..5f6560432 100644 --- a/infinigen/assets/creatures/util/creature_parser.py +++ b/infinigen/assets/creatures/util/creature_parser.py @@ -9,14 +9,14 @@ import numpy as np -from util import blender as butil -from nodes.node_transpiler.transpiler import transpile, indent -from assets.creatures.geometry import lofting +from infinigen.core.util import blender as butil +from infinigen.core.nodes.node_transpiler.transpiler import transpile, indent +from infinigen.assets.creatures.util.geometry import lofting def prefix(): return ( "import numpy as np\n" - "from assets.creatures.creature import CreatureGenome, PartGenome, Attachment, Joint\n" + "from infinigen.assets.creatures.util.creature import CreatureGenome, PartGenome, Attachment, Joint\n" ) def repr_np_array(v): @@ -130,12 +130,12 @@ def parse_creature(nurbs_root, mesh_root, profiles_folder): if mesh_part.parent is not None: atts[name] = parse_attachment(mesh_part, mesh_part.parent, nurbs_part.parent) - creature_genome_args = { + joiningome_args = { 'parts': repr_function_call('dict', {name: f'{name}()' for name in names}), 'attachments': repr_function_call('dict', atts) } - body = f"return {repr_function_call('CreatureGenome', creature_genome_args)}" + body = f"return {repr_function_call('CreatureGenome', joiningome_args)}" code += f"def creature():\n {indent(body)}" return code diff --git a/infinigen/assets/creatures/util/creature_util.py b/infinigen/assets/creatures/util/creature_util.py index b5831abec..4335874bd 100644 --- a/infinigen/assets/creatures/util/creature_util.py +++ b/infinigen/assets/creatures/util/creature_util.py @@ -13,8 +13,8 @@ import numpy as np -from util.math import lerp -from util import blender as butil +from infinigen.core.util.math import lerp +from infinigen.core.util import blender as butil def euler(r, p, y): return mathutils.Euler(np.deg2rad([r, p, y])).to_quaternion() diff --git a/infinigen/assets/creatures/util/genome.py b/infinigen/assets/creatures/util/genome.py index 110f60297..61116795c 100644 --- a/infinigen/assets/creatures/util/genome.py +++ b/infinigen/assets/creatures/util/genome.py @@ -14,10 +14,10 @@ from scipy.sparse.csgraph import maximum_bipartite_matching from scipy.sparse import csr_matrix -from assets.creatures.util.tree import Tree -from assets.creatures.creature_util import interp_dict +from infinigen.assets.creatures.util.tree import Tree +from infinigen.assets.creatures.util.creature_util import interp_dict -from util.math import lerp +from infinigen.core.util.math import lerp @dataclass diff --git a/infinigen/assets/creatures/util/geometry/blending.py b/infinigen/assets/creatures/util/geometry/blending.py index 8c918615d..966820327 100644 --- a/infinigen/assets/creatures/util/geometry/blending.py +++ b/infinigen/assets/creatures/util/geometry/blending.py @@ -17,14 +17,14 @@ import mathutils from geomdl import NURBS -from util.math import rotate_match_directions, normalize, project_to_unit_vector -from util.math import wrap_around_cyclic_coord, new_domain_from_affine, affine_from_new_domain -from util.math import FixedSeed -from util import blender as butil - -from assets.creatures.geometry.nurbs import blender_mesh_from_pydata, compute_cylinder_topology -from assets.creatures.geometry import nurbs -from assets.creatures.geometry import nurbs, lofting, skin_ops +from infinigen.core.util.math import rotate_match_directions, normalize, project_to_unit_vector +from infinigen.core.util.math import wrap_around_cyclic_coord, new_domain_from_affine, affine_from_new_domain +from infinigen.core.util.math import FixedSeed +from infinigen.core.util import blender as butil + +from infinigen.assets.creatures.geometry.nurbs import blender_mesh_from_pydata, compute_cylinder_topology +from infinigen.assets.creatures.geometry import nurbs +from infinigen.assets.creatures.geometry import nurbs, lofting, skin_ops from shapely.geometry import Polygon, Point, LineString import shapely diff --git a/infinigen/assets/creatures/util/geometry/cpp_utils/__init__.py b/infinigen/assets/creatures/util/geometry/cpp_utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/infinigen/assets/creatures/util/geometry/curve.py b/infinigen/assets/creatures/util/geometry/curve.py index 18c47f238..8c2f8fa2f 100644 --- a/infinigen/assets/creatures/util/geometry/curve.py +++ b/infinigen/assets/creatures/util/geometry/curve.py @@ -6,7 +6,7 @@ import bpy -from util import blender as butil +from infinigen.core.util import blender as butil class Curve: diff --git a/infinigen/assets/creatures/util/geometry/lofting.py b/infinigen/assets/creatures/util/geometry/lofting.py index ce6251b69..0cdc9f28e 100644 --- a/infinigen/assets/creatures/util/geometry/lofting.py +++ b/infinigen/assets/creatures/util/geometry/lofting.py @@ -12,10 +12,9 @@ import numpy as np -from util import blender as butil -from util.math import rotate_match_directions, lerp_sample, inverse_interpolate +from infinigen.core.util import blender as butil +from infinigen.core.util.math import rotate_match_directions, lerp_sample, inverse_interpolate from .nurbs import nurbs -from assets.creatures.geometry.cpp_utils import bnurbs def factorize_nurbs_handles(handles): diff --git a/infinigen/assets/creatures/util/geometry/metaballs.py b/infinigen/assets/creatures/util/geometry/metaballs.py index f102a39c6..4ad38f671 100644 --- a/infinigen/assets/creatures/util/geometry/metaballs.py +++ b/infinigen/assets/creatures/util/geometry/metaballs.py @@ -10,7 +10,7 @@ import numpy as np -from util import blender as butil +from infinigen.core.util import blender as butil class MBallStructure: diff --git a/infinigen/assets/creatures/util/geometry/nurbs.py b/infinigen/assets/creatures/util/geometry/nurbs.py index 78d4f2117..809b42bba 100644 --- a/infinigen/assets/creatures/util/geometry/nurbs.py +++ b/infinigen/assets/creatures/util/geometry/nurbs.py @@ -12,9 +12,9 @@ from geomdl import NURBS, knotvector import numpy as np -from util import blender as butil -from util.math import randomspacing -from .cpp_utils import bnurbs +from infinigen.core.util import blender as butil +from infinigen.core.util.math import randomspacing +import bnurbs def compute_cylinder_topology(n: int, m: int, uvs=False, cyclic=True, h_neighbors=None): diff --git a/infinigen/assets/creatures/util/geometry/skin_ops.py b/infinigen/assets/creatures/util/geometry/skin_ops.py index c8b85ba03..39697ebaa 100644 --- a/infinigen/assets/creatures/util/geometry/skin_ops.py +++ b/infinigen/assets/creatures/util/geometry/skin_ops.py @@ -11,9 +11,9 @@ import numpy as np from numpy.random import uniform, normal -from assets.creatures.geometry.lofting import Skin -from util.math import lerp, randomspacing -from assets.creatures.geometry import lofting +from infinigen.assets.creatures.util.geometry.lofting import Skin +from infinigen.core.util.math import lerp, randomspacing +from infinigen.assets.creatures.util.geometry import lofting def extend_cap(skin: Skin, r=1, margin=0): res = copy(skin) diff --git a/infinigen/assets/creatures/util/geonode_part.py b/infinigen/assets/creatures/util/geonode_part.py index 1f518f8a7..9c420aa79 100644 --- a/infinigen/assets/creatures/util/geonode_part.py +++ b/infinigen/assets/creatures/util/geonode_part.py @@ -9,10 +9,10 @@ import numpy as np -from assets.creatures.creature import Part, Joint, infer_skeleton_from_mesh -from util import blender as butil +from infinigen.assets.creatures.util.creature import Part, Joint, infer_skeleton_from_mesh +from infinigen.core.util import blender as butil -from nodes.node_wrangler import NodeWrangler, Nodes, geometry_node_group_empty_new +from infinigen.core.nodes.node_wrangler import NodeWrangler, Nodes, geometry_node_group_empty_new def extract_nodegroup_geo(target_obj, nodegroup, k, ng_params=None): diff --git a/infinigen/assets/creatures/util/hair.py b/infinigen/assets/creatures/util/hair.py index 8427a082b..e2dfa2aa1 100644 --- a/infinigen/assets/creatures/util/hair.py +++ b/infinigen/assets/creatures/util/hair.py @@ -15,12 +15,12 @@ import numpy as np from scipy.spatial import KDTree -from util import blender as butil -from surfaces import surface -from nodes.node_wrangler import NodeWrangler, Nodes -from nodes import node_utils +from infinigen.core.util import blender as butil +from infinigen.core import surface +from infinigen.core.nodes.node_wrangler import NodeWrangler, Nodes +from infinigen.core.nodes import node_utils -from assets.creatures.nodegroups.hair import nodegroup_comb_direction, nodegroup_duplicate_to_clumps, \ +from infinigen.assets.creatures.util.nodegroups.hair import nodegroup_comb_direction, nodegroup_duplicate_to_clumps, \ nodegroup_hair_position, nodegroup_comb_hairs, nodegroup_strand_noise, nodegroup_hair_length_rescale, \ nodegroup_snap_roots_to_surface diff --git a/infinigen/assets/creatures/util/join_smoothing.py b/infinigen/assets/creatures/util/join_smoothing.py index 296d2022c..2a480f9da 100644 --- a/infinigen/assets/creatures/util/join_smoothing.py +++ b/infinigen/assets/creatures/util/join_smoothing.py @@ -11,9 +11,9 @@ from mathutils.bvhtree import BVHTree from mathutils import geometry, Vector -from util import blender as butil +from infinigen.core.util import blender as butil -from assets.creatures.geometry.nurbs import compute_cylinder_topology, blender_mesh_from_pydata +from infinigen.assets.creatures.util.geometry.nurbs import compute_cylinder_topology, blender_mesh_from_pydata import numpy as np diff --git a/infinigen/assets/creatures/util/joining.py b/infinigen/assets/creatures/util/joining.py index 6c21d061c..8d550b40b 100644 --- a/infinigen/assets/creatures/util/joining.py +++ b/infinigen/assets/creatures/util/joining.py @@ -9,14 +9,14 @@ import numpy as np -from assets.creatures.util import tree, join_smoothing +from infinigen.assets.creatures.util import tree, join_smoothing -from assets.creatures import rigging as creature_rigging +from infinigen.assets.creatures.util import rigging as creature_rigging -from surfaces import surface -from placement import detail -from util import blender as butil -from util.logging import Suppress, Timer +from infinigen.core import surface +from infinigen.core.placement import detail +from infinigen.core.util import blender as butil +from infinigen.core.util.logging import Suppress, Timer logger = logging.getLogger('creatures') diff --git a/infinigen/assets/creatures/util/nodegroups/attach.py b/infinigen/assets/creatures/util/nodegroups/attach.py index 7be59bd82..54241f32a 100644 --- a/infinigen/assets/creatures/util/nodegroups/attach.py +++ b/infinigen/assets/creatures/util/nodegroups/attach.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface from .math import nodegroup_deg2_rad from .curve import nodegroup_warped_circle_curve, nodegroup_smooth_taper, nodegroup_profile_part diff --git a/infinigen/assets/creatures/util/nodegroups/curve.py b/infinigen/assets/creatures/util/nodegroups/curve.py index 100c6c633..e812f98c2 100644 --- a/infinigen/assets/creatures/util/nodegroups/curve.py +++ b/infinigen/assets/creatures/util/nodegroups/curve.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface from .math import nodegroup_polar_to_cart, nodegroup_aspect_to_dim, nodegroup_vector_sum, nodegroup_switch4 @node_utils.to_nodegroup('nodegroup_simple_tube', singleton=True, type='GeometryNodeTree') diff --git a/infinigen/assets/creatures/util/nodegroups/geometry.py b/infinigen/assets/creatures/util/nodegroups/geometry.py index 6898e4335..af41451bf 100644 --- a/infinigen/assets/creatures/util/nodegroups/geometry.py +++ b/infinigen/assets/creatures/util/nodegroups/geometry.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface @node_utils.to_nodegroup('nodegroup_symmetric_instance', singleton=True, type='GeometryNodeTree') def nodegroup_symmetric_instance(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/util/nodegroups/hair.py b/infinigen/assets/creatures/util/nodegroups/hair.py index c0589fd08..aa2c03de2 100644 --- a/infinigen/assets/creatures/util/nodegroups/hair.py +++ b/infinigen/assets/creatures/util/nodegroups/hair.py @@ -7,12 +7,12 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.creatures.nodegroups.math import nodegroup_vector_bezier +from infinigen.assets.creatures.util.nodegroups.math import nodegroup_vector_bezier @node_utils.to_nodegroup('nodegroup_comb_direction', singleton=True, type='GeometryNodeTree') def nodegroup_comb_direction(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/util/nodegroups/math.py b/infinigen/assets/creatures/util/nodegroups/math.py index f09d38646..49e55c8f2 100644 --- a/infinigen/assets/creatures/util/nodegroups/math.py +++ b/infinigen/assets/creatures/util/nodegroups/math.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface @node_utils.to_nodegroup('nodegroup_floor_ceil', singleton=False, type='GeometryNodeTree') def nodegroup_floor_ceil(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/util/nodegroups/sculpt_v1.py b/infinigen/assets/creatures/util/nodegroups/sculpt_v1.py index de0c82acd..2a830bdb8 100644 --- a/infinigen/assets/creatures/util/nodegroups/sculpt_v1.py +++ b/infinigen/assets/creatures/util/nodegroups/sculpt_v1.py @@ -7,13 +7,13 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.creatures.nodegroups.math import nodegroup_floor_ceil, nodegroup_clamp_or_wrap -from assets.creatures.nodegroups.geometry import nodegroup_symmetric_clone +from infinigen.assets.creatures.util.nodegroups.math import nodegroup_floor_ceil, nodegroup_clamp_or_wrap +from infinigen.assets.creatures.util.nodegroups.geometry import nodegroup_symmetric_clone @node_utils.to_nodegroup('nodegroup_u_v_param_to_vert_idxs', singleton=False, type='GeometryNodeTree') def nodegroup_u_v_param_to_vert_idxs(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/util/nodegroups/shader.py b/infinigen/assets/creatures/util/nodegroups/shader.py index 7e751d7c6..3ad201e1a 100644 --- a/infinigen/assets/creatures/util/nodegroups/shader.py +++ b/infinigen/assets/creatures/util/nodegroups/shader.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform as U, normal as N, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface @node_utils.to_nodegroup('nodegroup_norm_local_pos', singleton=True, type='ShaderNodeTree') def nodegroup_norm_local_pos(nw: NodeWrangler): diff --git a/infinigen/assets/creatures/util/part_util.py b/infinigen/assets/creatures/util/part_util.py index d0c621f58..6192e4b85 100644 --- a/infinigen/assets/creatures/util/part_util.py +++ b/infinigen/assets/creatures/util/part_util.py @@ -11,11 +11,11 @@ import bpy import numpy as np -from assets.creatures.creature import Part, PartFactory, infer_skeleton_from_mesh -from assets.creatures.geometry import nurbs -from util import blender as butil +from infinigen.assets.creatures.util.creature import Part, PartFactory, infer_skeleton_from_mesh +from infinigen.assets.creatures.util.geometry import nurbs +from infinigen.core.util import blender as butil -from nodes.node_wrangler import NodeWrangler, Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler, Nodes def extract_nodegroup_geo(target_obj, nodegroup, k, ng_params=None): diff --git a/infinigen/assets/creatures/util/rigging.py b/infinigen/assets/creatures/util/rigging.py index af487d9f7..080cbf191 100644 --- a/infinigen/assets/creatures/util/rigging.py +++ b/infinigen/assets/creatures/util/rigging.py @@ -14,10 +14,10 @@ import numpy as np from tqdm import tqdm -from util import blender as butil, math as mutil -from assets.creatures.util import tree -from assets.creatures.creature import Part, infer_skeleton_from_mesh -from assets.creatures.genome import Joint, IKParams +from infinigen.core.util import blender as butil, math as mutil +from infinigen.assets.creatures.util import tree +from infinigen.assets.creatures.util.creature import Part, infer_skeleton_from_mesh +from infinigen.assets.creatures.util.genome import Joint, IKParams logger = logging.getLogger() diff --git a/infinigen/assets/deformed_trees/base.py b/infinigen/assets/deformed_trees/base.py index 756a0b8b4..039d41d0b 100644 --- a/infinigen/assets/deformed_trees/base.py +++ b/infinigen/assets/deformed_trees/base.py @@ -8,15 +8,15 @@ from numpy.random import uniform -from assets.trees import TreeFactory -from assets.trees.generate import GenericTreeFactory, random_species -from assets.utils.misc import log_uniform -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from placement.factory import AssetFactory -from surfaces import surface -from surfaces.surface import NoApply -from util.math import FixedSeed +from infinigen.assets.trees import TreeFactory +from infinigen.assets.trees.generate import GenericTreeFactory, random_species +from infinigen.assets.utils.misc import log_uniform +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.factory import AssetFactory +from infinigen.core import surface +from infinigen.core.surface import NoApply +from infinigen.core.util.math import FixedSeed class BaseDeformedTreeFactory(AssetFactory): diff --git a/infinigen/assets/deformed_trees/fallen.py b/infinigen/assets/deformed_trees/fallen.py index 09e9ea1aa..a8c592aa7 100644 --- a/infinigen/assets/deformed_trees/fallen.py +++ b/infinigen/assets/deformed_trees/fallen.py @@ -9,15 +9,15 @@ import numpy as np from numpy.random import uniform -from assets.deformed_trees.base import BaseDeformedTreeFactory -from assets.utils.decorate import assign_material, join_objects, remove_vertices, separate_loose -from assets.utils.draw import cut_plane -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from util.blender import deep_clone_obj -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.deformed_trees.base import BaseDeformedTreeFactory +from infinigen.assets.utils.decorate import assign_material, join_objects, remove_vertices, separate_loose +from infinigen.assets.utils.draw import cut_plane +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.core.util.blender import deep_clone_obj +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class FallenTreeFactory(BaseDeformedTreeFactory): diff --git a/infinigen/assets/deformed_trees/generate.py b/infinigen/assets/deformed_trees/generate.py index e195e52a6..f18c79303 100644 --- a/infinigen/assets/deformed_trees/generate.py +++ b/infinigen/assets/deformed_trees/generate.py @@ -6,11 +6,11 @@ import numpy as np -from assets.deformed_trees import FallenTreeFactory, HollowTreeFactory, RottenTreeFactory -from assets.deformed_trees.truncated import TruncatedTreeFactory -from placement.factory import AssetFactory -from util.math import FixedSeed -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.deformed_trees import FallenTreeFactory, HollowTreeFactory, RottenTreeFactory +from infinigen.assets.deformed_trees.truncated import TruncatedTreeFactory +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util.math import FixedSeed +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class DeformedTreeFactory(AssetFactory): diff --git a/infinigen/assets/deformed_trees/hollow.py b/infinigen/assets/deformed_trees/hollow.py index cbcfe9613..e0e7aeddf 100644 --- a/infinigen/assets/deformed_trees/hollow.py +++ b/infinigen/assets/deformed_trees/hollow.py @@ -8,15 +8,15 @@ import numpy as np from numpy.random import uniform -from assets.deformed_trees.base import BaseDeformedTreeFactory -from assets.utils.decorate import assign_material, join_objects, read_material_index, write_material_index -from assets.utils.nodegroup import geo_selection -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from util.blender import deep_clone_obj -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.deformed_trees.base import BaseDeformedTreeFactory +from infinigen.assets.utils.decorate import assign_material, join_objects, read_material_index, write_material_index +from infinigen.assets.utils.nodegroup import geo_selection +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.core.util.blender import deep_clone_obj +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class HollowTreeFactory(BaseDeformedTreeFactory): diff --git a/infinigen/assets/deformed_trees/rotten.py b/infinigen/assets/deformed_trees/rotten.py index 7787e770e..93a956751 100644 --- a/infinigen/assets/deformed_trees/rotten.py +++ b/infinigen/assets/deformed_trees/rotten.py @@ -8,17 +8,17 @@ import numpy as np from numpy.random import uniform -from assets.deformed_trees.base import BaseDeformedTreeFactory -from assets.utils.decorate import assign_material, join_objects, read_material_index, remove_vertices, \ +from infinigen.assets.deformed_trees.base import BaseDeformedTreeFactory +from infinigen.assets.utils.decorate import assign_material, join_objects, read_material_index, remove_vertices, \ separate_loose, write_material_index -from assets.utils.misc import log_uniform -from assets.utils.object import new_icosphere -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from util.blender import deep_clone_obj -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.misc import log_uniform +from infinigen.assets.utils.object import new_icosphere +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.core.util.blender import deep_clone_obj +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class RottenTreeFactory(BaseDeformedTreeFactory): @staticmethod diff --git a/infinigen/assets/deformed_trees/truncated.py b/infinigen/assets/deformed_trees/truncated.py index 0727f621d..42dc5bdef 100644 --- a/infinigen/assets/deformed_trees/truncated.py +++ b/infinigen/assets/deformed_trees/truncated.py @@ -7,13 +7,13 @@ import numpy as np from numpy.random import uniform -from assets.deformed_trees import FallenTreeFactory -from assets.utils.decorate import read_co -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.deformed_trees import FallenTreeFactory +from infinigen.assets.utils.decorate import read_co +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class TruncatedTreeFactory(FallenTreeFactory): diff --git a/infinigen/assets/fluid/__init__.py b/infinigen/assets/fluid/__init__.py index e69de29bb..ba4bdefd2 100644 --- a/infinigen/assets/fluid/__init__.py +++ b/infinigen/assets/fluid/__init__.py @@ -0,0 +1 @@ +from .fluid_scenecomp_additions import cached_fire_scenecomp_options \ No newline at end of file diff --git a/infinigen/assets/fluid/asset_cache.py b/infinigen/assets/fluid/asset_cache.py index b6a89fa9d..9fd8da5d6 100644 --- a/infinigen/assets/fluid/asset_cache.py +++ b/infinigen/assets/fluid/asset_cache.py @@ -17,26 +17,15 @@ import numpy as np import json -try: - # from tools.asset_grid import import_surface_registry - from fluid.fluid import ( - find_available_cache, - set_obj_on_fire, - fire_smoke_ground_truth, - ) -except ImportError: - sys.path.append(str(Path(os.path.split(os.path.abspath(__file__))[0]))) - # from tools.asset_grid import import_surface_registry - from fluid.fluid import ( - find_available_cache, - set_obj_on_fire, - fire_smoke_ground_truth, - ) - +from infinigen.assets.fluid.fluid import ( + find_available_cache, + set_obj_on_fire, + fire_smoke_ground_truth, +) import time -from util import blender as butil -from util.math import FixedSeed +from infinigen.core.util import blender as butil +from infinigen.core.util.math import FixedSeed import logging RAND_SEED_MAX = 1e5 diff --git a/infinigen/assets/fluid/bounding_box.py b/infinigen/assets/fluid/bounding_box.py index 0a8290f37..d3b1af32a 100644 --- a/infinigen/assets/fluid/bounding_box.py +++ b/infinigen/assets/fluid/bounding_box.py @@ -6,10 +6,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def geometry_geometry_nodes(nw: NodeWrangler, obj): diff --git a/infinigen/assets/fluid/cached_factory_wrappers.py b/infinigen/assets/fluid/cached_factory_wrappers.py index f2f698248..407535cd4 100644 --- a/infinigen/assets/fluid/cached_factory_wrappers.py +++ b/infinigen/assets/fluid/cached_factory_wrappers.py @@ -1,8 +1,8 @@ -from assets.trees import TreeFactory, BushFactory -from assets.creatures import CarnivoreFactory -from assets.cactus import CactusFactory -from assets.boulder import BoulderFactory +from infinigen.assets.trees import TreeFactory, BushFactory +from infinigen.assets.creatures import CarnivoreFactory +from infinigen.assets.cactus import CactusFactory +from infinigen.assets.rocks.boulder import BoulderFactory class CachedBoulderFactory(BoulderFactory): pass diff --git a/infinigen/assets/fluid/duplication_geomod.py b/infinigen/assets/fluid/duplication_geomod.py index cc5b9e0f2..243032dca 100644 --- a/infinigen/assets/fluid/duplication_geomod.py +++ b/infinigen/assets/fluid/duplication_geomod.py @@ -6,10 +6,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def duplicate(nw: NodeWrangler, obj): diff --git a/infinigen/assets/fluid/flip_fluid.py b/infinigen/assets/fluid/flip_fluid.py index 2d5b41b61..98539387f 100644 --- a/infinigen/assets/fluid/flip_fluid.py +++ b/infinigen/assets/fluid/flip_fluid.py @@ -9,37 +9,28 @@ from numpy.random import uniform from mathutils import Vector -sys.path.append(str(Path(os.path.split(os.path.abspath(__file__))[0]) / "..")) - -from nodes.node_wrangler import ( - Nodes, - NodeWrangler, - infer_input_socket, - infer_output_socket, -) import bpy -import numpy as np os.environ["OPENCV_IO_ENABLE_OPENEXR"] = "1" # This must be done BEFORE import cv2. -from surfaces.templates import water, lava, river_water, new_whitewater -from surfaces.templates import blackbody_shader, waterfall_material, smoke_material -from util.blender import deep_clone_obj -from util.logging import Timer +from infinigen.assets.materials import water, lava, river_water, new_whitewater +from infinigen.assets.materials import blackbody_shader, waterfall_material, smoke_material +from infinigen.core.util.blender import deep_clone_obj +from infinigen.core.util.logging import Timer -from util import blender as butil -from util.organization import AssetFile, Materials, Process -from util.blender import object_from_trimesh, SelectObjects -from terrain.utils import Mesh +from infinigen.core.util import blender as butil +from infinigen.core.util.organization import AssetFile, Materials, Process +from infinigen.core.util.blender import object_from_trimesh, SelectObjects +from infinigen.terrain.utils import Mesh import cv2 import subprocess -from fluid.fluid import find_available_cache, obj_bb_minmax -import fluid.liquid_particle_material as liquid_particle_material +from infinigen.assets.fluid.fluid import find_available_cache, obj_bb_minmax +import infinigen.assets.fluid.liquid_particle_material as liquid_particle_material from numpy.random import normal as N import gin -from util.organization import Assets, LandTile +from infinigen.core.util.organization import Assets, LandTile def get_objs_inside_domain(dom, objects): diff --git a/infinigen/assets/fluid/fluid.py b/infinigen/assets/fluid/fluid.py index 596f41ffe..96b08399e 100644 --- a/infinigen/assets/fluid/fluid.py +++ b/infinigen/assets/fluid/fluid.py @@ -10,9 +10,9 @@ from numpy.random import uniform, normal, randint from mathutils import Vector import logging -from util.math import clip_gaussian +from infinigen.core.util.math import clip_gaussian -from nodes.node_wrangler import ( +from infinigen.core.nodes.node_wrangler import ( Nodes, NodeWrangler, infer_input_socket, @@ -22,16 +22,16 @@ import numpy as np -from surfaces.templates import water, lava +from infinigen.assets.materials import water, lava -from fluid import duplication_geomod -from surfaces.templates import blackbody_shader, waterfall_material, smoke_material -from util.blender import deep_clone_obj -from util.logging import Timer +from infinigen.assets.fluid import duplication_geomod +from infinigen.assets.materials import blackbody_shader, waterfall_material, smoke_material +from infinigen.core.util.blender import deep_clone_obj +from infinigen.core.util.logging import Timer import gin -from util import blender as butil +from infinigen.core.util import blender as butil # find next available number for fluid cache folder def find_available_cache(cache_folder): diff --git a/infinigen/assets/fluid/fluid_scenecomp_additions.py b/infinigen/assets/fluid/fluid_scenecomp_additions.py index 070d28329..525bea209 100644 --- a/infinigen/assets/fluid/fluid_scenecomp_additions.py +++ b/infinigen/assets/fluid/fluid_scenecomp_additions.py @@ -5,21 +5,21 @@ import numpy as np from numpy.random import uniform, normal, randint -from util.pipeline import RandomStageExecutor -from placement import placement, density +from infinigen.core.util.pipeline import RandomStageExecutor +from infinigen.core.placement import placement, density -from fluid.cached_factory_wrappers import ( +from infinigen.assets.fluid.cached_factory_wrappers import ( CachedTreeFactory, CachedCreatureFactory, CachedBoulderFactory, CachedBushFactory, CachedCactusFactory ) -from fluid.asset_cache import FireCachingSystem -from fluid.fluid import is_fire_in_scene -from fluid.flip_fluid import create_flip_fluid_domain, set_flip_fluid_domain, create_flip_fluid_inflow, set_flip_fluid_obstacle, get_objs_inside_domain, make_beach, make_river, make_tilted_river +from infinigen.assets.fluid.asset_cache import FireCachingSystem +from infinigen.assets.fluid.fluid import is_fire_in_scene +from infinigen.assets.fluid.flip_fluid import create_flip_fluid_domain, set_flip_fluid_domain, create_flip_fluid_inflow, set_flip_fluid_obstacle, get_objs_inside_domain, make_beach, make_river, make_tilted_river -def fire_scenecomp_options(p: RandomStageExecutor, terrain_mesh, params, tree_species_params): +def cached_fire_scenecomp_options(p: RandomStageExecutor, terrain_mesh, params, tree_species_params): land_domain = params.get('land_domain_tags') underwater_domain = params.get('underwater_domain_tags') diff --git a/infinigen/assets/fluid/generate.py b/infinigen/assets/fluid/generate.py index 0bb10dccd..2988dfc72 100644 --- a/infinigen/assets/fluid/generate.py +++ b/infinigen/assets/fluid/generate.py @@ -5,19 +5,19 @@ import gin import bpy -from placement.factory import AssetFactory +from infinigen.core.placement.factory import AssetFactory -from util import blender as butil +from infinigen.core.util import blender as butil -from fluid.fluid import ( +from infinigen.assets.fluid.fluid import ( create_liquid_domain, create_liquid_flow, create_gas_domain, create_gas_flow, add_field, ) -from fluid.flip_fluid import ( +from infinigen.assets.fluid.flip_fluid import ( create_flip_fluid_domain, set_flip_fluid_domain, create_flip_fluid_inflow, @@ -25,7 +25,7 @@ get_objs_inside_domain, ) -from util.logging import Timer +from infinigen.core.util.logging import Timer @gin.configurable diff --git a/infinigen/assets/fluid/liquid_particle_material.py b/infinigen/assets/fluid/liquid_particle_material.py index 9180399eb..ab87bdfb1 100644 --- a/infinigen/assets/fluid/liquid_particle_material.py +++ b/infinigen/assets/fluid/liquid_particle_material.py @@ -6,10 +6,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def liquid_particle_material(nw: NodeWrangler): # Code generated using version 2.5.1 of the node_transpiler diff --git a/infinigen/assets/fluid/run_asset_cache.py b/infinigen/assets/fluid/run_asset_cache.py index 5e6543777..834537f41 100644 --- a/infinigen/assets/fluid/run_asset_cache.py +++ b/infinigen/assets/fluid/run_asset_cache.py @@ -8,7 +8,7 @@ from pathlib import Path sys.path.append(os.getcwd()) -from fluid.asset_cache import FireCachingSystem +from infinigen.assets.fluid.asset_cache import FireCachingSystem try: from tools.asset_grid import import_surface_registry diff --git a/infinigen/assets/fruits/apple.py b/infinigen/assets/fruits/apple.py index c1ad325fa..6f6f9d46e 100644 --- a/infinigen/assets/fruits/apple.py +++ b/infinigen/assets/fruits/apple.py @@ -8,16 +8,16 @@ import mathutils import numpy as np from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface -from util.math import FixedSeed -from util import blender as butil -from placement.factory import AssetFactory +from infinigen.core.util.math import FixedSeed +from infinigen.core.util import blender as butil +from infinigen.core.placement.factory import AssetFactory -from assets.fruits.general_fruit import FruitFactoryGeneralFruit +from infinigen.assets.fruits.general_fruit import FruitFactoryGeneralFruit class FruitFactoryApple(FruitFactoryGeneralFruit): def __init__(self, factory_seed, scale=1.0, coarse=False): diff --git a/infinigen/assets/fruits/blackberry.py b/infinigen/assets/fruits/blackberry.py index d9b4de6bc..d0f977915 100644 --- a/infinigen/assets/fruits/blackberry.py +++ b/infinigen/assets/fruits/blackberry.py @@ -8,16 +8,16 @@ import mathutils import numpy as np from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface -from util.math import FixedSeed -from util import blender as butil -from placement.factory import AssetFactory +from infinigen.core.util.math import FixedSeed +from infinigen.core.util import blender as butil +from infinigen.core.placement.factory import AssetFactory -from assets.fruits.general_fruit import FruitFactoryGeneralFruit +from infinigen.assets.fruits.general_fruit import FruitFactoryGeneralFruit class FruitFactoryBlackberry(FruitFactoryGeneralFruit): def __init__(self, factory_seed, scale=1.0, coarse=False): diff --git a/infinigen/assets/fruits/coconutgreen.py b/infinigen/assets/fruits/coconutgreen.py index 1f34bfc03..7f1f2f57f 100644 --- a/infinigen/assets/fruits/coconutgreen.py +++ b/infinigen/assets/fruits/coconutgreen.py @@ -8,16 +8,16 @@ import mathutils import numpy as np from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface -from util.math import FixedSeed -from util import blender as butil -from placement.factory import AssetFactory +from infinigen.core.util.math import FixedSeed +from infinigen.core.util import blender as butil +from infinigen.core.placement.factory import AssetFactory -from assets.fruits.general_fruit import FruitFactoryGeneralFruit +from infinigen.assets.fruits.general_fruit import FruitFactoryGeneralFruit class FruitFactoryCoconutgreen(FruitFactoryGeneralFruit): def __init__(self, factory_seed, scale=1.0, coarse=False): diff --git a/infinigen/assets/fruits/coconuthairy.py b/infinigen/assets/fruits/coconuthairy.py index 1b81a7c94..daf3efbdb 100644 --- a/infinigen/assets/fruits/coconuthairy.py +++ b/infinigen/assets/fruits/coconuthairy.py @@ -8,16 +8,16 @@ import mathutils import numpy as np from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface -from util.math import FixedSeed -from util import blender as butil -from placement.factory import AssetFactory +from infinigen.core.util.math import FixedSeed +from infinigen.core.util import blender as butil +from infinigen.core.placement.factory import AssetFactory -from assets.fruits.general_fruit import FruitFactoryGeneralFruit +from infinigen.assets.fruits.general_fruit import FruitFactoryGeneralFruit class FruitFactoryCoconuthairy(FruitFactoryGeneralFruit): def __init__(self, factory_seed, scale=1.0, coarse=False): diff --git a/infinigen/assets/fruits/compositional_fruit.py b/infinigen/assets/fruits/compositional_fruit.py index 4c065bce8..c7557386a 100644 --- a/infinigen/assets/fruits/compositional_fruit.py +++ b/infinigen/assets/fruits/compositional_fruit.py @@ -8,24 +8,24 @@ import mathutils import numpy as np from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface - -from util.math import FixedSeed -from util import blender as butil -from placement.factory import AssetFactory - -from assets.fruits.general_fruit import FruitFactoryGeneralFruit -from assets.fruits.apple import FruitFactoryApple -from assets.fruits.pineapple import FruitFactoryPineapple -from assets.fruits.starfruit import FruitFactoryStarfruit -from assets.fruits.strawberry import FruitFactoryStrawberry -from assets.fruits.blackberry import FruitFactoryBlackberry -from assets.fruits.coconuthairy import FruitFactoryCoconuthairy -from assets.fruits.coconutgreen import FruitFactoryCoconutgreen -from assets.fruits.durian import FruitFactoryDurian +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface + +from infinigen.core.util.math import FixedSeed +from infinigen.core.util import blender as butil +from infinigen.core.placement.factory import AssetFactory + +from infinigen.assets.fruits.general_fruit import FruitFactoryGeneralFruit +from infinigen.assets.fruits.apple import FruitFactoryApple +from infinigen.assets.fruits.pineapple import FruitFactoryPineapple +from infinigen.assets.fruits.starfruit import FruitFactoryStarfruit +from infinigen.assets.fruits.strawberry import FruitFactoryStrawberry +from infinigen.assets.fruits.blackberry import FruitFactoryBlackberry +from infinigen.assets.fruits.coconuthairy import FruitFactoryCoconuthairy +from infinigen.assets.fruits.coconutgreen import FruitFactoryCoconutgreen +from infinigen.assets.fruits.durian import FruitFactoryDurian fruit_names = {'Apple': FruitFactoryApple, 'Pineapple': FruitFactoryPineapple, diff --git a/infinigen/assets/fruits/cross_section_lib.py b/infinigen/assets/fruits/cross_section_lib.py index 3b990d017..a3ec8dea8 100644 --- a/infinigen/assets/fruits/cross_section_lib.py +++ b/infinigen/assets/fruits/cross_section_lib.py @@ -7,12 +7,12 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.fruits.fruit_utils import nodegroup_rot_semmetry +from infinigen.assets.fruits.fruit_utils import nodegroup_rot_semmetry @node_utils.to_nodegroup('nodegroup_circle_cross_section', singleton=False, type='GeometryNodeTree') def nodegroup_circle_cross_section(nw: NodeWrangler): diff --git a/infinigen/assets/fruits/durian.py b/infinigen/assets/fruits/durian.py index 2b1cb59b0..92fd04d24 100644 --- a/infinigen/assets/fruits/durian.py +++ b/infinigen/assets/fruits/durian.py @@ -11,16 +11,16 @@ import numpy as np from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface -from util.math import FixedSeed -from util import blender as butil -from placement.factory import AssetFactory +from infinigen.core.util.math import FixedSeed +from infinigen.core.util import blender as butil +from infinigen.core.placement.factory import AssetFactory -from assets.fruits.general_fruit import FruitFactoryGeneralFruit +from infinigen.assets.fruits.general_fruit import FruitFactoryGeneralFruit @gin.register class FruitFactoryDurian(FruitFactoryGeneralFruit): diff --git a/infinigen/assets/fruits/fruit_utils.py b/infinigen/assets/fruits/fruit_utils.py index d5c0e4771..0e581208d 100644 --- a/infinigen/assets/fruits/fruit_utils.py +++ b/infinigen/assets/fruits/fruit_utils.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface @node_utils.to_nodegroup('nodegroup_random_rotation_scale', singleton=False, type='GeometryNodeTree') def nodegroup_random_rotation_scale(nw: NodeWrangler): diff --git a/infinigen/assets/fruits/general_fruit.py b/infinigen/assets/fruits/general_fruit.py index 2c569ffef..9e2e83c70 100644 --- a/infinigen/assets/fruits/general_fruit.py +++ b/infinigen/assets/fruits/general_fruit.py @@ -8,28 +8,28 @@ import mathutils import numpy as np from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface - -from util.math import FixedSeed -from util import blender as butil -from placement.factory import AssetFactory - -from assets.fruits.fruit_utils import nodegroup_shape_quadratic, nodegroup_align_top_to_horizon -from assets.fruits.cross_section_lib import nodegroup_circle_cross_section, nodegroup_star_cross_section, nodegroup_coconut_cross_section -from assets.fruits.stem_lib import nodegroup_basic_stem, nodegroup_pineapple_stem, nodegroup_calyx_stem, nodegroup_empty_stem, nodegroup_coconut_stem - -from assets.fruits.surfaces.apple_surface import nodegroup_apple_surface -from assets.fruits.surfaces.pineapple_surface import nodegroup_pineapple_surface -from assets.fruits.surfaces.starfruit_surface import nodegroup_starfruit_surface -from assets.fruits.surfaces.strawberry_surface import nodegroup_strawberry_surface -from assets.fruits.surfaces.blackberry_surface import nodegroup_blackberry_surface -from assets.fruits.surfaces.coconuthairy_surface import nodegroup_coconuthairy_surface -from assets.fruits.surfaces.coconutgreen_surface import nodegroup_coconutgreen_surface -from assets.fruits.surfaces.durian_surface import nodegroup_durian_surface -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface + +from infinigen.core.util.math import FixedSeed +from infinigen.core.util import blender as butil +from infinigen.core.placement.factory import AssetFactory + +from infinigen.assets.fruits.fruit_utils import nodegroup_shape_quadratic, nodegroup_align_top_to_horizon +from infinigen.assets.fruits.cross_section_lib import nodegroup_circle_cross_section, nodegroup_star_cross_section, nodegroup_coconut_cross_section +from infinigen.assets.fruits.stem_lib import nodegroup_basic_stem, nodegroup_pineapple_stem, nodegroup_calyx_stem, nodegroup_empty_stem, nodegroup_coconut_stem + +from infinigen.assets.fruits.surfaces.apple_surface import nodegroup_apple_surface +from infinigen.assets.fruits.surfaces.pineapple_surface import nodegroup_pineapple_surface +from infinigen.assets.fruits.surfaces.starfruit_surface import nodegroup_starfruit_surface +from infinigen.assets.fruits.surfaces.strawberry_surface import nodegroup_strawberry_surface +from infinigen.assets.fruits.surfaces.blackberry_surface import nodegroup_blackberry_surface +from infinigen.assets.fruits.surfaces.coconuthairy_surface import nodegroup_coconuthairy_surface +from infinigen.assets.fruits.surfaces.coconutgreen_surface import nodegroup_coconutgreen_surface +from infinigen.assets.fruits.surfaces.durian_surface import nodegroup_durian_surface +from infinigen.assets.utils.tag import tag_object, tag_nodegroup crosssectionlib = { 'circle_cross_section': nodegroup_circle_cross_section, diff --git a/infinigen/assets/fruits/pineapple.py b/infinigen/assets/fruits/pineapple.py index 62dde125a..7ade5d9b5 100644 --- a/infinigen/assets/fruits/pineapple.py +++ b/infinigen/assets/fruits/pineapple.py @@ -8,16 +8,16 @@ import mathutils import numpy as np from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface -from util.math import FixedSeed -from util import blender as butil -from placement.factory import AssetFactory +from infinigen.core.util.math import FixedSeed +from infinigen.core.util import blender as butil +from infinigen.core.placement.factory import AssetFactory -from assets.fruits.general_fruit import FruitFactoryGeneralFruit +from infinigen.assets.fruits.general_fruit import FruitFactoryGeneralFruit class FruitFactoryPineapple(FruitFactoryGeneralFruit): def __init__(self, factory_seed, scale=1.0, coarse=False): diff --git a/infinigen/assets/fruits/seed_lib.py b/infinigen/assets/fruits/seed_lib.py index 8be4c1716..79ca0c7f9 100644 --- a/infinigen/assets/fruits/seed_lib.py +++ b/infinigen/assets/fruits/seed_lib.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def shader_seed_shader(nw: NodeWrangler): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/fruits/starfruit.py b/infinigen/assets/fruits/starfruit.py index 43f7675e5..575102f10 100644 --- a/infinigen/assets/fruits/starfruit.py +++ b/infinigen/assets/fruits/starfruit.py @@ -8,16 +8,16 @@ import mathutils import numpy as np from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface -from util.math import FixedSeed -from util import blender as butil -from placement.factory import AssetFactory +from infinigen.core.util.math import FixedSeed +from infinigen.core.util import blender as butil +from infinigen.core.placement.factory import AssetFactory -from assets.fruits.general_fruit import FruitFactoryGeneralFruit +from infinigen.assets.fruits.general_fruit import FruitFactoryGeneralFruit class FruitFactoryStarfruit(FruitFactoryGeneralFruit): def __init__(self, factory_seed, scale=1.0, coarse=False): diff --git a/infinigen/assets/fruits/stem_lib.py b/infinigen/assets/fruits/stem_lib.py index 11311300e..1d53dd7e4 100644 --- a/infinigen/assets/fruits/stem_lib.py +++ b/infinigen/assets/fruits/stem_lib.py @@ -7,13 +7,13 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.fruits.fruit_utils import nodegroup_surface_bump, nodegroup_add_noise_scalar, nodegroup_attach_to_nearest, nodegroup_scale_mesh -from assets.fruits.cross_section_lib import nodegroup_cylax_cross_section +from infinigen.assets.fruits.fruit_utils import nodegroup_surface_bump, nodegroup_add_noise_scalar, nodegroup_attach_to_nearest, nodegroup_scale_mesh +from infinigen.assets.fruits.cross_section_lib import nodegroup_cylax_cross_section @node_utils.to_nodegroup('nodegroup_empty_stem', singleton=False, type='GeometryNodeTree') def nodegroup_empty_stem(nw: NodeWrangler): diff --git a/infinigen/assets/fruits/strawberry.py b/infinigen/assets/fruits/strawberry.py index 849a1abba..ca2fc2511 100644 --- a/infinigen/assets/fruits/strawberry.py +++ b/infinigen/assets/fruits/strawberry.py @@ -8,16 +8,16 @@ import mathutils import numpy as np from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface -from util.math import FixedSeed -from util import blender as butil -from placement.factory import AssetFactory +from infinigen.core.util.math import FixedSeed +from infinigen.core.util import blender as butil +from infinigen.core.placement.factory import AssetFactory -from assets.fruits.general_fruit import FruitFactoryGeneralFruit +from infinigen.assets.fruits.general_fruit import FruitFactoryGeneralFruit class FruitFactoryStrawberry(FruitFactoryGeneralFruit): def __init__(self, factory_seed, scale=1.0, coarse=False): diff --git a/infinigen/assets/fruits/surfaces/apple_surface.py b/infinigen/assets/fruits/surfaces/apple_surface.py index 8181d2d6c..e05f1037b 100644 --- a/infinigen/assets/fruits/surfaces/apple_surface.py +++ b/infinigen/assets/fruits/surfaces/apple_surface.py @@ -7,12 +7,12 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.fruits.fruit_utils import nodegroup_add_dent +from infinigen.assets.fruits.fruit_utils import nodegroup_add_dent def shader_apple_shader(nw: NodeWrangler, color1, color2, random_seed): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/fruits/surfaces/blackberry_surface.py b/infinigen/assets/fruits/surfaces/blackberry_surface.py index d9e5b210c..4800f53e2 100644 --- a/infinigen/assets/fruits/surfaces/blackberry_surface.py +++ b/infinigen/assets/fruits/surfaces/blackberry_surface.py @@ -7,13 +7,13 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.fruits.fruit_utils import nodegroup_shape_quadratic, nodegroup_random_rotation_scale, nodegroup_surface_bump, nodegroup_point_on_mesh, nodegroup_instance_on_points -from assets.fruits.cross_section_lib import nodegroup_circle_cross_section +from infinigen.assets.fruits.fruit_utils import nodegroup_shape_quadratic, nodegroup_random_rotation_scale, nodegroup_surface_bump, nodegroup_point_on_mesh, nodegroup_instance_on_points +from infinigen.assets.fruits.cross_section_lib import nodegroup_circle_cross_section def shader_berry_shader(nw: NodeWrangler, berry_color): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/fruits/surfaces/coconutgreen_surface.py b/infinigen/assets/fruits/surfaces/coconutgreen_surface.py index 29d5579a9..a985a87a4 100644 --- a/infinigen/assets/fruits/surfaces/coconutgreen_surface.py +++ b/infinigen/assets/fruits/surfaces/coconutgreen_surface.py @@ -7,13 +7,13 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.fruits.fruit_utils import nodegroup_add_dent, nodegroup_surface_bump -from assets.fruits.surfaces.surface_utils import nodegroup_stripe_pattern +from infinigen.assets.fruits.fruit_utils import nodegroup_add_dent, nodegroup_surface_bump +from infinigen.assets.fruits.surfaces.surface_utils import nodegroup_stripe_pattern def shader_coconut_green_shader(nw: NodeWrangler, basic_color, bottom_color): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/fruits/surfaces/coconuthairy_surface.py b/infinigen/assets/fruits/surfaces/coconuthairy_surface.py index f71fb3606..d3339e047 100644 --- a/infinigen/assets/fruits/surfaces/coconuthairy_surface.py +++ b/infinigen/assets/fruits/surfaces/coconuthairy_surface.py @@ -7,12 +7,12 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.fruits.fruit_utils import nodegroup_point_on_mesh, nodegroup_random_rotation_scale, nodegroup_hair, nodegroup_instance_on_points +from infinigen.assets.fruits.fruit_utils import nodegroup_point_on_mesh, nodegroup_random_rotation_scale, nodegroup_hair, nodegroup_instance_on_points def shader_hair_shader(nw: NodeWrangler, basic_color): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/fruits/surfaces/durian_surface.py b/infinigen/assets/fruits/surfaces/durian_surface.py index ec3344116..1eb798352 100644 --- a/infinigen/assets/fruits/surfaces/durian_surface.py +++ b/infinigen/assets/fruits/surfaces/durian_surface.py @@ -7,12 +7,12 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.fruits.fruit_utils import nodegroup_manhattan, nodegroup_point_on_mesh, nodegroup_surface_bump +from infinigen.assets.fruits.fruit_utils import nodegroup_manhattan, nodegroup_point_on_mesh, nodegroup_surface_bump def shader_durian_shader(nw: NodeWrangler, peak_color, base_color): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/fruits/surfaces/pineapple_surface.py b/infinigen/assets/fruits/surfaces/pineapple_surface.py index 4a973430d..507f475e9 100644 --- a/infinigen/assets/fruits/surfaces/pineapple_surface.py +++ b/infinigen/assets/fruits/surfaces/pineapple_surface.py @@ -7,14 +7,14 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.fruits.fruit_utils import nodegroup_point_on_mesh, nodegroup_random_rotation_scale, nodegroup_surface_bump, nodegroup_instance_on_points -from assets.fruits.cross_section_lib import nodegroup_circle_cross_section -from assets.fruits.stem_lib import nodegroup_pineapple_leaf +from infinigen.assets.fruits.fruit_utils import nodegroup_point_on_mesh, nodegroup_random_rotation_scale, nodegroup_surface_bump, nodegroup_instance_on_points +from infinigen.assets.fruits.cross_section_lib import nodegroup_circle_cross_section +from infinigen.assets.fruits.stem_lib import nodegroup_pineapple_leaf @node_utils.to_nodegroup('nodegroup_pineapple_surface', singleton=False, type='GeometryNodeTree') def nodegroup_pineapple_surface(nw: NodeWrangler, diff --git a/infinigen/assets/fruits/surfaces/starfruit_surface.py b/infinigen/assets/fruits/surfaces/starfruit_surface.py index 7fbd47a71..dc77bdff8 100644 --- a/infinigen/assets/fruits/surfaces/starfruit_surface.py +++ b/infinigen/assets/fruits/surfaces/starfruit_surface.py @@ -7,12 +7,12 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.fruits.fruit_utils import nodegroup_surface_bump, nodegroup_add_dent +from infinigen.assets.fruits.fruit_utils import nodegroup_surface_bump, nodegroup_add_dent def shader_starfruit_shader(nw: NodeWrangler, base_color, ridge_color): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/fruits/surfaces/strawberry_surface.py b/infinigen/assets/fruits/surfaces/strawberry_surface.py index 1239cc3ad..cd4a8b979 100644 --- a/infinigen/assets/fruits/surfaces/strawberry_surface.py +++ b/infinigen/assets/fruits/surfaces/strawberry_surface.py @@ -7,13 +7,13 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.fruits.seed_lib import nodegroup_strawberry_seed -from assets.fruits.fruit_utils import nodegroup_point_on_mesh, nodegroup_add_crater, nodegroup_surface_bump, nodegroup_random_rotation_scale, nodegroup_instance_on_points, nodegroup_add_noise_scalar +from infinigen.assets.fruits.seed_lib import nodegroup_strawberry_seed +from infinigen.assets.fruits.fruit_utils import nodegroup_point_on_mesh, nodegroup_add_crater, nodegroup_surface_bump, nodegroup_random_rotation_scale, nodegroup_instance_on_points, nodegroup_add_noise_scalar def shader_strawberry_shader(nw: NodeWrangler, top_pos, main_color, top_color): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/fruits/surfaces/surface_utils.py b/infinigen/assets/fruits/surfaces/surface_utils.py index 5658259b9..6fc88e03e 100644 --- a/infinigen/assets/fruits/surfaces/surface_utils.py +++ b/infinigen/assets/fruits/surfaces/surface_utils.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface @node_utils.to_nodegroup('nodegroup_stripe_pattern', singleton=False, type='ShaderNodeTree') def nodegroup_stripe_pattern(nw: NodeWrangler): diff --git a/infinigen/assets/grassland/dandelion.py b/infinigen/assets/grassland/dandelion.py index 717dd641a..db29e4ec7 100644 --- a/infinigen/assets/grassland/dandelion.py +++ b/infinigen/assets/grassland/dandelion.py @@ -7,16 +7,16 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from surfaces import surface -from surfaces.templates import simple_greenery -from surfaces.templates import simple_whitish -from surfaces.templates import simple_brownish -from placement.factory import AssetFactory +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core import surface +from infinigen.assets.materials import simple_greenery +from infinigen.assets.materials import simple_whitish +from infinigen.assets.materials import simple_brownish +from infinigen.core.placement.factory import AssetFactory import numpy as np -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_pedal_stem_head_geometry', singleton=False, type='GeometryNodeTree') diff --git a/infinigen/assets/grassland/flower.py b/infinigen/assets/grassland/flower.py index 6561174ad..9b873da84 100644 --- a/infinigen/assets/grassland/flower.py +++ b/infinigen/assets/grassland/flower.py @@ -10,14 +10,14 @@ from numpy.random import uniform, normal import numpy as np -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils, color -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils, color +from infinigen.core import surface -from placement.factory import AssetFactory -from util import blender as butil -from util.math import FixedSeed, dict_lerp -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util import blender as butil +from infinigen.core.util.math import FixedSeed, dict_lerp +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_polar_to_cart_old', singleton=True) def nodegroup_polar_to_cart_old(nw): diff --git a/infinigen/assets/grassland/flowerplant.py b/infinigen/assets/grassland/flowerplant.py index 3a36a9ebc..900022480 100644 --- a/infinigen/assets/grassland/flowerplant.py +++ b/infinigen/assets/grassland/flowerplant.py @@ -8,17 +8,17 @@ import mathutils from numpy.random import uniform, normal, randint from infinigen.assets.grassland.flower import FlowerFactory -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category import numpy as np -from surfaces import surface -from surfaces.templates import simple_greenery -from assets.small_plants import leaf_general as Leaf +from infinigen.core import surface +from infinigen.assets.materials import simple_greenery +from infinigen.assets.small_plants import leaf_general as Leaf from infinigen.assets.grassland import flower as Flower -from placement.factory import AssetFactory -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_stem_branch_leaf_s_r', singleton=False, type='GeometryNodeTree') diff --git a/infinigen/assets/grassland/grass_tuft.py b/infinigen/assets/grassland/grass_tuft.py index d5d645d30..6f5c9dc24 100644 --- a/infinigen/assets/grassland/grass_tuft.py +++ b/infinigen/assets/grassland/grass_tuft.py @@ -9,15 +9,15 @@ import numpy as np from numpy.random import uniform, normal -from assets.creatures.geometry.curve import Curve -from util.blender import deep_clone_obj +from infinigen.assets.creatures.util.geometry.curve import Curve +from infinigen.core.util.blender import deep_clone_obj -from surfaces.templates import grass_blade_texture +from infinigen.assets.materials import grass_blade_texture -from placement.factory import AssetFactory +from infinigen.core.placement.factory import AssetFactory -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class GrassTuftFactory(AssetFactory): diff --git a/infinigen/assets/leaves/leaf.py b/infinigen/assets/leaves/leaf.py index 2d389a610..6335ca57b 100644 --- a/infinigen/assets/leaves/leaf.py +++ b/infinigen/assets/leaves/leaf.py @@ -11,11 +11,11 @@ import bpy from mathutils import Vector, Matrix -from assets.trees.utils import helper, mesh, materials +from infinigen.assets.trees.utils import helper, mesh, materials -from placement.factory import AssetFactory -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup C = bpy.context D = bpy.data diff --git a/infinigen/assets/leaves/leaf_broadleaf.py b/infinigen/assets/leaves/leaf_broadleaf.py index ad7a90390..c87e72a0c 100644 --- a/infinigen/assets/leaves/leaf_broadleaf.py +++ b/infinigen/assets/leaves/leaf_broadleaf.py @@ -8,17 +8,17 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface -from assets.leaves.leaf_v2 import nodegroup_apply_wave, nodegroup_move_to_origin -from assets.leaves.leaf_maple import nodegroup_leaf_shader - -from util.math import FixedSeed -from placement.factory import AssetFactory -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface +from infinigen.assets.leaves.leaf_v2 import nodegroup_apply_wave, nodegroup_move_to_origin +from infinigen.assets.leaves.leaf_maple import nodegroup_leaf_shader + +from infinigen.core.util.math import FixedSeed +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_random_mask_vein', singleton=False, type='GeometryNodeTree') diff --git a/infinigen/assets/leaves/leaf_ginko.py b/infinigen/assets/leaves/leaf_ginko.py index c7f1905db..de8199f53 100644 --- a/infinigen/assets/leaves/leaf_ginko.py +++ b/infinigen/assets/leaves/leaf_ginko.py @@ -8,17 +8,17 @@ import mathutils import numpy as np from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface -from assets.leaves.leaf_v2 import nodegroup_move_to_origin, nodegroup_apply_wave -from assets.leaves.leaf_maple import nodegroup_leaf_shader - -from util.math import FixedSeed -from placement.factory import AssetFactory -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface +from infinigen.assets.leaves.leaf_v2 import nodegroup_move_to_origin, nodegroup_apply_wave +from infinigen.assets.leaves.leaf_maple import nodegroup_leaf_shader + +from infinigen.core.util.math import FixedSeed +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup def deg2rad(deg): return deg / 180.0 * np.pi diff --git a/infinigen/assets/leaves/leaf_maple.py b/infinigen/assets/leaves/leaf_maple.py index cca2df8ca..6b9fa256c 100644 --- a/infinigen/assets/leaves/leaf_maple.py +++ b/infinigen/assets/leaves/leaf_maple.py @@ -9,16 +9,16 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface -from assets.leaves.leaf_v2 import nodegroup_apply_wave - -from util.math import FixedSeed -from placement.factory import AssetFactory -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface +from infinigen.assets.leaves.leaf_v2 import nodegroup_apply_wave + +from infinigen.core.util.math import FixedSeed +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup def deg2rad(deg): return deg / 180.0 * np.pi diff --git a/infinigen/assets/leaves/leaf_pine.py b/infinigen/assets/leaves/leaf_pine.py index d9da403bd..929ffbfb1 100644 --- a/infinigen/assets/leaves/leaf_pine.py +++ b/infinigen/assets/leaves/leaf_pine.py @@ -8,15 +8,15 @@ import bpy import mathutils from numpy.random import uniform, normal -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface - -from util.math import FixedSeed -from placement.factory import AssetFactory -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface + +from infinigen.core.util.math import FixedSeed +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup ######## code for creating pine needles ######## diff --git a/infinigen/assets/leaves/leaf_v2.py b/infinigen/assets/leaves/leaf_v2.py index d9cd9b5c7..f85e50d0e 100644 --- a/infinigen/assets/leaves/leaf_v2.py +++ b/infinigen/assets/leaves/leaf_v2.py @@ -12,24 +12,24 @@ import bpy -from surfaces import surface -from nodes import node_utils -from nodes.node_wrangler import Nodes +from infinigen.core import surface +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.node_wrangler import Nodes -from util.math import FixedSeed -from placement.factory import AssetFactory -from util import blender as butil -from nodes.color import color_category +from infinigen.core.util.math import FixedSeed +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util import blender as butil +from infinigen.core.nodes.color import color_category import bpy import mathutils from numpy.random import uniform, normal -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('shader_nodegroup_sub_vein', singleton=False, type='ShaderNodeTree') def shader_nodegroup_sub_vein(nw): diff --git a/infinigen/assets/leaves/leaf_wrapped.py b/infinigen/assets/leaves/leaf_wrapped.py index 186b6baf8..b43a990c3 100644 --- a/infinigen/assets/leaves/leaf_wrapped.py +++ b/infinigen/assets/leaves/leaf_wrapped.py @@ -8,15 +8,15 @@ import mathutils import numpy as np from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.leaves.leaf_maple import LeafFactoryMaple -from assets.leaves.leaf_broadleaf import LeafFactoryBroadleaf -from assets.leaves.leaf_ginko import LeafFactoryGinko -from placement.factory import AssetFactory +from infinigen.assets.leaves.leaf_maple import LeafFactoryMaple +from infinigen.assets.leaves.leaf_broadleaf import LeafFactoryBroadleaf +from infinigen.assets.leaves.leaf_ginko import LeafFactoryGinko +from infinigen.core.placement.factory import AssetFactory def nodegroup_nodegroup_apply_wrap(nw: NodeWrangler, **kwargs): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/lighting/caustics_lamp.py b/infinigen/assets/lighting/caustics_lamp.py index 728e77a9e..3533c7fe1 100644 --- a/infinigen/assets/lighting/caustics_lamp.py +++ b/infinigen/assets/lighting/caustics_lamp.py @@ -11,13 +11,13 @@ from numpy.random import uniform as U, normal as N, randint, uniform import numpy as np -from assets.utils.misc import log_uniform -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from placement import placement -from placement.placement import placeholder_locs -from util.math import FixedSeed -from placement.factory import AssetFactory +from infinigen.assets.utils.misc import log_uniform +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.placement import placement +from infinigen.core.placement.placement import placeholder_locs +from infinigen.core.util.math import FixedSeed +from infinigen.core.placement.factory import AssetFactory @node_utils.to_nodegroup('nodegroup_caustics', singleton=False, type='ShaderNodeTree') diff --git a/infinigen/assets/lighting/glowing_rocks.py b/infinigen/assets/lighting/glowing_rocks.py index 5c7cc5195..f95bf871e 100644 --- a/infinigen/assets/lighting/glowing_rocks.py +++ b/infinigen/assets/lighting/glowing_rocks.py @@ -7,14 +7,14 @@ import bpy import gin import numpy as np -from util import blender as butil +from infinigen.core.util import blender as butil -from nodes.node_wrangler import Nodes, NodeWrangler -from placement.factory import AssetFactory, make_asset_collection -from surfaces.scatters.rocks import BlenderRockFactory -from surfaces import surface -from nodes.color import color_category -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.assets.rocks.blender_rock import BlenderRockFactory +from infinigen.core import surface +from infinigen.core.nodes.color import color_category +from infinigen.assets.utils.tag import tag_object, tag_nodegroup def shader_glowrock(nw: NodeWrangler, transparent_for_bounce=True): object_info = nw.new_node(Nodes.ObjectInfo_Shader) diff --git a/infinigen/assets/lighting/lighting.py b/infinigen/assets/lighting/sky_lighting.py similarity index 94% rename from infinigen/assets/lighting/lighting.py rename to infinigen/assets/lighting/sky_lighting.py index b0a68c1f1..1249bfb61 100644 --- a/infinigen/assets/lighting/lighting.py +++ b/infinigen/assets/lighting/sky_lighting.py @@ -8,11 +8,11 @@ import math import numpy as np import gin -from util.random import random_general as rg +from infinigen.core.util.random import random_general as rg from numpy.random import uniform -from nodes.node_wrangler import Nodes, NodeWrangler -from util.math import clip_gaussian +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.util.math import clip_gaussian @gin.configurable def nishita_lighting( diff --git a/infinigen/assets/materials/__init__.py b/infinigen/assets/materials/__init__.py new file mode 100644 index 000000000..89abe7d35 --- /dev/null +++ b/infinigen/assets/materials/__init__.py @@ -0,0 +1,2 @@ +from . import * +from infinigen.infinigen_gpl.surfaces import * diff --git a/infinigen/assets/surfaces/aluminumdisp2tut.py b/infinigen/assets/materials/aluminumdisp2tut.py similarity index 96% rename from infinigen/assets/surfaces/aluminumdisp2tut.py rename to infinigen/assets/materials/aluminumdisp2tut.py index 018524852..c71fff9ba 100644 --- a/infinigen/assets/surfaces/aluminumdisp2tut.py +++ b/infinigen/assets/materials/aluminumdisp2tut.py @@ -7,14 +7,16 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface + +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category + +from infinigen.core import surface def shader_aluminumdisp2tut(nw: NodeWrangler, rand=False, **input_kwargs): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/surfaces/atmosphere_light_haze.py b/infinigen/assets/materials/atmosphere_light_haze.py similarity index 81% rename from infinigen/assets/surfaces/atmosphere_light_haze.py rename to infinigen/assets/materials/atmosphere_light_haze.py index 3ae91410d..005140866 100644 --- a/infinigen/assets/surfaces/atmosphere_light_haze.py +++ b/infinigen/assets/materials/atmosphere_light_haze.py @@ -7,10 +7,11 @@ import numpy as np from numpy.random import uniform import gin -from util.random import random_general as rg -from nodes.node_wrangler import Nodes -from nodes import color -from surfaces import surface + +from infinigen.core.util.random import random_general as rg +from infinigen.core.nodes.node_wrangler import Nodes +from infinigen.core.nodes import color +from infinigen.core import surface type = None diff --git a/infinigen/assets/surfaces/bark.py b/infinigen/assets/materials/bark.py similarity index 96% rename from infinigen/assets/surfaces/bark.py rename to infinigen/assets/materials/bark.py index d4f3e3584..a35430db2 100644 --- a/infinigen/assets/surfaces/bark.py +++ b/infinigen/assets/materials/bark.py @@ -6,12 +6,12 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform, normal -from nodes.node_wrangler import Nodes, NodeWrangler -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core import surface import random diff --git a/infinigen/assets/surfaces/bark_birch.py b/infinigen/assets/materials/bark_birch.py similarity index 98% rename from infinigen/assets/surfaces/bark_birch.py rename to infinigen/assets/materials/bark_birch.py index bd28d32c5..0712bc020 100644 --- a/infinigen/assets/surfaces/bark_birch.py +++ b/infinigen/assets/materials/bark_birch.py @@ -8,9 +8,9 @@ import bpy import mathutils from numpy.random import uniform, normal -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core import surface from .bark_random import nodegroup_apply_geo_matv2, nodegroup_shader_canonical_coord, nodegroup_canonical_coord diff --git a/infinigen/assets/surfaces/bark_random.py b/infinigen/assets/materials/bark_random.py similarity index 99% rename from infinigen/assets/surfaces/bark_random.py rename to infinigen/assets/materials/bark_random.py index 52204677d..72af3d2aa 100644 --- a/infinigen/assets/surfaces/bark_random.py +++ b/infinigen/assets/materials/bark_random.py @@ -9,12 +9,12 @@ import bpy import mathutils from numpy.random import uniform, normal -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core import surface import numpy as np -from util.math import FixedSeed +from infinigen.core.util.math import FixedSeed @node_utils.to_nodegroup('nodegroup_calc_radius', singleton=True, type='GeometryNodeTree') def nodegroup_calc_radius(nw): diff --git a/infinigen/assets/surfaces/basic_bsdf.py b/infinigen/assets/materials/basic_bsdf.py similarity index 87% rename from infinigen/assets/surfaces/basic_bsdf.py rename to infinigen/assets/materials/basic_bsdf.py index 0edb42fe5..9a2fbe580 100644 --- a/infinigen/assets/surfaces/basic_bsdf.py +++ b/infinigen/assets/materials/basic_bsdf.py @@ -10,9 +10,9 @@ import numpy as np from numpy.random import uniform, normal -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes.color import hsv2rgba -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes.color import hsv2rgba +from infinigen.core import surface def shader_basic_bsdf(nw): diff --git a/infinigen/assets/surfaces/beak.py b/infinigen/assets/materials/beak.py similarity index 92% rename from infinigen/assets/surfaces/beak.py rename to infinigen/assets/materials/beak.py index dcd42b838..ce2db642f 100644 --- a/infinigen/assets/surfaces/beak.py +++ b/infinigen/assets/materials/beak.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def orange(): r = uniform(205 / 255, 1) diff --git a/infinigen/assets/surfaces/bird.py b/infinigen/assets/materials/bird.py similarity index 98% rename from infinigen/assets/surfaces/bird.py rename to infinigen/assets/materials/bird.py index fb6f22036..09280fc21 100644 --- a/infinigen/assets/surfaces/bird.py +++ b/infinigen/assets/materials/bird.py @@ -7,14 +7,14 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface import random diff --git a/infinigen/assets/surfaces/blackbody_shader.py b/infinigen/assets/materials/blackbody_shader.py similarity index 90% rename from infinigen/assets/surfaces/blackbody_shader.py rename to infinigen/assets/materials/blackbody_shader.py index 63e33eaef..b57611765 100644 --- a/infinigen/assets/surfaces/blackbody_shader.py +++ b/infinigen/assets/materials/blackbody_shader.py @@ -7,11 +7,11 @@ import bpy import mathutils from numpy.random import uniform, normal as N, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface -from util.random import random_color_neighbour +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface +from infinigen.core.util.random import random_color_neighbour diff --git a/infinigen/assets/surfaces/bone.py b/infinigen/assets/materials/bone.py similarity index 95% rename from infinigen/assets/surfaces/bone.py rename to infinigen/assets/materials/bone.py index a8704d3cb..c956d41d6 100644 --- a/infinigen/assets/surfaces/bone.py +++ b/infinigen/assets/materials/bone.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def shader_bone(nw: NodeWrangler): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/surfaces/chitin.py b/infinigen/assets/materials/chitin.py similarity index 96% rename from infinigen/assets/surfaces/chitin.py rename to infinigen/assets/materials/chitin.py index b71c3fab4..7347fafa5 100644 --- a/infinigen/assets/surfaces/chitin.py +++ b/infinigen/assets/materials/chitin.py @@ -7,14 +7,14 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface def shader_chitin(nw: NodeWrangler, rand=True, **input_kwargs): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/surfaces/chunkyrock.py b/infinigen/assets/materials/chunkyrock.py similarity index 94% rename from infinigen/assets/surfaces/chunkyrock.py rename to infinigen/assets/materials/chunkyrock.py index 5838adc89..2e0b3f2f2 100644 --- a/infinigen/assets/surfaces/chunkyrock.py +++ b/infinigen/assets/materials/chunkyrock.py @@ -11,13 +11,13 @@ import mathutils from numpy.random import uniform, normal, randint import gin -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface -from surfaces.surface_utils import sample_color, sample_range, sample_ratio -from util.organization import SurfaceTypes -from util.math import FixedSeed +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface +from infinigen.assets.materials.utils.surface_utils import sample_color, sample_range, sample_ratio +from infinigen.core.util.organization import SurfaceTypes +from infinigen.core.util.math import FixedSeed from .mountain import geo_MOUNTAIN_general diff --git a/infinigen/assets/surfaces/cobble_stone.py b/infinigen/assets/materials/cobble_stone.py similarity index 96% rename from infinigen/assets/surfaces/cobble_stone.py rename to infinigen/assets/materials/cobble_stone.py index 7bbc40d3d..c50e9d30c 100644 --- a/infinigen/assets/surfaces/cobble_stone.py +++ b/infinigen/assets/materials/cobble_stone.py @@ -6,11 +6,11 @@ from numpy.random import uniform as U, normal as N -from nodes.node_wrangler import Nodes, NodeWrangler -from surfaces import surface -from util.random import random_color_neighbour -from util.organization import SurfaceTypes -from util.math import FixedSeed +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core import surface +from infinigen.core.util.random import random_color_neighbour +from infinigen.core.util.organization import SurfaceTypes +from infinigen.core.util.math import FixedSeed import gin type = SurfaceTypes.SDFPerturb diff --git a/infinigen/assets/surfaces/cracked_ground.py b/infinigen/assets/materials/cracked_ground.py similarity index 96% rename from infinigen/assets/surfaces/cracked_ground.py rename to infinigen/assets/materials/cracked_ground.py index 730b462af..011ddb965 100644 --- a/infinigen/assets/surfaces/cracked_ground.py +++ b/infinigen/assets/materials/cracked_ground.py @@ -8,15 +8,15 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface -from util.organization import SurfaceTypes +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface +from infinigen.core.util.organization import SurfaceTypes import gin -from util.math import FixedSeed -from util.random import random_color_neighbour +from infinigen.core.util.math import FixedSeed +from infinigen.core.util.random import random_color_neighbour type = SurfaceTypes.SDFPerturb mod_name = "geo_cracked_ground" diff --git a/infinigen/assets/surfaces/dirt.py b/infinigen/assets/materials/dirt.py similarity index 97% rename from infinigen/assets/surfaces/dirt.py rename to infinigen/assets/materials/dirt.py index 9f1bc4c89..27f872ded 100644 --- a/infinigen/assets/surfaces/dirt.py +++ b/infinigen/assets/materials/dirt.py @@ -8,12 +8,12 @@ import bpy import gin -from nodes.node_wrangler import Nodes +from infinigen.core.nodes.node_wrangler import Nodes from numpy.random import uniform -from surfaces import surface -from surfaces.surface_utils import sample_color, sample_ratio -from util.organization import SurfaceTypes -from util.math import FixedSeed +from infinigen.core import surface +from infinigen.assets.materials.utils.surface_utils import sample_color, sample_ratio +from infinigen.core.util.organization import SurfaceTypes +from infinigen.core.util.math import FixedSeed from .mountain import geo_MOUNTAIN_general diff --git a/infinigen/assets/surfaces/eyeball.py b/infinigen/assets/materials/eyeball.py similarity index 92% rename from infinigen/assets/surfaces/eyeball.py rename to infinigen/assets/materials/eyeball.py index 18753ec11..658c17523 100644 --- a/infinigen/assets/surfaces/eyeball.py +++ b/infinigen/assets/materials/eyeball.py @@ -7,11 +7,11 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color def shader_eyeball(nw: NodeWrangler, rand=True, coord="X", **input_kwargs): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/surfaces/face_size_visualizer.py b/infinigen/assets/materials/face_size_visualizer.py similarity index 88% rename from infinigen/assets/surfaces/face_size_visualizer.py rename to infinigen/assets/materials/face_size_visualizer.py index 1a947051d..af8f3f02b 100644 --- a/infinigen/assets/surfaces/face_size_visualizer.py +++ b/infinigen/assets/materials/face_size_visualizer.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def shader_material(nw: NodeWrangler): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/surfaces/fish_eye_shader.py b/infinigen/assets/materials/fish_eye_shader.py similarity index 97% rename from infinigen/assets/surfaces/fish_eye_shader.py rename to infinigen/assets/materials/fish_eye_shader.py index c94affdf5..33b17690e 100644 --- a/infinigen/assets/surfaces/fish_eye_shader.py +++ b/infinigen/assets/materials/fish_eye_shader.py @@ -7,14 +7,14 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform as U, normal as N, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface @node_utils.to_nodegroup('nodegroup_rotate2_d_002', singleton=False, type='ShaderNodeTree') def nodegroup_rotate2_d_002(nw: NodeWrangler, rand=True, **input_kwargs): diff --git a/infinigen/assets/surfaces/fishbody.py b/infinigen/assets/materials/fishbody.py similarity index 99% rename from infinigen/assets/surfaces/fishbody.py rename to infinigen/assets/materials/fishbody.py index 1a4f0ebf7..eb29950bf 100644 --- a/infinigen/assets/surfaces/fishbody.py +++ b/infinigen/assets/materials/fishbody.py @@ -8,14 +8,14 @@ import os, sys, random import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform as U, normal as N, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface @node_utils.to_nodegroup('nodegroup_node_grid', singleton=False, type='GeometryNodeTree') diff --git a/infinigen/assets/surfaces/fishfin.py b/infinigen/assets/materials/fishfin.py similarity index 77% rename from infinigen/assets/surfaces/fishfin.py rename to infinigen/assets/materials/fishfin.py index f16043ead..862beef70 100644 --- a/infinigen/assets/surfaces/fishfin.py +++ b/infinigen/assets/materials/fishfin.py @@ -7,14 +7,14 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface import random def shader_fin_regular(nw: NodeWrangler, rand=True, **input_kwargs): @@ -195,74 +195,4 @@ def apply(obj, geo_kwargs={}, shader_kwargs={}, **kwargs): shader = shader_fin_gold else: shader = shader_fin_regular - surface.add_material(obj, shader, input_kwargs=shader_kwargs) - -if __name__ == "__main__": - - for i in range(1): - bpy.ops.wm.open_mainfile(filepath='dev_scene_test_fish_nurb2.blend') - #i = 0 - #for obj in bpy.data.objects: - # if obj.name.find('Nurb') >= 0: - # apply(obj, geo_kwargs={'rand': True}, shader_kwargs={'rand': True, 'goldfish':i%2==0}) - # i += 1 - apply(bpy.data.objects['Sphere'], geo_kwargs={'rand': True}, shader_kwargs={'rand': True, 'goldfish':True}) - apply(bpy.data.objects['Sphere.001'], geo_kwargs={'rand': True}, shader_kwargs={'rand': True, 'goldfish':False}) - fn = os.path.join(os.path.abspath(os.curdir), 'dev_scene_test_fishfin.blend') - bpy.ops.wm.save_as_mainfile(filepath=fn) - ''' - import bpy - from pathlib import Path - import sys, importlib - import numpy as np - - pwd = Path(bpy.data.filepath).parent - if not str(pwd) in sys.path: - sys.path.append(str(pwd)) - - import gin - gin.clear_config() - gin.enter_interactive_mode() - - import generate - gin.parse_config_files_and_bindings(['config/base.gin'], []) - from surfaces.surface import registry - registry.initialize_from_gin() - - from assets.creatures.tools import dev_script - - np.random.seed(1) - - from types import ModuleType - from importlib import reload - import os, sys - - from util.dev import rreload - from assets.creatures import generate - from util import blender - - rreload(generate, 'worldgen') - - from surfaces.surface import registry - gin.parse_config_files_and_bindings(['config/base.gin'], []) - registry.initialize_from_gin() - - blender.clear_scene(keep=['Camera', 'UV', 'Plane', 'Reference', 'Example', 'Dev', 'duck', 'shader_tiger_tuned', 'shader_tiger_tuned_hair']) - - get_factory = lambda _: generate.CreatureFactory(np.random.randint(1e5)) - dev_script.main(get_factory=get_factory, species=4, n=1, one_row=False, spacing=1, - join=True, - remesh=True, - rigging=False, - pose=False, - constraints=False, - animation=False, - materials=False, - skin_sim=False, - particles=False, - smooth_attrs=False - ) - ''' - - - + surface.add_material(obj, shader, input_kwargs=shader_kwargs) \ No newline at end of file diff --git a/infinigen/assets/surfaces/giraffe_attr.py b/infinigen/assets/materials/giraffe_attr.py similarity index 90% rename from infinigen/assets/surfaces/giraffe_attr.py rename to infinigen/assets/materials/giraffe_attr.py index 5d15817df..8e46eeb6b 100644 --- a/infinigen/assets/surfaces/giraffe_attr.py +++ b/infinigen/assets/materials/giraffe_attr.py @@ -7,16 +7,16 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform as U, normal as N, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface -from assets.creatures.nodegroups.shader import nodegroup_color_mask +from infinigen.assets.creatures.util.nodegroups.shader import nodegroup_color_mask def shader_giraffe_attr(nw: NodeWrangler, rand=True, **input_kwargs): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/surfaces/grass_blade_texture.py b/infinigen/assets/materials/grass_blade_texture.py similarity index 97% rename from infinigen/assets/surfaces/grass_blade_texture.py rename to infinigen/assets/materials/grass_blade_texture.py index c94b4c610..27ce9653e 100644 --- a/infinigen/assets/surfaces/grass_blade_texture.py +++ b/infinigen/assets/materials/grass_blade_texture.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface import numpy as np pallete1 = [ ((0.2632, 0.1493, 0.0558, 1.0), 0.0), diff --git a/infinigen/assets/surfaces/horn.py b/infinigen/assets/materials/horn.py similarity index 94% rename from infinigen/assets/surfaces/horn.py rename to infinigen/assets/materials/horn.py index 987ba472b..4a7376cd0 100644 --- a/infinigen/assets/surfaces/horn.py +++ b/infinigen/assets/materials/horn.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def shader_horn(nw: NodeWrangler): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/surfaces/ice.py b/infinigen/assets/materials/ice.py similarity index 91% rename from infinigen/assets/surfaces/ice.py rename to infinigen/assets/materials/ice.py index 648838c12..40c858bb0 100644 --- a/infinigen/assets/surfaces/ice.py +++ b/infinigen/assets/materials/ice.py @@ -6,11 +6,11 @@ import gin from numpy.random import uniform -from nodes.node_wrangler import Nodes -from surfaces import surface -from util.organization import SurfaceTypes -from util.math import FixedSeed -from util.random import random_color_neighbour +from infinigen.core.nodes.node_wrangler import Nodes +from infinigen.core import surface +from infinigen.core.util.organization import SurfaceTypes +from infinigen.core.util.math import FixedSeed +from infinigen.core.util.random import random_color_neighbour type = SurfaceTypes.SDFPerturb mod_name = "geo_ice" @@ -19,10 +19,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def shader_ice(nw: NodeWrangler): geometry = nw.new_node(Nodes.NewGeometry) diff --git a/infinigen/assets/surfaces/lava.py b/infinigen/assets/materials/lava.py similarity index 97% rename from infinigen/assets/surfaces/lava.py rename to infinigen/assets/materials/lava.py index 9f2c2b811..7fa252cd3 100644 --- a/infinigen/assets/surfaces/lava.py +++ b/infinigen/assets/materials/lava.py @@ -9,14 +9,14 @@ import gin from mathutils import Vector -from nodes import node_utils -from nodes.node_wrangler import Nodes +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.node_wrangler import Nodes from numpy.random import uniform -from surfaces import surface -from util.organization import SurfaceTypes -from terrain.utils import drive_param -from util.math import FixedSeed -from util.random import random_color_neighbour +from infinigen.core import surface +from infinigen.core.util.organization import SurfaceTypes +from infinigen.terrain.utils import drive_param +from infinigen.core.util.math import FixedSeed +from infinigen.core.util.random import random_color_neighbour type = SurfaceTypes.BlenderDisplacement mod_name = "lava_geo" diff --git a/infinigen/assets/surfaces/mountain.py b/infinigen/assets/materials/mountain.py similarity index 96% rename from infinigen/assets/surfaces/mountain.py rename to infinigen/assets/materials/mountain.py index 0b53f71f6..c7ad82cf0 100644 --- a/infinigen/assets/surfaces/mountain.py +++ b/infinigen/assets/materials/mountain.py @@ -7,14 +7,14 @@ import gin import numpy as np -from nodes.node_wrangler import Nodes, NodeWrangler -from surfaces import surface -from util.organization import SurfaceTypes -from util.math import FixedSeed -from util.random import clip_hsv, random_color, random_color_neighbour -from util.random import random_general as rg - -from terrain.land_process.snowfall import snowfall_params +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core import surface +from infinigen.core.util.organization import SurfaceTypes +from infinigen.core.util.math import FixedSeed +from infinigen.core.util.random import clip_hsv, random_color, random_color_neighbour +from infinigen.core.util.random import random_general as rg + +from infinigen.terrain.land_process.snowfall import snowfall_params type = SurfaceTypes.SDFPerturb mod_name = "geo_MOUNTAIN" diff --git a/infinigen/assets/surfaces/mud.py b/infinigen/assets/materials/mud.py similarity index 95% rename from infinigen/assets/surfaces/mud.py rename to infinigen/assets/materials/mud.py index 99929ff57..231e94bd5 100644 --- a/infinigen/assets/surfaces/mud.py +++ b/infinigen/assets/materials/mud.py @@ -6,12 +6,12 @@ import bpy import mathutils from numpy.random import uniform as U, normal as N, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface -from util.organization import SurfaceTypes -from util.math import FixedSeed +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface +from infinigen.core.util.organization import SurfaceTypes +from infinigen.core.util.math import FixedSeed import gin type = SurfaceTypes.SDFPerturb diff --git a/infinigen/assets/surfaces/new_whitewater.py b/infinigen/assets/materials/new_whitewater.py similarity index 84% rename from infinigen/assets/surfaces/new_whitewater.py rename to infinigen/assets/materials/new_whitewater.py index 67766c0f7..091a4c6ee 100644 --- a/infinigen/assets/surfaces/new_whitewater.py +++ b/infinigen/assets/materials/new_whitewater.py @@ -6,11 +6,11 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface -from util.random import random_color_neighbour +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface +from infinigen.core.util.random import random_color_neighbour def new_whitewater(nw: NodeWrangler): # Code generated using version 2.6.3 of the node_transpiler diff --git a/infinigen/assets/surfaces/nose.py b/infinigen/assets/materials/nose.py similarity index 88% rename from infinigen/assets/surfaces/nose.py rename to infinigen/assets/materials/nose.py index 75a6c9b4e..533562cc0 100644 --- a/infinigen/assets/surfaces/nose.py +++ b/infinigen/assets/materials/nose.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform as U, normal as N, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def shader_nose(nw: NodeWrangler): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/surfaces/reptile_brown_circle_attr.py b/infinigen/assets/materials/reptile_brown_circle_attr.py similarity index 97% rename from infinigen/assets/surfaces/reptile_brown_circle_attr.py rename to infinigen/assets/materials/reptile_brown_circle_attr.py index 4cdd1adf1..7aac64631 100644 --- a/infinigen/assets/surfaces/reptile_brown_circle_attr.py +++ b/infinigen/assets/materials/reptile_brown_circle_attr.py @@ -7,16 +7,16 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.creatures.nodegroups.shader import nodegroup_color_mask +from infinigen.assets.creatures.util.nodegroups.shader import nodegroup_color_mask def shader_brown_circle(nw: NodeWrangler, rand=True, **input_kwargs): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/surfaces/reptile_gray_attr.py b/infinigen/assets/materials/reptile_gray_attr.py similarity index 94% rename from infinigen/assets/surfaces/reptile_gray_attr.py rename to infinigen/assets/materials/reptile_gray_attr.py index c98b0975c..6d4bcb4dd 100644 --- a/infinigen/assets/surfaces/reptile_gray_attr.py +++ b/infinigen/assets/materials/reptile_gray_attr.py @@ -7,16 +7,16 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.creatures.nodegroups.shader import nodegroup_color_mask +from infinigen.assets.creatures.util.nodegroups.shader import nodegroup_color_mask def shader_gray(nw: NodeWrangler, rand=True, **input_kwargs): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/surfaces/reptile_two_color_attr.py b/infinigen/assets/materials/reptile_two_color_attr.py similarity index 96% rename from infinigen/assets/surfaces/reptile_two_color_attr.py rename to infinigen/assets/materials/reptile_two_color_attr.py index cbfebe3c8..6c52d29d7 100644 --- a/infinigen/assets/surfaces/reptile_two_color_attr.py +++ b/infinigen/assets/materials/reptile_two_color_attr.py @@ -7,16 +7,16 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.creatures.nodegroups.shader import nodegroup_color_mask +from infinigen.assets.creatures.util.nodegroups.shader import nodegroup_color_mask def shader_two_color(nw: NodeWrangler, rand=True, **input_kwargs): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/surfaces/river_water.py b/infinigen/assets/materials/river_water.py similarity index 97% rename from infinigen/assets/surfaces/river_water.py rename to infinigen/assets/materials/river_water.py index 388125c03..b565d1dd0 100644 --- a/infinigen/assets/surfaces/river_water.py +++ b/infinigen/assets/materials/river_water.py @@ -6,12 +6,12 @@ import bpy import mathutils from numpy.random import normal as N -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from util.random import random_color_neighbour +from infinigen.core.util.random import random_color_neighbour def shader_river_water(nw: NodeWrangler): # Code generated using version 2.6.3 of the node_transpiler diff --git a/infinigen/assets/surfaces/sand.py b/infinigen/assets/materials/sand.py similarity index 95% rename from infinigen/assets/surfaces/sand.py rename to infinigen/assets/materials/sand.py index a77f97230..6fa798412 100644 --- a/infinigen/assets/surfaces/sand.py +++ b/infinigen/assets/materials/sand.py @@ -8,11 +8,11 @@ import gin from mathutils import Vector -from nodes.node_wrangler import Nodes -from surfaces import surface -from util.organization import SurfaceTypes -from util.math import FixedSeed -from util.random import random_general as rg +from infinigen.core.nodes.node_wrangler import Nodes +from infinigen.core import surface +from infinigen.core.util.organization import SurfaceTypes +from infinigen.core.util.math import FixedSeed +from infinigen.core.util.random import random_general as rg type = SurfaceTypes.SDFPerturb mod_name = "geo_SAND" diff --git a/infinigen/assets/surfaces/sandstone.py b/infinigen/assets/materials/sandstone.py similarity index 98% rename from infinigen/assets/surfaces/sandstone.py rename to infinigen/assets/materials/sandstone.py index af2a4a898..448d7afa6 100644 --- a/infinigen/assets/surfaces/sandstone.py +++ b/infinigen/assets/materials/sandstone.py @@ -7,13 +7,13 @@ # Code generated using version v2.0.0 of the node_transpiler import gin -from nodes import node_utils -from nodes.node_wrangler import Nodes +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.node_wrangler import Nodes from numpy.random import uniform -from surfaces import surface -from util.organization import SurfaceTypes -from util.random import random_color_neighbour -from util.random import random_general as rg +from infinigen.core import surface +from infinigen.core.util.organization import SurfaceTypes +from infinigen.core.util.random import random_color_neighbour +from infinigen.core.util.random import random_general as rg from .mountain import geo_MOUNTAIN_general from mathutils import Vector diff --git a/infinigen/assets/surfaces/scale.py b/infinigen/assets/materials/scale.py similarity index 98% rename from infinigen/assets/surfaces/scale.py rename to infinigen/assets/materials/scale.py index 32be71e7f..fb8dfeb17 100644 --- a/infinigen/assets/surfaces/scale.py +++ b/infinigen/assets/materials/scale.py @@ -8,13 +8,13 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import normal as normal_func -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core import surface import random def shader_scale(nw, rand=True, **input_kwargs): diff --git a/infinigen/assets/surfaces/simple_brownish.py b/infinigen/assets/materials/simple_brownish.py similarity index 86% rename from infinigen/assets/surfaces/simple_brownish.py rename to infinigen/assets/materials/simple_brownish.py index 319e04729..b8e4a508c 100644 --- a/infinigen/assets/surfaces/simple_brownish.py +++ b/infinigen/assets/materials/simple_brownish.py @@ -5,10 +5,10 @@ from numpy.random import uniform as U, normal as N, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def shader_simple_brown(nw: NodeWrangler): diff --git a/infinigen/assets/surfaces/simple_greenery.py b/infinigen/assets/materials/simple_greenery.py similarity index 90% rename from infinigen/assets/surfaces/simple_greenery.py rename to infinigen/assets/materials/simple_greenery.py index 60f16e049..596eeaa55 100644 --- a/infinigen/assets/surfaces/simple_greenery.py +++ b/infinigen/assets/materials/simple_greenery.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform as U, normal as N, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def shader_simple_greenery(nw: NodeWrangler): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/surfaces/simple_whitish.py b/infinigen/assets/materials/simple_whitish.py similarity index 87% rename from infinigen/assets/surfaces/simple_whitish.py rename to infinigen/assets/materials/simple_whitish.py index 87f852075..deff92475 100644 --- a/infinigen/assets/surfaces/simple_whitish.py +++ b/infinigen/assets/materials/simple_whitish.py @@ -5,10 +5,10 @@ from numpy.random import uniform as U, normal as N, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def shader_simple_white(nw: NodeWrangler): diff --git a/infinigen/assets/surfaces/slimy.py b/infinigen/assets/materials/slimy.py similarity index 95% rename from infinigen/assets/surfaces/slimy.py rename to infinigen/assets/materials/slimy.py index 35a4e2a5b..a5c8926e5 100644 --- a/infinigen/assets/surfaces/slimy.py +++ b/infinigen/assets/materials/slimy.py @@ -7,12 +7,12 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform, normal -from nodes.node_wrangler import Nodes, NodeWrangler -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core import surface import random def shader_slimy(nw, rand=False, **input_kwargs): diff --git a/infinigen/assets/surfaces/smoke_material.py b/infinigen/assets/materials/smoke_material.py similarity index 74% rename from infinigen/assets/surfaces/smoke_material.py rename to infinigen/assets/materials/smoke_material.py index d596dd9c0..6ad50cc0d 100644 --- a/infinigen/assets/surfaces/smoke_material.py +++ b/infinigen/assets/materials/smoke_material.py @@ -7,12 +7,12 @@ import bpy import mathutils from numpy.random import uniform, normal -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface import numpy as np -from util.random import random_color_neighbour +from infinigen.core.util.random import random_color_neighbour def smoke_material(nw): # Code generated using version 2.3.2 of the node_transpiler diff --git a/infinigen/assets/surfaces/snake_plant.py b/infinigen/assets/materials/snake_plant.py similarity index 96% rename from infinigen/assets/surfaces/snake_plant.py rename to infinigen/assets/materials/snake_plant.py index 8dda84f2d..2ba988b7c 100644 --- a/infinigen/assets/surfaces/snake_plant.py +++ b/infinigen/assets/materials/snake_plant.py @@ -8,10 +8,10 @@ import bpy import mathutils from numpy.random import uniform as U, normal as N, randint, choice -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import hsv2rgba -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import hsv2rgba +from infinigen.core import surface import numpy as np import colorsys diff --git a/infinigen/assets/surfaces/snake_scale.py b/infinigen/assets/materials/snake_scale.py similarity index 98% rename from infinigen/assets/surfaces/snake_scale.py rename to infinigen/assets/materials/snake_scale.py index 0b6cb7053..576fb3a55 100644 --- a/infinigen/assets/surfaces/snake_scale.py +++ b/infinigen/assets/materials/snake_scale.py @@ -8,11 +8,11 @@ import mathutils import random from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface -from surfaces.templates import snake_shaders +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface +from infinigen.assets.materials import snake_shaders @node_utils.to_nodegroup('nodegroup_scale_shape', singleton=False, type='GeometryNodeTree') def nodegroup_scale_shape(nw: NodeWrangler): diff --git a/infinigen/assets/surfaces/snake_shaders.py b/infinigen/assets/materials/snake_shaders.py similarity index 97% rename from infinigen/assets/surfaces/snake_shaders.py rename to infinigen/assets/materials/snake_shaders.py index f8f2d29f4..0550fd13d 100644 --- a/infinigen/assets/surfaces/snake_shaders.py +++ b/infinigen/assets/materials/snake_shaders.py @@ -8,11 +8,11 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface import random def shader_black_white_snake(nw: NodeWrangler, rand=True): diff --git a/infinigen/assets/surfaces/snow.py b/infinigen/assets/materials/snow.py similarity index 96% rename from infinigen/assets/surfaces/snow.py rename to infinigen/assets/materials/snow.py index b7f74daaa..2baf3160f 100644 --- a/infinigen/assets/surfaces/snow.py +++ b/infinigen/assets/materials/snow.py @@ -2,9 +2,9 @@ # adapted from Blender Real Snow add-on https://docs.blender.org/manual/en/latest/addons/object/real_snow.html # License: GPL -from nodes.node_wrangler import Nodes -from surfaces import surface -from util.organization import SurfaceTypes +from infinigen.core.nodes.node_wrangler import Nodes +from infinigen.core import surface +from infinigen.core.util.organization import SurfaceTypes type = SurfaceTypes.SDFPerturb mod_name = "geo_snowtexture" diff --git a/infinigen/assets/surfaces/soil.py b/infinigen/assets/materials/soil.py similarity index 97% rename from infinigen/assets/surfaces/soil.py rename to infinigen/assets/materials/soil.py index d02e537ea..48c7e7077 100644 --- a/infinigen/assets/surfaces/soil.py +++ b/infinigen/assets/materials/soil.py @@ -5,13 +5,13 @@ import gin -from nodes import node_utils -from nodes.node_wrangler import Nodes +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.node_wrangler import Nodes from numpy.random import uniform -from surfaces import surface -from util.organization import SurfaceTypes -from util.math import FixedSeed -from util.random import random_color_neighbour +from infinigen.core import surface +from infinigen.core.util.organization import SurfaceTypes +from infinigen.core.util.math import FixedSeed +from infinigen.core.util.random import random_color_neighbour type = SurfaceTypes.SDFPerturb mod_name = "geometry_soil" diff --git a/infinigen/assets/surfaces/spider_plant.py b/infinigen/assets/materials/spider_plant.py similarity index 85% rename from infinigen/assets/surfaces/spider_plant.py rename to infinigen/assets/materials/spider_plant.py index 10553b740..9d94a3dc6 100644 --- a/infinigen/assets/surfaces/spider_plant.py +++ b/infinigen/assets/materials/spider_plant.py @@ -4,10 +4,10 @@ # Authors: Beining Han from numpy.random import uniform, normal , randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface def shader_spider_plant(nw: NodeWrangler): diff --git a/infinigen/assets/surfaces/spot_sparse_attr.py b/infinigen/assets/materials/spot_sparse_attr.py similarity index 93% rename from infinigen/assets/surfaces/spot_sparse_attr.py rename to infinigen/assets/materials/spot_sparse_attr.py index 5f981bce6..1c455e1cf 100644 --- a/infinigen/assets/surfaces/spot_sparse_attr.py +++ b/infinigen/assets/materials/spot_sparse_attr.py @@ -7,16 +7,16 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform as U, normal as N, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface -from assets.creatures.nodegroups.shader import nodegroup_color_mask +from infinigen.assets.creatures.util.nodegroups.shader import nodegroup_color_mask def shader_spots_sparse_attr(nw: NodeWrangler, rand=True, **input_kwargs): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/surfaces/stone.py b/infinigen/assets/materials/stone.py similarity index 97% rename from infinigen/assets/surfaces/stone.py rename to infinigen/assets/materials/stone.py index 141749460..f05b5a392 100644 --- a/infinigen/assets/surfaces/stone.py +++ b/infinigen/assets/materials/stone.py @@ -9,12 +9,12 @@ import bpy import gin -from nodes.node_wrangler import Nodes +from infinigen.core.nodes.node_wrangler import Nodes from numpy.random import uniform, normal as N -from surfaces import surface -from surfaces.surface_utils import sample_color, sample_ratio -from util.organization import SurfaceTypes -from util.math import FixedSeed +from infinigen.core import surface +from infinigen.assets.materials.utils.surface_utils import sample_color, sample_ratio +from infinigen.core.util.organization import SurfaceTypes +from infinigen.core.util.math import FixedSeed from .mountain import geo_MOUNTAIN_general diff --git a/infinigen/assets/surfaces/succulent.py b/infinigen/assets/materials/succulent.py similarity index 98% rename from infinigen/assets/surfaces/succulent.py rename to infinigen/assets/materials/succulent.py index 1de1e9c58..cec5adbe2 100644 --- a/infinigen/assets/surfaces/succulent.py +++ b/infinigen/assets/materials/succulent.py @@ -5,11 +5,11 @@ # Acknowledgements: This file draws inspiration from https://blenderartists.org/t/extrude-face-along-curve-with-geometry-nodes/1432653/3 from numpy.random import uniform, normal , randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface -from nodes.color import hsv2rgba +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface +from infinigen.core.nodes.color import hsv2rgba diff --git a/infinigen/assets/surfaces/three_color_spots.py b/infinigen/assets/materials/three_color_spots.py similarity index 97% rename from infinigen/assets/surfaces/three_color_spots.py rename to infinigen/assets/materials/three_color_spots.py index c1037d376..93ef81ad7 100644 --- a/infinigen/assets/surfaces/three_color_spots.py +++ b/infinigen/assets/materials/three_color_spots.py @@ -7,12 +7,12 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform, normal -from nodes.node_wrangler import Nodes, NodeWrangler -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core import surface def shader_spot(nw, rand=True, **input_kwargs): diff --git a/infinigen/assets/surfaces/tiger_attr.py b/infinigen/assets/materials/tiger_attr.py similarity index 90% rename from infinigen/assets/surfaces/tiger_attr.py rename to infinigen/assets/materials/tiger_attr.py index 466369a10..85dc444c8 100644 --- a/infinigen/assets/surfaces/tiger_attr.py +++ b/infinigen/assets/materials/tiger_attr.py @@ -8,25 +8,25 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform as U, normal as N, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category, hsv2rgba -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category, hsv2rgba +from infinigen.core import surface -from assets.creatures.nodegroups.shader import nodegroup_color_mask +from infinigen.assets.creatures.util.nodegroups.shader import nodegroup_color_mask import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from assets.creatures.nodegroups.shader import nodegroup_color_mask +from infinigen.assets.creatures.util.nodegroups.shader import nodegroup_color_mask @node_utils.to_nodegroup('nodegroup_tiger_fac', singleton=False, type='ShaderNodeTree') def nodegroup_tiger_fac(nw: NodeWrangler): diff --git a/infinigen/assets/surfaces/tongue.py b/infinigen/assets/materials/tongue.py similarity index 86% rename from infinigen/assets/surfaces/tongue.py rename to infinigen/assets/materials/tongue.py index 895dc8896..d3e5fe489 100644 --- a/infinigen/assets/surfaces/tongue.py +++ b/infinigen/assets/materials/tongue.py @@ -7,10 +7,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def shader_tongue(nw: NodeWrangler): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/surfaces/two_color_spots.py b/infinigen/assets/materials/two_color_spots.py similarity index 95% rename from infinigen/assets/surfaces/two_color_spots.py rename to infinigen/assets/materials/two_color_spots.py index b9efa6362..b34560b6d 100644 --- a/infinigen/assets/surfaces/two_color_spots.py +++ b/infinigen/assets/materials/two_color_spots.py @@ -7,12 +7,12 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform, normal -from nodes.node_wrangler import Nodes, NodeWrangler -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core import surface def shader_two_color_spots(nw, rand=True, **input_kwargs): attribute = nw.new_node(Nodes.Attribute, diff --git a/infinigen/assets/surfaces/twocolorz.py b/infinigen/assets/materials/twocolorz.py similarity index 93% rename from infinigen/assets/surfaces/twocolorz.py rename to infinigen/assets/materials/twocolorz.py index de00903ab..6e567e09b 100644 --- a/infinigen/assets/surfaces/twocolorz.py +++ b/infinigen/assets/materials/twocolorz.py @@ -7,12 +7,12 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform, normal -from nodes.node_wrangler import Nodes, NodeWrangler -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core import surface def shader_twocolorz(nw, rand=True, **input_kwargs): diff --git a/infinigen/assets/materials/utils/__init__.py b/infinigen/assets/materials/utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/infinigen/core/surfaces/surface_utils.py b/infinigen/assets/materials/utils/surface_utils.py similarity index 97% rename from infinigen/core/surfaces/surface_utils.py rename to infinigen/assets/materials/utils/surface_utils.py index 43b0059b3..ca3d4cecc 100644 --- a/infinigen/core/surfaces/surface_utils.py +++ b/infinigen/assets/materials/utils/surface_utils.py @@ -7,10 +7,10 @@ import random import math -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface @node_utils.to_nodegroup('nodegroup_norm_value', singleton=False, type='GeometryNodeTree') def nodegroup_norm_value(nw: NodeWrangler): diff --git a/infinigen/assets/surfaces/water.py b/infinigen/assets/materials/water.py similarity index 96% rename from infinigen/assets/surfaces/water.py rename to infinigen/assets/materials/water.py index 31eabe665..7d90f3470 100644 --- a/infinigen/assets/surfaces/water.py +++ b/infinigen/assets/materials/water.py @@ -11,15 +11,15 @@ import gin import numpy as np from mathutils import Vector -from nodes.node_wrangler import Nodes +from infinigen.core.nodes.node_wrangler import Nodes from numpy.random import normal, uniform -from surfaces import surface -from terrain.assets.ocean import ocean_asset, spatial_size -from util.organization import SurfaceTypes -from terrain.utils import drive_param -from util.math import FixedSeed -from util.random import random_general as rg -from util.organization import Attributes +from infinigen.core import surface +from infinigen.terrain.assets.ocean import ocean_asset, spatial_size +from infinigen.core.util.organization import SurfaceTypes +from infinigen.terrain.utils import drive_param +from infinigen.core.util.math import FixedSeed +from infinigen.core.util.random import random_general as rg +from infinigen.core.util.organization import Attributes type = SurfaceTypes.BlenderDisplacement mod_name = "geo_water" diff --git a/infinigen/assets/surfaces/waterfall_material.py b/infinigen/assets/materials/waterfall_material.py similarity index 94% rename from infinigen/assets/surfaces/waterfall_material.py rename to infinigen/assets/materials/waterfall_material.py index 0a0f3c67f..1d15bb92a 100644 --- a/infinigen/assets/surfaces/waterfall_material.py +++ b/infinigen/assets/materials/waterfall_material.py @@ -6,10 +6,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def waterfall_shader(nw: NodeWrangler): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/surfaces/wood.py b/infinigen/assets/materials/wood.py similarity index 92% rename from infinigen/assets/surfaces/wood.py rename to infinigen/assets/materials/wood.py index 3a826cca3..b378f8534 100644 --- a/infinigen/assets/surfaces/wood.py +++ b/infinigen/assets/materials/wood.py @@ -7,14 +7,14 @@ import os, sys import numpy as np import math as ma -from surfaces.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise +from infinigen.assets.materials.utils.surface_utils import clip, sample_range, sample_ratio, sample_color, geo_voronoi_noise import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface def shader_wood(nw: NodeWrangler, rand=False, **input_kwargs): # Code generated using version 2.4.3 of the node_transpiler diff --git a/infinigen/assets/underwater/mollusk/__init__.py b/infinigen/assets/mollusk/__init__.py similarity index 100% rename from infinigen/assets/underwater/mollusk/__init__.py rename to infinigen/assets/mollusk/__init__.py diff --git a/infinigen/assets/underwater/mollusk/base.py b/infinigen/assets/mollusk/base.py similarity index 90% rename from infinigen/assets/underwater/mollusk/base.py rename to infinigen/assets/mollusk/base.py index 76adbae36..d3528b188 100644 --- a/infinigen/assets/underwater/mollusk/base.py +++ b/infinigen/assets/mollusk/base.py @@ -6,7 +6,7 @@ import bpy -from placement.factory import AssetFactory +from infinigen.core.placement.factory import AssetFactory class BaseMolluskFactory(AssetFactory): diff --git a/infinigen/assets/underwater/mollusk/generate.py b/infinigen/assets/mollusk/generate.py similarity index 93% rename from infinigen/assets/underwater/mollusk/generate.py rename to infinigen/assets/mollusk/generate.py index ddbcc4245..dd914b8cc 100644 --- a/infinigen/assets/underwater/mollusk/generate.py +++ b/infinigen/assets/mollusk/generate.py @@ -10,17 +10,17 @@ import numpy as np from numpy.random import uniform -import util.blender as butil +import infinigen.core.util.blender as butil from .base import BaseMolluskFactory from .shell import ShellBaseFactory, ScallopBaseFactory, ClamBaseFactory, MusselBaseFactory from .snail import SnailBaseFactory, ConchBaseFactory, AugerBaseFactory, VoluteBaseFactory, NautilusBaseFactory -from assets.utils.misc import build_color_ramp, log_uniform +from infinigen.assets.utils.misc import build_color_ramp, log_uniform from ..utils.decorate import assign_material, subsurface2face_size -from nodes.node_wrangler import NodeWrangler, Nodes -from surfaces import surface -from placement.factory import AssetFactory -from util.math import FixedSeed -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.nodes.node_wrangler import NodeWrangler, Nodes +from infinigen.core import surface +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util.math import FixedSeed +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class MolluskFactory(AssetFactory): def __init__(self, factory_seed, coarse=False, factory_method=None): diff --git a/infinigen/assets/underwater/mollusk/shell.py b/infinigen/assets/mollusk/shell.py similarity index 88% rename from infinigen/assets/underwater/mollusk/shell.py rename to infinigen/assets/mollusk/shell.py index 6f36bbdf0..443332e8e 100644 --- a/infinigen/assets/underwater/mollusk/shell.py +++ b/infinigen/assets/mollusk/shell.py @@ -8,18 +8,18 @@ import numpy as np from numpy.random import normal, uniform -import util.blender as butil -from assets.creatures.animation.driver_repeated import repeated_driver -from assets.mollusk.base import BaseMolluskFactory -from assets.utils.object import mesh2obj, data2mesh, new_circle -from assets.utils.draw import shape_by_angles -from assets.utils.misc import log_uniform -from assets.utils.decorate import displace_vertices, join_objects -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from util.math import FixedSeed -from assets.utils.tag import tag_object, tag_nodegroup +import infinigen.core.util.blender as butil +from infinigen.assets.creatures.util.animation.driver_repeated import repeated_driver +from infinigen.assets.mollusk.base import BaseMolluskFactory +from infinigen.assets.utils.object import mesh2obj, data2mesh, new_circle +from infinigen.assets.utils.draw import shape_by_angles +from infinigen.assets.utils.misc import log_uniform +from infinigen.assets.utils.decorate import displace_vertices, join_objects +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.core.util.math import FixedSeed +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class ShellBaseFactory(BaseMolluskFactory): diff --git a/infinigen/assets/underwater/mollusk/snail.py b/infinigen/assets/mollusk/snail.py similarity index 93% rename from infinigen/assets/underwater/mollusk/snail.py rename to infinigen/assets/mollusk/snail.py index 8c05f530e..870c3724b 100644 --- a/infinigen/assets/underwater/mollusk/snail.py +++ b/infinigen/assets/mollusk/snail.py @@ -8,15 +8,15 @@ import numpy as np from numpy.random import uniform -import util.blender as butil -from assets.mollusk.base import BaseMolluskFactory -from assets.utils.object import center, mesh2obj, data2mesh, new_empty -from assets.utils.misc import log_uniform -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from util.math import FixedSeed -from assets.utils.tag import tag_object, tag_nodegroup +import infinigen.core.util.blender as butil +from infinigen.assets.mollusk.base import BaseMolluskFactory +from infinigen.assets.utils.object import center, mesh2obj, data2mesh, new_empty +from infinigen.assets.utils.misc import log_uniform +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.core.util.math import FixedSeed +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class SnailBaseFactory(BaseMolluskFactory): freq = 256 diff --git a/infinigen/assets/monocot/agave.py b/infinigen/assets/monocot/agave.py index 9bb90ed13..5b8abbd54 100644 --- a/infinigen/assets/monocot/agave.py +++ b/infinigen/assets/monocot/agave.py @@ -10,15 +10,15 @@ import numpy as np from numpy.random import uniform -import util.blender as butil -from assets.monocot.growth import MonocotGrowthFactory -from assets.utils.decorate import add_distance_to_boundary, join_objects, displace_vertices -from assets.utils.draw import cut_plane, leaf -from assets.utils.misc import log_uniform -from surfaces.surface import shaderfunc_to_material -from util.blender import deep_clone_obj -from util.math import FixedSeed -from assets.utils.tag import tag_object, tag_nodegroup +import infinigen.core.util.blender as butil +from infinigen.assets.monocot.growth import MonocotGrowthFactory +from infinigen.assets.utils.decorate import add_distance_to_boundary, join_objects, displace_vertices +from infinigen.assets.utils.draw import cut_plane, leaf +from infinigen.assets.utils.misc import log_uniform +from infinigen.core.surface import shaderfunc_to_material +from infinigen.core.util.blender import deep_clone_obj +from infinigen.core.util.math import FixedSeed +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class AgaveMonocotFactory(MonocotGrowthFactory): use_distance = True diff --git a/infinigen/assets/monocot/banana.py b/infinigen/assets/monocot/banana.py index 8f01ccb5a..356ed705b 100644 --- a/infinigen/assets/monocot/banana.py +++ b/infinigen/assets/monocot/banana.py @@ -8,16 +8,16 @@ import numpy as np from numpy.random import uniform -from assets.utils.decorate import displace_vertices, join_objects, read_co -from assets.utils.draw import bezier_curve, leaf -from assets.utils.nodegroup import geo_radius -from assets.utils.object import origin2lowest -from surfaces import surface -from assets.monocot.growth import MonocotGrowthFactory -from assets.utils.misc import log_uniform -from util import blender as butil -from util.math import FixedSeed -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.decorate import displace_vertices, join_objects, read_co +from infinigen.assets.utils.draw import bezier_curve, leaf +from infinigen.assets.utils.nodegroup import geo_radius +from infinigen.assets.utils.object import origin2lowest +from infinigen.core import surface +from infinigen.assets.monocot.growth import MonocotGrowthFactory +from infinigen.assets.utils.misc import log_uniform +from infinigen.core.util import blender as butil +from infinigen.core.util.math import FixedSeed +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class BananaMonocotFactory(MonocotGrowthFactory): diff --git a/infinigen/assets/monocot/generate.py b/infinigen/assets/monocot/generate.py index 5e0405482..4ce3b293d 100644 --- a/infinigen/assets/monocot/generate.py +++ b/infinigen/assets/monocot/generate.py @@ -14,11 +14,11 @@ from .grasses import GrassesMonocotFactory, MaizeMonocotFactory, WheatMonocotFactory from .growth import MonocotGrowthFactory from .tussock import TussockMonocotFactory -from placement.factory import AssetFactory -from util.math import FixedSeed +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util.math import FixedSeed from ..utils.decorate import join_objects from ..utils.mesh import polygon_angles -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class MonocotFactory(AssetFactory): max_cluster = 10 diff --git a/infinigen/assets/monocot/grasses.py b/infinigen/assets/monocot/grasses.py index 79e41babb..f2e4e0da0 100644 --- a/infinigen/assets/monocot/grasses.py +++ b/infinigen/assets/monocot/grasses.py @@ -10,23 +10,23 @@ import numpy as np from numpy.random import uniform -from assets.monocot.growth import MonocotGrowthFactory -from assets.utils.decorate import assign_material, join_objects, remove_vertices, write_attribute, \ +from infinigen.assets.monocot.growth import MonocotGrowthFactory +from infinigen.assets.utils.decorate import assign_material, join_objects, remove_vertices, write_attribute, \ write_material_index -from assets.utils.draw import bezier_curve, leaf, spin -from assets.utils.mesh import polygon_angles -from assets.utils.misc import log_uniform - -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler - -from placement.factory import AssetFactory, make_asset_collection -from placement.detail import remesh_with_attrs -from surfaces import surface -from surfaces.surface import read_attr_data, shaderfunc_to_material -from util import blender as butil -from util.math import FixedSeed -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.draw import bezier_curve, leaf, spin +from infinigen.assets.utils.mesh import polygon_angles +from infinigen.assets.utils.misc import log_uniform + +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler + +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.core.placement.detail import remesh_with_attrs +from infinigen.core import surface +from infinigen.core.surface import read_attr_data, shaderfunc_to_material +from infinigen.core.util import blender as butil +from infinigen.core.util.math import FixedSeed +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class GrassesMonocotFactory(MonocotGrowthFactory): diff --git a/infinigen/assets/monocot/growth.py b/infinigen/assets/monocot/growth.py index 40a027050..bc843034b 100644 --- a/infinigen/assets/monocot/growth.py +++ b/infinigen/assets/monocot/growth.py @@ -12,21 +12,21 @@ import numpy as np from numpy.random import uniform -from assets.utils.decorate import assign_material, displace_vertices, geo_extension, join_objects -from assets.utils.misc import build_color_ramp, log_uniform -from assets.utils.nodegroup import geo_radius -from placement.detail import adapt_mesh_resolution -from surfaces.surface import shaderfunc_to_material -from util import blender as butil -from assets.utils.object import data2mesh, mesh2obj, new_cube, origin2leftmost -from nodes.node_info import Nodes -from placement.factory import AssetFactory, make_asset_collection -from nodes.node_wrangler import NodeWrangler -from placement.factory import AssetFactory -from surfaces import surface -from util.blender import deep_clone_obj -from util.math import FixedSeed -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.decorate import assign_material, displace_vertices, geo_extension, join_objects +from infinigen.assets.utils.misc import build_color_ramp, log_uniform +from infinigen.assets.utils.nodegroup import geo_radius +from infinigen.core.placement.detail import adapt_mesh_resolution +from infinigen.core.surface import shaderfunc_to_material +from infinigen.core.util import blender as butil +from infinigen.assets.utils.object import data2mesh, mesh2obj, new_cube, origin2leftmost +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.factory import AssetFactory +from infinigen.core import surface +from infinigen.core.util.blender import deep_clone_obj +from infinigen.core.util.math import FixedSeed +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class MonocotGrowthFactory(AssetFactory): use_distance = False diff --git a/infinigen/assets/monocot/kelp.py b/infinigen/assets/monocot/kelp.py index 9168b4a03..bb966e202 100644 --- a/infinigen/assets/monocot/kelp.py +++ b/infinigen/assets/monocot/kelp.py @@ -8,16 +8,16 @@ import numpy as np from numpy.random import uniform -import util.blender as butil -from assets.creatures.animation.driver_repeated import repeated_driver -from assets.monocot.growth import MonocotGrowthFactory -from assets.utils.draw import bezier_curve, leaf -from assets.utils.decorate import assign_material, join_objects -from assets.utils.misc import log_uniform -from assets.utils.object import origin2leftmost -from nodes.node_wrangler import NodeWrangler -from placement.detail import remesh_with_attrs -from util.math import FixedSeed +import infinigen.core.util.blender as butil +from infinigen.assets.creatures.util.animation.driver_repeated import repeated_driver +from infinigen.assets.monocot.growth import MonocotGrowthFactory +from infinigen.assets.utils.draw import bezier_curve, leaf +from infinigen.assets.utils.decorate import assign_material, join_objects +from infinigen.assets.utils.misc import log_uniform +from infinigen.assets.utils.object import origin2leftmost +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.detail import remesh_with_attrs +from infinigen.core.util.math import FixedSeed class KelpMonocotFactory(MonocotGrowthFactory): diff --git a/infinigen/assets/monocot/pinecone.py b/infinigen/assets/monocot/pinecone.py index 868d327ac..bb60c3db4 100644 --- a/infinigen/assets/monocot/pinecone.py +++ b/infinigen/assets/monocot/pinecone.py @@ -10,17 +10,17 @@ import numpy as np from numpy.random import uniform -import util.blender as butil -from assets.monocot.growth import MonocotGrowthFactory -from assets.utils.object import new_circle -from assets.utils.draw import shape_by_angles, shape_by_xs -from assets.utils.misc import build_color_ramp, log_uniform -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from placement.detail import remesh_with_attrs -from surfaces.surface import shaderfunc_to_material -from util.math import FixedSeed -from assets.utils.tag import tag_object, tag_nodegroup +import infinigen.core.util.blender as butil +from infinigen.assets.monocot.growth import MonocotGrowthFactory +from infinigen.assets.utils.object import new_circle +from infinigen.assets.utils.draw import shape_by_angles, shape_by_xs +from infinigen.assets.utils.misc import build_color_ramp, log_uniform +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.detail import remesh_with_attrs +from infinigen.core.surface import shaderfunc_to_material +from infinigen.core.util.math import FixedSeed +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class PineconeFactory(MonocotGrowthFactory): def __init__(self, factory_seed, coarse=False): diff --git a/infinigen/assets/monocot/tussock.py b/infinigen/assets/monocot/tussock.py index b59d4e3d7..ffc0493de 100644 --- a/infinigen/assets/monocot/tussock.py +++ b/infinigen/assets/monocot/tussock.py @@ -6,11 +6,11 @@ import numpy as np from numpy.random import uniform -from assets.utils.draw import leaf -from assets.monocot.growth import MonocotGrowthFactory -from assets.utils.misc import log_uniform -from util.math import FixedSeed -from assets.utils.tag import tag_object +from infinigen.assets.utils.draw import leaf +from infinigen.assets.monocot.growth import MonocotGrowthFactory +from infinigen.assets.utils.misc import log_uniform +from infinigen.core.util.math import FixedSeed +from infinigen.assets.utils.tag import tag_object class TussockMonocotFactory(MonocotGrowthFactory): diff --git a/infinigen/assets/monocot/veratrum.py b/infinigen/assets/monocot/veratrum.py index c62a5dd64..e22f01a6a 100644 --- a/infinigen/assets/monocot/veratrum.py +++ b/infinigen/assets/monocot/veratrum.py @@ -10,19 +10,19 @@ import numpy as np from numpy.random import uniform -from assets.monocot.growth import MonocotGrowthFactory -from assets.utils.decorate import add_distance_to_boundary, assign_material, join_objects, write_attribute, \ +from infinigen.assets.monocot.growth import MonocotGrowthFactory +from infinigen.assets.utils.decorate import add_distance_to_boundary, assign_material, join_objects, write_attribute, \ write_material_index -from assets.utils.draw import leaf, spin -from assets.utils.misc import log_uniform -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from placement.factory import AssetFactory -from surfaces import surface -from surfaces.surface import shaderfunc_to_material -from util.math import FixedSeed -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.draw import leaf, spin +from infinigen.assets.utils.misc import log_uniform +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.factory import AssetFactory +from infinigen.core import surface +from infinigen.core.surface import shaderfunc_to_material +from infinigen.core.util.math import FixedSeed +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class VeratrumMonocotFactory(MonocotGrowthFactory): diff --git a/infinigen/assets/mushroom/cap.py b/infinigen/assets/mushroom/cap.py index 94dfc9d39..8a36d7b8c 100644 --- a/infinigen/assets/mushroom/cap.py +++ b/infinigen/assets/mushroom/cap.py @@ -10,20 +10,20 @@ import numpy as np from numpy.random import uniform -from assets.utils.decorate import assign_material, displace_vertices, geo_extension, join_objects, \ +from infinigen.assets.utils.decorate import assign_material, displace_vertices, geo_extension, join_objects, \ subsurface2face_size -from assets.utils.draw import spin -from assets.utils.mesh import polygon_angles -from assets.utils.misc import build_color_ramp, log_uniform -from assets.utils.object import data2mesh, mesh2obj -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from placement.detail import remesh_with_attrs -from placement.factory import AssetFactory -from surfaces import surface -from util import blender as butil -from util.math import FixedSeed -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.draw import spin +from infinigen.assets.utils.mesh import polygon_angles +from infinigen.assets.utils.misc import build_color_ramp, log_uniform +from infinigen.assets.utils.object import data2mesh, mesh2obj +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.detail import remesh_with_attrs +from infinigen.core.placement.factory import AssetFactory +from infinigen.core import surface +from infinigen.core.util import blender as butil +from infinigen.core.util.math import FixedSeed +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class MushroomCapFactory(AssetFactory): diff --git a/infinigen/assets/mushroom/generate.py b/infinigen/assets/mushroom/generate.py index 36dad72f1..369b39904 100644 --- a/infinigen/assets/mushroom/generate.py +++ b/infinigen/assets/mushroom/generate.py @@ -10,15 +10,15 @@ from mathutils import Euler, kdtree from numpy.random import uniform -from util.blender import deep_clone_obj -from util.math import FixedSeed +from infinigen.core.util.blender import deep_clone_obj +from infinigen.core.util.math import FixedSeed from .growth import MushroomGrowthFactory -from assets.utils.decorate import join_objects -from assets.utils.mesh import polygon_angles -from placement.factory import AssetFactory -from util import blender as butil +from infinigen.assets.utils.decorate import join_objects +from infinigen.assets.utils.mesh import polygon_angles +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util import blender as butil from ..utils.misc import log_uniform -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class MushroomFactory(AssetFactory): max_cluster = 10 diff --git a/infinigen/assets/mushroom/growth.py b/infinigen/assets/mushroom/growth.py index 1e9ac0de6..ba60c1194 100644 --- a/infinigen/assets/mushroom/growth.py +++ b/infinigen/assets/mushroom/growth.py @@ -7,14 +7,14 @@ import colorsys from numpy.random import uniform -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from util.math import FixedSeed +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.core.util.math import FixedSeed from .cap import MushroomCapFactory from .stem import MushroomStemFactory -from assets.utils.object import origin2lowest -from placement.factory import AssetFactory +from infinigen.assets.utils.object import origin2lowest +from infinigen.core.placement.factory import AssetFactory from ..utils.decorate import join_objects from ..utils.misc import build_color_ramp, log_uniform diff --git a/infinigen/assets/mushroom/stem.py b/infinigen/assets/mushroom/stem.py index 358697aa0..28846a49a 100644 --- a/infinigen/assets/mushroom/stem.py +++ b/infinigen/assets/mushroom/stem.py @@ -8,18 +8,18 @@ import numpy as np from numpy.random import uniform -from assets.utils.decorate import assign_material, geo_extension, join_objects, subsurface2face_size -from assets.utils.draw import spin - -from assets.utils.misc import log_uniform -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from placement.detail import remesh_with_attrs -from placement.factory import AssetFactory -from surfaces import surface -from util import blender as butil -from util.math import FixedSeed -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.decorate import assign_material, geo_extension, join_objects, subsurface2face_size +from infinigen.assets.utils.draw import spin + +from infinigen.assets.utils.misc import log_uniform +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.detail import remesh_with_attrs +from infinigen.core.placement.factory import AssetFactory +from infinigen.core import surface +from infinigen.core.util import blender as butil +from infinigen.core.util.math import FixedSeed +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class MushroomStemFactory(AssetFactory): diff --git a/infinigen/assets/rocks/__init__.py b/infinigen/assets/rocks/__init__.py new file mode 100644 index 000000000..b9742821a --- /dev/null +++ b/infinigen/assets/rocks/__init__.py @@ -0,0 +1 @@ +from . import * \ No newline at end of file diff --git a/infinigen/assets/rocks/blender_rock.py b/infinigen/assets/rocks/blender_rock.py index 552b669e4..2477b9710 100644 --- a/infinigen/assets/rocks/blender_rock.py +++ b/infinigen/assets/rocks/blender_rock.py @@ -9,11 +9,11 @@ import numpy as np from numpy.random import uniform as U, normal as N -from util.blender import deep_clone_obj -from util.math import FixedSeed -from util import blender as butil -from placement.factory import AssetFactory -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.util.blender import deep_clone_obj +from infinigen.core.util.math import FixedSeed +from infinigen.core.util import blender as butil +from infinigen.core.placement.factory import AssetFactory +from infinigen.assets.utils.tag import tag_object, tag_nodegroup bpy.ops.preferences.addon_enable(module='add_mesh_extra_objects') diff --git a/infinigen/assets/rocks/pile.py b/infinigen/assets/rocks/pile.py index 4beea1776..796227389 100644 --- a/infinigen/assets/rocks/pile.py +++ b/infinigen/assets/rocks/pile.py @@ -9,15 +9,15 @@ import numpy as np from numpy.random import uniform -from assets.boulder import BoulderFactory -from assets.utils.physics import free_fall -from placement.detail import remesh_with_attrs -from placement.factory import AssetFactory -import util.blender as butil -from assets.utils.decorate import join_objects, multi_res, toggle_hide -from assets.utils.draw import surface_from_func -from util.blender import deep_clone_obj -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.boulder import BoulderFactory +from infinigen.assets.utils.physics import free_fall +from infinigen.core.placement.detail import remesh_with_attrs +from infinigen.core.placement.factory import AssetFactory +import infinigen.core.util.blender as butil +from infinigen.assets.utils.decorate import join_objects, multi_res, toggle_hide +from infinigen.assets.utils.draw import surface_from_func +from infinigen.core.util.blender import deep_clone_obj +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class BoulderPileFactory(AssetFactory): diff --git a/infinigen/assets/scatters/chopped_trees.py b/infinigen/assets/scatters/chopped_trees.py index da28fdf13..2448434a9 100644 --- a/infinigen/assets/scatters/chopped_trees.py +++ b/infinigen/assets/scatters/chopped_trees.py @@ -14,19 +14,19 @@ from numpy.random import uniform, normal from tqdm import tqdm, trange -from util import blender as butil -from util.math import rotate_match_directions, randomspacing -from assets.creatures.geometry.metaballs import plusx_cylinder_unwrap +from infinigen.core.util import blender as butil +from infinigen.core.util.math import rotate_match_directions, randomspacing +from infinigen.assets.creatures.util.geometry.metaballs import plusx_cylinder_unwrap -from nodes import node_utils -from placement.instance_scatter import scatter_instances -from nodes.node_wrangler import Nodes, NodeWrangler -from surfaces import surface -from surfaces.templates import wood +from infinigen.core.nodes import node_utils +from infinigen.core.placement.instance_scatter import scatter_instances +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core import surface +from infinigen.assets.materials import wood -from placement.detail import remesh_with_attrs, target_face_size, scatter_res_distance +from infinigen.core.placement.detail import remesh_with_attrs, target_face_size, scatter_res_distance -from assets.trees.generate import GenericTreeFactory, random_species +from infinigen.assets.trees.generate import GenericTreeFactory, random_species logger = logging.getLogger('chopped_trees') diff --git a/infinigen/assets/scatters/coral_reef.py b/infinigen/assets/scatters/coral_reef.py index b7a1e73a7..6a6f9a47f 100644 --- a/infinigen/assets/scatters/coral_reef.py +++ b/infinigen/assets/scatters/coral_reef.py @@ -7,12 +7,10 @@ import numpy as np from numpy.random import uniform as U -from placement.factory import AssetFactory, make_asset_collection -from assets.corals.generate import CoralFactory, TableCoralFactory -from nodes.node_wrangler import NodeWrangler -from nodes import node_utils -from placement.camera import ng_dist2camera -from placement.instance_scatter import scatter_instances +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.assets.corals.generate import CoralFactory, TableCoralFactory + +from infinigen.core.placement.instance_scatter import scatter_instances def apply(obj, scale=1, density=5., n=12, selection=None, horizontal=False, **kwargs): @@ -42,12 +40,6 @@ def apply_horizontal(obj, scale=1, density=5., n=4, selection=None): corals = make_asset_collection(factories, name='coral', weights=np.random.uniform(0.8, 1, len(factories)), n=n, verbose=True) - - def scaling(nw): - basic = nw.uniform(1. * scale, 2. * scale) - camera_based = nw.build_float_curve(nw.new_node(ng_dist2camera().name), [(0, .2), (4, 1)]) - return nw.vector_math('MINIMUM', basic, camera_based) - r = np.deg2rad(10) scatter_obj = scatter_instances( base_obj=obj, collection=corals, diff --git a/infinigen/assets/scatters/decorative_plants.py b/infinigen/assets/scatters/decorative_plants.py index 78530d788..05d63db8c 100644 --- a/infinigen/assets/scatters/decorative_plants.py +++ b/infinigen/assets/scatters/decorative_plants.py @@ -8,14 +8,14 @@ from numpy.random import uniform as U -from placement.factory import AssetFactory, make_asset_collection -from placement.instance_scatter import scatter_instances -from placement import detail -from nodes import node_utils +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.core.placement.instance_scatter import scatter_instances +from infinigen.core.placement import detail +from infinigen.core.nodes import node_utils -from assets.small_plants import succulent +from infinigen.assets.small_plants import succulent -from surfaces.scatters.utils.wind import wind +from infinigen.assets.scatters.utils.wind import wind def apply(obj, n=4, selection=None, **kwargs): diff --git a/infinigen/assets/scatters/fern.py b/infinigen/assets/scatters/fern.py index 0c6e69c82..74e89c53d 100644 --- a/infinigen/assets/scatters/fern.py +++ b/infinigen/assets/scatters/fern.py @@ -5,13 +5,13 @@ import numpy as np -from placement.instance_scatter import scatter_instances -from placement.factory import AssetFactory, make_asset_collection +from infinigen.core.placement.instance_scatter import scatter_instances +from infinigen.core.placement.factory import AssetFactory, make_asset_collection -from assets.small_plants.fern import FernFactory +from infinigen.assets.small_plants.fern import FernFactory -from util.random import random_general as rg -from surfaces.scatters.utils.wind import wind +from infinigen.core.util.random import random_general as rg +from infinigen.assets.scatters.utils.wind import wind def apply(obj, selection=None, density=('uniform', 1, 6), **kwargs): diff --git a/infinigen/assets/scatters/flowerplant.py b/infinigen/assets/scatters/flowerplant.py index 772edcf97..e2ecc3e74 100644 --- a/infinigen/assets/scatters/flowerplant.py +++ b/infinigen/assets/scatters/flowerplant.py @@ -8,16 +8,16 @@ from numpy.random import uniform, normal from mathutils import Vector -from util import blender as butil -from placement.instance_scatter import scatter_instances -from nodes.node_wrangler import Nodes, NodeWrangler -from surfaces import surface -from nodes import node_utils -from placement.factory import AssetFactory, make_asset_collection -from assets.grassland.flowerplant import FlowerPlantFactory -from surfaces.templates import simple_greenery - -from surfaces.scatters.utils.wind import wind +from infinigen.core.util import blender as butil +from infinigen.core.placement.instance_scatter import scatter_instances +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core import surface +from infinigen.core.nodes import node_utils +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.assets.grassland.flowerplant import FlowerPlantFactory +from infinigen.assets.materials import simple_greenery + +from infinigen.assets.scatters.utils.wind import wind def apply(obj, selection=None, density=1.0): diff --git a/infinigen/assets/scatters/grass.py b/infinigen/assets/scatters/grass.py index fd7b13ae6..07bf68fb3 100644 --- a/infinigen/assets/scatters/grass.py +++ b/infinigen/assets/scatters/grass.py @@ -12,20 +12,20 @@ from numpy.random import uniform as U from mathutils import Vector -from util import blender as butil +from infinigen.core.util import blender as butil -from placement.factory import AssetFactory, make_asset_collection -from placement.instance_scatter import scatter_instances -from nodes.node_wrangler import Nodes, NodeWrangler -from surfaces import surface +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.core.placement.instance_scatter import scatter_instances +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core import surface -from surfaces.templates import simple_greenery, grass_blade_texture +from infinigen.assets.materials import simple_greenery, grass_blade_texture -from assets.grassland.grass_tuft import GrassTuftFactory +from infinigen.assets.grassland.grass_tuft import GrassTuftFactory -from surfaces.scatters.utils.wind import wind +from infinigen.assets.scatters.utils.wind import wind def scale_grass(nw: NodeWrangler): random_scaling = nw.new_node(Nodes.RandomValue, input_kwargs={0: Vector((1.,1.,1.)), 1: Vector((1.2,1.2,2.))}, attrs={"data_type":'FLOAT_VECTOR'}) diff --git a/infinigen/assets/scatters/ground_leaves.py b/infinigen/assets/scatters/ground_leaves.py index 59416305b..35f00b5bd 100644 --- a/infinigen/assets/scatters/ground_leaves.py +++ b/infinigen/assets/scatters/ground_leaves.py @@ -7,10 +7,10 @@ from numpy.random import uniform as U from mathutils import Vector -from placement.instance_scatter import scatter_instances -from nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.placement.instance_scatter import scatter_instances +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler -from assets.trees.generate import random_leaf_collection +from infinigen.assets.trees.generate import random_leaf_collection def apply(obj, selection=None, density=70, season=None, **kwargs): leaf_col=random_leaf_collection(season=season) diff --git a/infinigen/assets/scatters/ground_mushroom.py b/infinigen/assets/scatters/ground_mushroom.py index 4cdae6633..fc7c6265c 100644 --- a/infinigen/assets/scatters/ground_mushroom.py +++ b/infinigen/assets/scatters/ground_mushroom.py @@ -7,10 +7,10 @@ import numpy as np from numpy.random import uniform as U -from assets.mushroom import MushroomFactory -from nodes.node_wrangler import NodeWrangler -from placement.factory import AssetFactory, make_asset_collection -from placement.instance_scatter import scatter_instances +from infinigen.assets.mushroom import MushroomFactory +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.core.placement.instance_scatter import scatter_instances class Mushrooms: diff --git a/infinigen/assets/scatters/ground_twigs.py b/infinigen/assets/scatters/ground_twigs.py index 4a6ab1ef4..2dee88b0b 100644 --- a/infinigen/assets/scatters/ground_twigs.py +++ b/infinigen/assets/scatters/ground_twigs.py @@ -11,15 +11,15 @@ from numpy.random import uniform as U from mathutils import Vector -from util import blender as butil -from util.blender import deep_clone_obj +from infinigen.core.util import blender as butil +from infinigen.core.util.blender import deep_clone_obj -from nodes import node_utils -from placement.instance_scatter import scatter_instances -from nodes.node_wrangler import Nodes, NodeWrangler -from surfaces import surface +from infinigen.core.nodes import node_utils +from infinigen.core.placement.instance_scatter import scatter_instances +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core import surface -from assets.trees.generate import make_twig_collection, random_species +from infinigen.assets.trees.generate import make_twig_collection, random_species from .chopped_trees import approx_settle_transform def apply(obj, selection=None, n_leaf=0, n_twig=10, **kwargs): diff --git a/infinigen/assets/scatters/ivy.py b/infinigen/assets/scatters/ivy.py index bfacad008..04a47ea55 100644 --- a/infinigen/assets/scatters/ivy.py +++ b/infinigen/assets/scatters/ivy.py @@ -10,19 +10,19 @@ import numpy as np from numpy.random import uniform -from assets.leaves.leaf_maple import LeafFactoryMaple -from assets.trees.generate import random_season -from assets.utils.decorate import assign_material, fix_tree -from assets.utils.nodegroup import geo_base_selection, geo_radius -from assets.utils.shortest_path import geo_shortest_path -from nodes.node_info import Nodes -from placement.factory import AssetFactory, make_asset_collection -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from surfaces.surface import shaderfunc_to_material -from surfaces.templates.simple_brownish import shader_simple_brown -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.leaves.leaf_maple import LeafFactoryMaple +from infinigen.assets.trees.generate import random_season +from infinigen.assets.utils.decorate import assign_material, fix_tree +from infinigen.assets.utils.nodegroup import geo_base_selection, geo_radius +from infinigen.assets.utils.shortest_path import geo_shortest_path +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.core.surface import shaderfunc_to_material +from infinigen.assets.materials.simple_brownish import shader_simple_brown +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup def geo_leaf(nw: NodeWrangler, leaves): diff --git a/infinigen/assets/scatters/jellyfish.py b/infinigen/assets/scatters/jellyfish.py index 4a5646d8e..1096eca51 100644 --- a/infinigen/assets/scatters/jellyfish.py +++ b/infinigen/assets/scatters/jellyfish.py @@ -7,10 +7,10 @@ import numpy as np from numpy.random import uniform as U -from assets.jellyfish import JellyfishFactory -from nodes.node_wrangler import NodeWrangler -from placement.factory import AssetFactory, make_asset_collection -from placement.instance_scatter import scatter_instances +from infinigen.assets.creatures.jellyfish import JellyfishFactory +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.core.placement.instance_scatter import scatter_instances def apply(obj, scale=1, density=1., n=10, selection=None): diff --git a/infinigen/assets/scatters/lichen.py b/infinigen/assets/scatters/lichen.py index ac701f2f5..1bd79605a 100644 --- a/infinigen/assets/scatters/lichen.py +++ b/infinigen/assets/scatters/lichen.py @@ -11,17 +11,17 @@ import numpy as np from numpy.random import uniform, normal as N -from assets.utils.decorate import assign_material -from nodes.node_wrangler import Nodes, NodeWrangler -from placement.factory import AssetFactory, make_asset_collection -from placement.instance_scatter import scatter_instances -from surfaces import surface -from placement.factory import AssetFactory -from infinigen_gpl.extras.diff_growth import build_diff_growth -from assets.utils.object import data2mesh -from assets.utils.mesh import polygon_angles -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.decorate import assign_material +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.core.placement.instance_scatter import scatter_instances +from infinigen.core import surface +from infinigen.core.placement.factory import AssetFactory +from infinigen.infinigen_gpl.extras.diff_growth import build_diff_growth +from infinigen.assets.utils.object import data2mesh +from infinigen.assets.utils.mesh import polygon_angles +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup from infinigen.assets.debris import LichenFactory diff --git a/infinigen/assets/scatters/mollusk.py b/infinigen/assets/scatters/mollusk.py index 4ade76e4f..1e2542036 100644 --- a/infinigen/assets/scatters/mollusk.py +++ b/infinigen/assets/scatters/mollusk.py @@ -6,14 +6,14 @@ import numpy as np -from assets.mollusk import MolluskFactory -from assets.utils.misc import CountInstance -from placement.factory import AssetFactory, make_asset_collection -from assets.utils.decorate import toggle_hide -from util import blender as butil -from nodes import node_utils -from placement.instance_scatter import scatter_instances -from surfaces import surface +from infinigen.assets.mollusk import MolluskFactory +from infinigen.assets.utils.misc import CountInstance +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.assets.utils.decorate import toggle_hide +from infinigen.core.util import blender as butil +from infinigen.core.nodes import node_utils +from infinigen.core.placement.instance_scatter import scatter_instances +from infinigen.core import surface def apply(obj, scale=0.4, density=1., n=10, selection=None): diff --git a/infinigen/assets/scatters/monocot.py b/infinigen/assets/scatters/monocot.py index 321aba1da..78ee7ebbd 100644 --- a/infinigen/assets/scatters/monocot.py +++ b/infinigen/assets/scatters/monocot.py @@ -7,12 +7,11 @@ import numpy as np from numpy.random import uniform as U -from assets.monocot.generate import MonocotFactory -from nodes.node_wrangler import NodeWrangler -from placement.camera import ng_dist2camera -from placement.instance_scatter import scatter_instances -from placement.factory import AssetFactory, make_asset_collection -from surfaces.scatters.utils.wind import wind +from infinigen.assets.monocot.generate import MonocotFactory +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.instance_scatter import scatter_instances +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.assets.scatters.utils.wind import wind def apply(obj, n=4, grass=None, selection=None, **kwargs): diff --git a/infinigen/assets/scatters/mushroom.py b/infinigen/assets/scatters/mushroom.py index b258b985f..80661cddb 100644 --- a/infinigen/assets/scatters/mushroom.py +++ b/infinigen/assets/scatters/mushroom.py @@ -12,10 +12,10 @@ from mathutils import Matrix from numpy.random import uniform -from assets.mushroom import MushroomFactory -from util import blender as butil -from nodes.node_wrangler import Nodes, NodeWrangler -from surfaces import surface +from infinigen.assets.mushroom import MushroomFactory +from infinigen.core.util import blender as butil +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core import surface def geo_skeleton(nw: NodeWrangler, base_obj, selection, threshold=.05): diff --git a/infinigen/assets/scatters/rocks.py b/infinigen/assets/scatters/pebbles.py similarity index 70% rename from infinigen/assets/scatters/rocks.py rename to infinigen/assets/scatters/pebbles.py index d22ed250d..0cc8f4670 100644 --- a/infinigen/assets/scatters/rocks.py +++ b/infinigen/assets/scatters/pebbles.py @@ -9,13 +9,13 @@ import numpy as np from numpy.random import uniform as U -from nodes.node_wrangler import Nodes -from placement.instance_scatter import scatter_instances -from placement.factory import AssetFactory, make_asset_collection +from infinigen.core.nodes.node_wrangler import Nodes +from infinigen.core.placement.instance_scatter import scatter_instances +from infinigen.core.placement.factory import AssetFactory, make_asset_collection -from surfaces import surface -from util import blender as butil -from assets.blender_rock import BlenderRockFactory +from infinigen.core import surface +from infinigen.core.util import blender as butil +from infinigen.assets.rocks.blender_rock import BlenderRockFactory def apply(obj, n=5, detail=3, selection=None, **kwargs): diff --git a/infinigen/assets/scatters/pinecone.py b/infinigen/assets/scatters/pinecone.py index 56b7d8bac..9b0d1b19b 100644 --- a/infinigen/assets/scatters/pinecone.py +++ b/infinigen/assets/scatters/pinecone.py @@ -7,12 +7,12 @@ import numpy as np from numpy.random import uniform as U -from assets.monocot.pinecone import PineconeFactory -from nodes.node_wrangler import NodeWrangler -from placement.factory import AssetFactory, make_asset_collection -from placement.instance_scatter import scatter_instances +from infinigen.assets.monocot.pinecone import PineconeFactory +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.core.placement.instance_scatter import scatter_instances -from surfaces.scatters.chopped_trees import approx_settle_transform +from infinigen.assets.scatters.chopped_trees import approx_settle_transform def apply(obj, n=5, selection=None): n_species = np.random.randint(2, 3) diff --git a/infinigen/assets/scatters/seashells.py b/infinigen/assets/scatters/seashells.py index 589bcd85e..2a59b1334 100644 --- a/infinigen/assets/scatters/seashells.py +++ b/infinigen/assets/scatters/seashells.py @@ -7,12 +7,12 @@ import numpy as np from numpy.random import uniform as U -from assets.mollusk import MolluskFactory -from placement.factory import AssetFactory, make_asset_collection -from placement.instance_scatter import scatter_instances -from surfaces.scatters.chopped_trees import approx_settle_transform +from infinigen.assets.mollusk import MolluskFactory +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.core.placement.instance_scatter import scatter_instances +from infinigen.assets.scatters.chopped_trees import approx_settle_transform -from util.random import random_general as rg +from infinigen.core.util.random import random_general as rg def apply(obj, density=('uniform', 0.2, 1.7), n=10, selection=None): n_species = np.random.randint(4, 6) diff --git a/infinigen/assets/scatters/seaweed.py b/infinigen/assets/scatters/seaweed.py index 75e7dce26..4aa7456ae 100644 --- a/infinigen/assets/scatters/seaweed.py +++ b/infinigen/assets/scatters/seaweed.py @@ -7,11 +7,10 @@ import numpy as np from numpy.random import uniform as U -from assets.seaweed import SeaweedFactory -from nodes.node_wrangler import NodeWrangler -from placement.camera import ng_dist2camera -from placement.instance_scatter import scatter_instances -from placement.factory import AssetFactory, make_asset_collection +from infinigen.assets.underwater.seaweed import SeaweedFactory +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.instance_scatter import scatter_instances +from infinigen.core.placement.factory import AssetFactory, make_asset_collection def apply(obj, scale=1, density=1., n=5, selection=None, **kwargs): diff --git a/infinigen/assets/scatters/slime_mold.py b/infinigen/assets/scatters/slime_mold.py index e8673379a..5ae38a7eb 100644 --- a/infinigen/assets/scatters/slime_mold.py +++ b/infinigen/assets/scatters/slime_mold.py @@ -8,15 +8,15 @@ import numpy as np from numpy.random import uniform -from assets.utils.decorate import assign_material, treeify -from assets.utils.nodegroup import geo_base_selection, geo_radius -from assets.utils.shortest_path import geo_shortest_path -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from assets.utils.misc import build_color_ramp -from surfaces.surface import shaderfunc_to_material -from util import blender as butil +from infinigen.assets.utils.decorate import assign_material, treeify +from infinigen.assets.utils.nodegroup import geo_base_selection, geo_radius +from infinigen.assets.utils.shortest_path import geo_shortest_path +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.assets.utils.misc import build_color_ramp +from infinigen.core.surface import shaderfunc_to_material +from infinigen.core.util import blender as butil def shader_mold(nw: NodeWrangler, base_hue): diff --git a/infinigen/assets/scatters/snow_layer.py b/infinigen/assets/scatters/snow_layer.py index f4e1ce377..c9efef17f 100644 --- a/infinigen/assets/scatters/snow_layer.py +++ b/infinigen/assets/scatters/snow_layer.py @@ -9,13 +9,12 @@ from numpy.random import uniform, normal -from nodes.node_wrangler import Nodes, NodeWrangler -from surfaces import surface -from util import blender as butil -from nodes import node_utils +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core import surface +from infinigen.core.util import blender as butil +from infinigen.core.nodes import node_utils -from infinigen_gpl.surfaces import snow -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class Snowlayer: def __init__(self): diff --git a/infinigen/assets/scatters/urchin.py b/infinigen/assets/scatters/urchin.py index e6ea9f687..54fd536a9 100644 --- a/infinigen/assets/scatters/urchin.py +++ b/infinigen/assets/scatters/urchin.py @@ -7,11 +7,10 @@ import numpy as np from numpy.random import uniform as U -from assets.urchin import UrchinFactory -from nodes.node_wrangler import NodeWrangler -from placement.factory import AssetFactory, make_asset_collection -from placement.camera import ng_dist2camera -from placement.instance_scatter import scatter_instances +from infinigen.assets.underwater.urchin import UrchinFactory +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.core.placement.instance_scatter import scatter_instances def apply(obj, n=5, selection=None): diff --git a/infinigen/assets/scatters/utils/cluster.py b/infinigen/assets/scatters/utils/cluster.py index 2df4ca764..759fb2959 100644 --- a/infinigen/assets/scatters/utils/cluster.py +++ b/infinigen/assets/scatters/utils/cluster.py @@ -7,10 +7,10 @@ import numpy as np from numpy.random import uniform -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from placement.instance_scatter import bucketed_instance, camera_cull_points -from surfaces import surface +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.instance_scatter import bucketed_instance, camera_cull_points +from infinigen.core import surface def select_points(nw: NodeWrangler, geometry, density, selection, radius, min_distance): diff --git a/infinigen/assets/scatters/utils/selection.py b/infinigen/assets/scatters/utils/selection.py index 8794938bd..67622b2c8 100644 --- a/infinigen/assets/scatters/utils/selection.py +++ b/infinigen/assets/scatters/utils/selection.py @@ -7,9 +7,9 @@ import numpy as np from numpy.random import uniform -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from util.math import FixedSeed, int_hash +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.util.math import FixedSeed, int_hash def scatter_lower(nw: NodeWrangler, height_range=(.5, 2), fill_range=(.0, .8), noise_scale=.4): diff --git a/infinigen/assets/scatters/utils/wind.py b/infinigen/assets/scatters/utils/wind.py index bb43ac02d..a8d3181fc 100644 --- a/infinigen/assets/scatters/utils/wind.py +++ b/infinigen/assets/scatters/utils/wind.py @@ -11,7 +11,7 @@ from numpy.random import uniform as U, normal as N, randint from mathutils import Vector -from nodes.node_wrangler import Nodes +from infinigen.core.nodes.node_wrangler import Nodes def wind_rotation(nw, speed=1.0, direction=None, scale=1.0, strength=30): diff --git a/infinigen/assets/small_plants/fern.py b/infinigen/assets/small_plants/fern.py index 4f0bdbe45..ab15536f3 100644 --- a/infinigen/assets/small_plants/fern.py +++ b/infinigen/assets/small_plants/fern.py @@ -11,17 +11,17 @@ import gin import numpy as np from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler -from assets.small_plants import leaf_general as Leaf +from infinigen.assets.small_plants import leaf_general as Leaf -from nodes import node_utils -from placement.factory import AssetFactory -from util import blender as butil -from surfaces import surface -from surfaces.templates import simple_greenery +from infinigen.core.nodes import node_utils +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util import blender as butil +from infinigen.core import surface +from infinigen.assets.materials import simple_greenery -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.tag import tag_object, tag_nodegroup def random_pinnae_level2_curvature(): z_max_curvature = uniform(0.3, 0.45, (1,))[0] diff --git a/infinigen/assets/small_plants/leaf_general.py b/infinigen/assets/small_plants/leaf_general.py index 55f72256b..2305e6f62 100644 --- a/infinigen/assets/small_plants/leaf_general.py +++ b/infinigen/assets/small_plants/leaf_general.py @@ -9,14 +9,14 @@ import bpy -from assets.trees.utils import helper, mesh, materials +from infinigen.assets.trees.utils import helper, mesh, materials -from placement.factory import AssetFactory -from util import blender as butil +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util import blender as butil C = bpy.context D = bpy.data -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class LeafFactory(AssetFactory): diff --git a/infinigen/assets/small_plants/leaf_heart.py b/infinigen/assets/small_plants/leaf_heart.py index 9b373bc81..e4efb4b9c 100644 --- a/infinigen/assets/small_plants/leaf_heart.py +++ b/infinigen/assets/small_plants/leaf_heart.py @@ -6,13 +6,13 @@ import numpy as np import bpy -from assets.trees.utils import mesh -from placement.factory import AssetFactory -from util import blender as butil +from infinigen.assets.trees.utils import mesh +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util import blender as butil C = bpy.context D = bpy.data -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class LeafHeartFactory(AssetFactory): scale = 0.2 diff --git a/infinigen/assets/small_plants/num_leaf_grass.py b/infinigen/assets/small_plants/num_leaf_grass.py index b0ad0d9b6..1a81f994d 100644 --- a/infinigen/assets/small_plants/num_leaf_grass.py +++ b/infinigen/assets/small_plants/num_leaf_grass.py @@ -7,16 +7,16 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from surfaces import surface -from placement.factory import AssetFactory -from util import blender as butil -from assets.small_plants.leaf_general import LeafFactory -from assets.small_plants.leaf_heart import LeafHeartFactory -from surfaces.templates import simple_greenery +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core import surface +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util import blender as butil +from infinigen.assets.small_plants.leaf_general import LeafFactory +from infinigen.assets.small_plants.leaf_heart import LeafHeartFactory +from infinigen.assets.materials import simple_greenery import numpy as np -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_leafon_stem', singleton=False, type='GeometryNodeTree') def nodegroup_leaf_on_stem(nw: NodeWrangler, z_rotation=(0, 0, 0,), leaf_scale=1.0, leaf=None): diff --git a/infinigen/assets/small_plants/snake_plant.py b/infinigen/assets/small_plants/snake_plant.py index a109cb04f..35cc04540 100644 --- a/infinigen/assets/small_plants/snake_plant.py +++ b/infinigen/assets/small_plants/snake_plant.py @@ -7,14 +7,14 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from surfaces import surface -from surfaces.templates import snake_plant -from placement.factory import AssetFactory +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core import surface +from infinigen.assets.materials import snake_plant +from infinigen.core.placement.factory import AssetFactory import numpy as np -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_pedal_thickness', singleton=False, type='GeometryNodeTree') def nodegroup_pedal_thickness(nw: NodeWrangler): diff --git a/infinigen/assets/small_plants/spider_plant.py b/infinigen/assets/small_plants/spider_plant.py index 25ee7d941..39ecd8b95 100644 --- a/infinigen/assets/small_plants/spider_plant.py +++ b/infinigen/assets/small_plants/spider_plant.py @@ -7,16 +7,16 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface -from placement.factory import AssetFactory -from surfaces.templates import spider_plant +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface +from infinigen.core.placement.factory import AssetFactory +from infinigen.assets.materials import spider_plant import numpy as np -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_set_leaf_countour', singleton=False, type='GeometryNodeTree') def nodegroup_set_leaf_countour(nw: NodeWrangler): diff --git a/infinigen/assets/small_plants/succulent.py b/infinigen/assets/small_plants/succulent.py index 81d79435f..34010a49d 100644 --- a/infinigen/assets/small_plants/succulent.py +++ b/infinigen/assets/small_plants/succulent.py @@ -7,16 +7,16 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface -from surfaces.templates import succulent -from placement.factory import AssetFactory +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface +from infinigen.assets.materials import succulent +from infinigen.core.placement.factory import AssetFactory import numpy as np -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_pedal_cross_contour_top', singleton=False, type='GeometryNodeTree') def nodegroup_pedal_cross_contour_top(nw: NodeWrangler): diff --git a/infinigen/assets/surfaces/__init__.py b/infinigen/assets/surfaces/__init__.py deleted file mode 100644 index 292c27b44..000000000 --- a/infinigen/assets/surfaces/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from . import * -from infinigen_gpl.surfaces import * diff --git a/infinigen/assets/trees/__init__.py b/infinigen/assets/trees/__init__.py index 0fcb294b9..a45582997 100644 --- a/infinigen/assets/trees/__init__.py +++ b/infinigen/assets/trees/__init__.py @@ -1,2 +1,2 @@ -from .generate import BushFactory, TreeFactory +from .generate import BushFactory, TreeFactory, random_season, random_leaf_collection from .tree_flower import TreeFlowerFactory diff --git a/infinigen/assets/trees/branch.py b/infinigen/assets/trees/branch.py index efc4da83d..80d13811f 100644 --- a/infinigen/assets/trees/branch.py +++ b/infinigen/assets/trees/branch.py @@ -7,15 +7,15 @@ import mathutils import numpy as np from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface -from util.math import FixedSeed -from placement.factory import AssetFactory -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.util.math import FixedSeed +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_surface_bump', singleton=False, type='GeometryNodeTree') def nodegroup_surface_bump(nw: NodeWrangler): diff --git a/infinigen/assets/trees/generate.py b/infinigen/assets/trees/generate.py index 8801c8811..734dbb455 100644 --- a/infinigen/assets/trees/generate.py +++ b/infinigen/assets/trees/generate.py @@ -13,28 +13,28 @@ import bpy -from assets.trees import tree, treeconfigs, branch -from assets.leaves import leaf, leaf_v2, leaf_pine, leaf_ginko, leaf_broadleaf, leaf_maple -from assets.fruits import apple, blackberry, coconutgreen, durian, starfruit, strawberry, compositional_fruit -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler +from infinigen.assets.trees import tree, treeconfigs, branch +from infinigen.assets.leaves import leaf, leaf_v2, leaf_pine, leaf_ginko, leaf_broadleaf, leaf_maple +from infinigen.assets.fruits import apple, blackberry, coconutgreen, durian, starfruit, strawberry, compositional_fruit +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler from . import tree_flower -from util import blender as butil -from util.math import FixedSeed -from util.blender import deep_clone_obj -from util import camera as camera_util +from infinigen.core.util import blender as butil +from infinigen.core.util.math import FixedSeed +from infinigen.core.util.blender import deep_clone_obj +from infinigen.core.util import camera as camera_util -from placement.factory import AssetFactory, make_asset_collection -from placement import detail -from placement.split_in_view import split_inview +from infinigen.core.placement.factory import AssetFactory, make_asset_collection +from infinigen.core.placement import detail +from infinigen.core.placement.split_in_view import split_inview from infinigen.core import surface -from assets.cloud.generate import CloudFactory +from infinigen.assets.weather.cloud.generate import CloudFactory from ..utils.decorate import write_attribute -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.utils.tag import tag_object, tag_nodegroup logger = logging.getLogger('trees') diff --git a/infinigen/assets/trees/tree.py b/infinigen/assets/trees/tree.py index d283eafbc..9de5e3e53 100644 --- a/infinigen/assets/trees/tree.py +++ b/infinigen/assets/trees/tree.py @@ -14,10 +14,10 @@ from .utils import helper, mesh from .utils import geometrynodes as gn -from assets.leaves import leaf +from infinigen.assets.leaves import leaf -from nodes.node_wrangler import Nodes -from util import blender as butil +from infinigen.core.nodes.node_wrangler import Nodes +from infinigen.core.util import blender as butil from ..utils.object import data2mesh, mesh2obj C = bpy.context diff --git a/infinigen/assets/trees/tree_flower.py b/infinigen/assets/trees/tree_flower.py index cf0420a85..81b1072a6 100644 --- a/infinigen/assets/trees/tree_flower.py +++ b/infinigen/assets/trees/tree_flower.py @@ -12,14 +12,14 @@ from numpy.random import uniform, normal import numpy as np -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils, color -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils, color +from infinigen.core import surface -from placement.factory import AssetFactory -from util import blender as butil -from util.math import FixedSeed, dict_lerp -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.placement.factory import AssetFactory +from infinigen.core.util import blender as butil +from infinigen.core.util.math import FixedSeed, dict_lerp +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_polar_to_cart_old', singleton=True) def nodegroup_polar_to_cart_old(nw): diff --git a/infinigen/assets/trees/utils/geometrynodes.py b/infinigen/assets/trees/utils/geometrynodes.py index 3408aaa54..ebf505947 100644 --- a/infinigen/assets/trees/utils/geometrynodes.py +++ b/infinigen/assets/trees/utils/geometrynodes.py @@ -11,8 +11,8 @@ from . import helper, mesh from .materials import new_link -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils C = bpy.context D = bpy.data diff --git a/infinigen/assets/trees/utils/helper.py b/infinigen/assets/trees/utils/helper.py index 7670de78e..55a724a4c 100644 --- a/infinigen/assets/trees/utils/helper.py +++ b/infinigen/assets/trees/utils/helper.py @@ -7,7 +7,7 @@ import bpy import numpy as np -from util.logging import Suppress +from infinigen.core.util.logging import Suppress C = bpy.context D = bpy.data diff --git a/infinigen/assets/tropic_plants/coconut_tree.py b/infinigen/assets/tropic_plants/coconut_tree.py index f1ef1db28..138c4d12b 100644 --- a/infinigen/assets/tropic_plants/coconut_tree.py +++ b/infinigen/assets/tropic_plants/coconut_tree.py @@ -7,15 +7,15 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from surfaces import surface -from placement.factory import AssetFactory +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core import surface +from infinigen.core.placement.factory import AssetFactory import numpy as np -from nodes.color import hsv2rgba -from util import blender as butil -from assets.tropic_plants.leaf_palm_tree import LeafPalmTreeFactory -from assets.fruits.coconutgreen import FruitFactoryCoconutgreen +from infinigen.core.nodes.color import hsv2rgba +from infinigen.core.util import blender as butil +from infinigen.assets.tropic_plants.leaf_palm_tree import LeafPalmTreeFactory +from infinigen.assets.fruits.coconutgreen import FruitFactoryCoconutgreen @node_utils.to_nodegroup('nodegroup_pedal_cross_contour_top', singleton=False, type='GeometryNodeTree') diff --git a/infinigen/assets/tropic_plants/leaf_banana_tree.py b/infinigen/assets/tropic_plants/leaf_banana_tree.py index 816f06ed8..661901362 100644 --- a/infinigen/assets/tropic_plants/leaf_banana_tree.py +++ b/infinigen/assets/tropic_plants/leaf_banana_tree.py @@ -7,15 +7,15 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from surfaces import surface -from placement.factory import AssetFactory +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core import surface +from infinigen.core.placement.factory import AssetFactory import numpy as np -from nodes.color import hsv2rgba -from assets.tropic_plants.tropic_plant_utils import * -from util import blender as butil -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.nodes.color import hsv2rgba +from infinigen.assets.tropic_plants.tropic_plant_utils import * +from infinigen.core.util import blender as butil +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_nodegroup_apply_wave', singleton=False, type='GeometryNodeTree') diff --git a/infinigen/assets/tropic_plants/leaf_palm_plant.py b/infinigen/assets/tropic_plants/leaf_palm_plant.py index c0c72f9ff..13cfe60f9 100644 --- a/infinigen/assets/tropic_plants/leaf_palm_plant.py +++ b/infinigen/assets/tropic_plants/leaf_palm_plant.py @@ -7,8 +7,8 @@ import bpy import mathutils from numpy.random import uniform -from assets.tropic_plants.tropic_plant_utils import * -from util import blender as butil +from infinigen.assets.tropic_plants.tropic_plant_utils import * +from infinigen.core.util import blender as butil @node_utils.to_nodegroup('nodegroup_nodegroup_apply_wave', singleton=False, type='GeometryNodeTree') diff --git a/infinigen/assets/tropic_plants/leaf_palm_tree.py b/infinigen/assets/tropic_plants/leaf_palm_tree.py index 87802c8db..74cbe2035 100644 --- a/infinigen/assets/tropic_plants/leaf_palm_tree.py +++ b/infinigen/assets/tropic_plants/leaf_palm_tree.py @@ -4,8 +4,8 @@ # Authors: Beining Han -from assets.tropic_plants.tropic_plant_utils import * -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.tropic_plants.tropic_plant_utils import * +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @node_utils.to_nodegroup('nodegroup_nodegroup_apply_wave', singleton=False, type='GeometryNodeTree') def nodegroup_nodegroup_apply_wave(nw: NodeWrangler): diff --git a/infinigen/assets/tropic_plants/palm_tree.py b/infinigen/assets/tropic_plants/palm_tree.py index 5197ba01b..53983a046 100644 --- a/infinigen/assets/tropic_plants/palm_tree.py +++ b/infinigen/assets/tropic_plants/palm_tree.py @@ -8,14 +8,14 @@ import mathutils import gin from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from surfaces import surface -from placement.factory import AssetFactory +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core import surface +from infinigen.core.placement.factory import AssetFactory import numpy as np -from nodes.color import hsv2rgba -from util import blender as butil -from assets.tropic_plants.leaf_palm_plant import LeafPalmPlantFactory +from infinigen.core.nodes.color import hsv2rgba +from infinigen.core.util import blender as butil +from infinigen.assets.tropic_plants.leaf_palm_plant import LeafPalmPlantFactory @node_utils.to_nodegroup('nodegroup_pedal_cross_contour_top', singleton=False, type='GeometryNodeTree') diff --git a/infinigen/assets/tropic_plants/tropic_plant_utils.py b/infinigen/assets/tropic_plants/tropic_plant_utils.py index 3e9b72e86..0f3a95fe3 100644 --- a/infinigen/assets/tropic_plants/tropic_plant_utils.py +++ b/infinigen/assets/tropic_plants/tropic_plant_utils.py @@ -7,13 +7,13 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from surfaces import surface -from placement.factory import AssetFactory +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core import surface +from infinigen.core.placement.factory import AssetFactory import numpy as np -from nodes.color import hsv2rgba -from util import blender as butil +from infinigen.core.nodes.color import hsv2rgba +from infinigen.core.util import blender as butil @node_utils.to_nodegroup('nodegroup_node_group', singleton=False, type='GeometryNodeTree') diff --git a/infinigen/assets/underwater/__init__.py b/infinigen/assets/underwater/__init__.py new file mode 100644 index 000000000..0063ca67d --- /dev/null +++ b/infinigen/assets/underwater/__init__.py @@ -0,0 +1 @@ +from . import seaweed, urchin \ No newline at end of file diff --git a/infinigen/assets/underwater/seaweed.py b/infinigen/assets/underwater/seaweed.py index 871b52b24..48a150345 100644 --- a/infinigen/assets/underwater/seaweed.py +++ b/infinigen/assets/underwater/seaweed.py @@ -11,19 +11,19 @@ import numpy as np from numpy.random import uniform -from assets.creatures.animation.driver_repeated import repeated_driver -from assets.utils.decorate import assign_material, read_co, subsurface2face_size, write_co -from assets.utils.draw import make_circular_interp -import util.blender as butil -from placement.factory import AssetFactory -from infinigen_gpl.extras.diff_growth import build_diff_growth -from assets.utils.object import mesh2obj, data2mesh -from assets.utils.mesh import polygon_angles -from nodes.node_wrangler import NodeWrangler, Nodes -from surfaces import surface -from assets.utils.misc import build_color_ramp, log_uniform -from util.math import FixedSeed -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.assets.creatures.util.animation.driver_repeated import repeated_driver +from infinigen.assets.utils.decorate import assign_material, read_co, subsurface2face_size, write_co +from infinigen.assets.utils.draw import make_circular_interp +import infinigen.core.util.blender as butil +from infinigen.core.placement.factory import AssetFactory +from infinigen.infinigen_gpl.extras.diff_growth import build_diff_growth +from infinigen.assets.utils.object import mesh2obj, data2mesh +from infinigen.assets.utils.mesh import polygon_angles +from infinigen.core.nodes.node_wrangler import NodeWrangler, Nodes +from infinigen.core import surface +from infinigen.assets.utils.misc import build_color_ramp, log_uniform +from infinigen.core.util.math import FixedSeed +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class SeaweedFactory(AssetFactory): diff --git a/infinigen/assets/underwater/urchin.py b/infinigen/assets/underwater/urchin.py index dc9182de9..239bc5d18 100644 --- a/infinigen/assets/underwater/urchin.py +++ b/infinigen/assets/underwater/urchin.py @@ -8,18 +8,18 @@ import bpy from numpy.random import uniform -import util.blender as butil -from assets.creatures.animation.driver_repeated import repeated_driver -from assets.utils.object import new_icosphere -from assets.utils.decorate import assign_material, geo_extension, separate_loose -from assets.utils.misc import log_uniform -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from placement.detail import adapt_mesh_resolution -from placement.factory import AssetFactory -from surfaces import surface -from util.math import FixedSeed -from assets.utils.tag import tag_object, tag_nodegroup +import infinigen.core.util.blender as butil +from infinigen.assets.creatures.util.animation.driver_repeated import repeated_driver +from infinigen.assets.utils.object import new_icosphere +from infinigen.assets.utils.decorate import assign_material, geo_extension, separate_loose +from infinigen.assets.utils.misc import log_uniform +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core.placement.detail import adapt_mesh_resolution +from infinigen.core.placement.factory import AssetFactory +from infinigen.core import surface +from infinigen.core.util.math import FixedSeed +from infinigen.assets.utils.tag import tag_object, tag_nodegroup class UrchinFactory(AssetFactory): diff --git a/infinigen/assets/utils/decorate.py b/infinigen/assets/utils/decorate.py index e5f974c67..7d5596086 100644 --- a/infinigen/assets/utils/decorate.py +++ b/infinigen/assets/utils/decorate.py @@ -12,12 +12,12 @@ import numpy as np from numpy.random import uniform -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface -from util import blender as butil -from util.blender import select_none +from infinigen.core.util import blender as butil +from infinigen.core.util.blender import select_none def multi_res(obj): diff --git a/infinigen/assets/utils/draw.py b/infinigen/assets/utils/draw.py index b19025b83..bc990839d 100644 --- a/infinigen/assets/utils/draw.py +++ b/infinigen/assets/utils/draw.py @@ -12,13 +12,13 @@ from numpy.random import uniform from scipy.interpolate import interp1d -from assets.utils.decorate import read_co, remove_vertices, separate_loose, write_attribute, write_co -from assets.utils.mesh import polygon_angles -from assets.utils.object import data2mesh, mesh2obj -from nodes.node_info import Nodes -from placement.detail import sharp_remesh_with_attrs -from surfaces.surface import read_attr_data -from util import blender as butil +from infinigen.assets.utils.decorate import read_co, remove_vertices, separate_loose, write_attribute, write_co +from infinigen.assets.utils.mesh import polygon_angles +from infinigen.assets.utils.object import data2mesh, mesh2obj +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.placement.detail import sharp_remesh_with_attrs +from infinigen.core.surface import read_attr_data +from infinigen.core.util import blender as butil def shape_by_angles(obj, angles, scales=None, displacements=None, method='quadratic'): diff --git a/infinigen/assets/utils/laplacian.py b/infinigen/assets/utils/laplacian.py index 921b3cf36..7e3a9a455 100644 --- a/infinigen/assets/utils/laplacian.py +++ b/infinigen/assets/utils/laplacian.py @@ -10,9 +10,9 @@ from numpy.random import uniform from skimage.measure import find_contours, marching_cubes from scipy.ndimage import convolve -from util import blender as butil +from infinigen.core.util import blender as butil -from assets.utils.object import data2mesh +from infinigen.assets.utils.object import data2mesh def mesh_grid(n, sizes): diff --git a/infinigen/assets/utils/mesh.py b/infinigen/assets/utils/mesh.py index 0d71adcce..8c2a73d35 100644 --- a/infinigen/assets/utils/mesh.py +++ b/infinigen/assets/utils/mesh.py @@ -8,11 +8,11 @@ import numpy as np from numpy.random import normal, uniform -from assets.utils.object import new_cube -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface -from util import blender as butil +from infinigen.assets.utils.object import new_cube +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface +from infinigen.core.util import blender as butil def build_prism_mesh(n=6, r_min=1., r_max=1.5, height=.3, tilt=.3): diff --git a/infinigen/assets/utils/misc.py b/infinigen/assets/utils/misc.py index 282354895..44559a9ca 100644 --- a/infinigen/assets/utils/misc.py +++ b/infinigen/assets/utils/misc.py @@ -8,8 +8,8 @@ import numpy as np from numpy.random import normal, uniform -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler class CountInstance: diff --git a/infinigen/assets/utils/nodegroup.py b/infinigen/assets/utils/nodegroup.py index e5102c39a..c130ed24f 100644 --- a/infinigen/assets/utils/nodegroup.py +++ b/infinigen/assets/utils/nodegroup.py @@ -9,11 +9,11 @@ import bpy import numpy as np -from assets.utils.decorate import toggle_hide -from nodes import node_utils -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface +from infinigen.assets.utils.decorate import toggle_hide +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface def build_curve(nw: NodeWrangler, positions, circular=False, handle='VECTOR'): diff --git a/infinigen/assets/utils/object.py b/infinigen/assets/utils/object.py index 961f22bf7..b49ee29d6 100644 --- a/infinigen/assets/utils/object.py +++ b/infinigen/assets/utils/object.py @@ -9,8 +9,8 @@ import trimesh from mathutils import Vector -import util.blender as butil -from assets.utils.decorate import read_co +import infinigen.core.util.blender as butil +from infinigen.assets.utils.decorate import read_co def center(obj): diff --git a/infinigen/assets/utils/physics.py b/infinigen/assets/utils/physics.py index 9cc55cf47..0af5b2c4a 100644 --- a/infinigen/assets/utils/physics.py +++ b/infinigen/assets/utils/physics.py @@ -6,8 +6,8 @@ import bpy -import util.blender as butil -from util.logging import Suppress +import infinigen.core.util.blender as butil +from infinigen.core.util.logging import Suppress def free_fall(actives, passives, place_fn, t=100): diff --git a/infinigen/assets/utils/shortest_path.py b/infinigen/assets/utils/shortest_path.py index f1d630fa5..0bd685de9 100644 --- a/infinigen/assets/utils/shortest_path.py +++ b/infinigen/assets/utils/shortest_path.py @@ -6,9 +6,9 @@ -from nodes.node_info import Nodes -from nodes.node_wrangler import NodeWrangler -from surfaces import surface +from infinigen.core.nodes.node_info import Nodes +from infinigen.core.nodes.node_wrangler import NodeWrangler +from infinigen.core import surface def geo_shortest_path(nw: NodeWrangler, end_index, weight, trim_threshold=.1, offset=0., merge_threshold=.005, diff --git a/infinigen/assets/utils/tag.py b/infinigen/assets/utils/tag.py index ea771c676..03901d8f1 100644 --- a/infinigen/assets/utils/tag.py +++ b/infinigen/assets/utils/tag.py @@ -8,8 +8,8 @@ import bpy import json import numpy as np -import util.blender as butil -from nodes.node_wrangler import Nodes, NodeWrangler +import infinigen.core.util.blender as butil +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler class AutoTag(): tag_dict = {} diff --git a/infinigen/assets/weather/__init__.py b/infinigen/assets/weather/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/infinigen/assets/weather/cloud/cloud.py b/infinigen/assets/weather/cloud/cloud.py index 135b2c747..632321a0f 100644 --- a/infinigen/assets/weather/cloud/cloud.py +++ b/infinigen/assets/weather/cloud/cloud.py @@ -11,20 +11,18 @@ from tqdm import trange, tqdm from numpy.random import uniform, normal -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core import surface -from assets.cloud.node import geometry_func, shader_material -from assets.cloud.node import scatter_func - -from lighting import lighting +from infinigen.assets.weather.cloud.node import geometry_func, shader_material +from infinigen.assets.weather.cloud.node import scatter_func from scipy.ndimage import distance_transform_edt from skimage import measure -import util -from util import blender as butil +from infinigen.core.util.logging import Suppress +from infinigen.core.util import blender as butil def set_curves(curve, points): @@ -176,7 +174,7 @@ def make_cloud(self, marching_cubes=False, resolution=128, selection=None, ): link_object(cloud) - with util.logging.Suppress(): + with Suppress(): # Set origin butil.select(cloud) bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY', center='MEDIAN') @@ -499,7 +497,7 @@ def initialize(collection): dimensions = dimensions * scale cloud.dimensions = dimensions - lighting.add_lighting() + sky_lighting.add_lighting() return clouds @@ -555,7 +553,7 @@ def single(): cloud.location = [xs[i], ys[i], 0] - lighting.add_lighting() + sky_lighting.add_lighting() return clouds diff --git a/infinigen/assets/weather/cloud/generate.py b/infinigen/assets/weather/cloud/generate.py index c1fe6de74..27dfe2aea 100644 --- a/infinigen/assets/weather/cloud/generate.py +++ b/infinigen/assets/weather/cloud/generate.py @@ -8,19 +8,19 @@ import bpy import numpy as np -from assets.utils.object import new_cube -from placement.factory import AssetFactory +from infinigen.assets.utils.object import new_cube +from infinigen.core.placement.factory import AssetFactory -from assets.cloud.cloud import Cumulus, Cumulonimbus, Stratocumulus, Altocumulus -from assets.cloud.cloud import create_3d_grid +from infinigen.assets.weather.cloud.cloud import Cumulus, Cumulonimbus, Stratocumulus, Altocumulus +from infinigen.assets.weather.cloud.cloud import create_3d_grid -from surfaces import surface -from util import blender as butil -from util.math import FixedSeed -from util.random import random_general as rg +from infinigen.core import surface +from infinigen.core.util import blender as butil +from infinigen.core.util.math import FixedSeed +from infinigen.core.util.random import random_general as rg -from nodes.node_wrangler import Nodes -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.nodes.node_wrangler import Nodes +from infinigen.assets.utils.tag import tag_object, tag_nodegroup @gin.configurable diff --git a/infinigen/assets/weather/cloud/node.py b/infinigen/assets/weather/cloud/node.py index 6250b651a..0e0091ec3 100644 --- a/infinigen/assets/weather/cloud/node.py +++ b/infinigen/assets/weather/cloud/node.py @@ -4,7 +4,7 @@ # Authors: Hei Law # Acknowledgement: This file draws inspiration from https://www.youtube.com/watch?v=lPAYX8z9i8M by CGCookie -from nodes.node_wrangler import Nodes +from infinigen.core.nodes.node_wrangler import Nodes import numpy as np def cloud_geometry_func( diff --git a/infinigen/assets/weather/kole_clouds.py b/infinigen/assets/weather/kole_clouds.py index 47b831908..6650fed52 100644 --- a/infinigen/assets/weather/kole_clouds.py +++ b/infinigen/assets/weather/kole_clouds.py @@ -5,11 +5,11 @@ import gin import numpy as np from mathutils import Vector -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from surfaces import surface -from util.random import random_general as rg -from terrain.utils import drive_param +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core import surface +from infinigen.core.util.random import random_general as rg +from infinigen.terrain.utils import drive_param @gin.configurable def kole_clouds_shader( diff --git a/infinigen/assets/weather/particles.py b/infinigen/assets/weather/particles.py index 0f635a85a..9e4f89477 100644 --- a/infinigen/assets/weather/particles.py +++ b/infinigen/assets/weather/particles.py @@ -11,17 +11,17 @@ import gin -from placement.factory import AssetFactory -from surfaces import surface +from infinigen.core.placement.factory import AssetFactory +from infinigen.core import surface -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from util import blender as butil -from util.random import random_general -from assets.utils.tag import tag_object, tag_nodegroup +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.util import blender as butil +from infinigen.core.util.random import random_general +from infinigen.assets.utils.tag import tag_object, tag_nodegroup -from surfaces.templates import dirt -from infinigen_gpl.surfaces import snow +from infinigen.assets.materials import dirt +from infinigen.infinigen_gpl.surfaces import snow def shader_raindrop(nw): glass_bsdf = nw.new_node( diff --git a/infinigen/core/__init__.py b/infinigen/core/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/infinigen/core/core.py b/infinigen/core/execute_tasks.py similarity index 89% rename from infinigen/core/core.py rename to infinigen/core/execute_tasks.py index 41c5ed008..53b03542c 100644 --- a/infinigen/core/core.py +++ b/infinigen/core/execute_tasks.py @@ -18,8 +18,6 @@ os.environ["OPENCV_IO_ENABLE_OPENEXR"] = "1" # This must be done BEFORE import cv2. # See https://github.com/opencv/opencv/issues/21326#issuecomment-1008517425 -sys.path.append(os.path.split(os.path.abspath(__file__))[0]) - import bpy import mathutils from mathutils import Vector @@ -29,50 +27,49 @@ from tqdm import tqdm from frozendict import frozendict -from terrain import Terrain -from util.organization import Task, Attributes, TerrainNames - -from placement import placement, density, camera as cam_util -from placement.split_in_view import split_inview -from lighting import lighting, kole_clouds +from infinigen.terrain import Terrain -from assets.trees.generate import TreeFactory, BushFactory, random_season -from assets.boulder import BoulderFactory -from assets.glowing_rocks import GlowingRocksFactory -from assets.creatures import ( +from infinigen.assets.trees.generate import TreeFactory, BushFactory, random_season +from infinigen.assets.rocks.boulder import BoulderFactory +from infinigen.assets.lighting.glowing_rocks import GlowingRocksFactory +from infinigen.assets.creatures import ( CarnivoreFactory, HerbivoreFactory, FishFactory, FishSchoolFactory, \ BeetleFactory, AntSwarmFactory, BirdFactory, SnakeFactory, \ - CrustaceanFactory, FlyingBirdFactory, CrabFactory, LobsterFactory, SpinyLobsterFactory + CrustaceanFactory, FlyingBirdFactory, CrabFactory, LobsterFactory, SpinyLobsterFactory, + DragonflyFactory ) -from assets.insects.assembled.dragonfly import DragonflyFactory -from assets.cloud.generate import CloudFactory -from assets.cactus import CactusFactory -from assets.creatures import boid_swarm +from infinigen.assets.weather.cloud.generate import CloudFactory +from infinigen.assets.cactus import CactusFactory + +from infinigen.core.placement import placement, camera as cam_util -from placement import placement, camera as cam_util +from infinigen.core.rendering.render import render_image +from infinigen.core.rendering.resample import resample_scene +from infinigen.assets.monocot import kelp +from infinigen.core import surface -from rendering.render import render_image -from rendering.resample import resample_scene -from assets.monocot import kelp -from surfaces import surface +from infinigen.core.util.organization import Task, Attributes, TerrainNames -from fluid.fluid import set_fire_to_assets -from fluid.asset_cache import FireCachingSystem -from fluid.cached_factory_wrappers import CachedBoulderFactory, CachedBushFactory, CachedCactusFactory, CachedCreatureFactory, CachedTreeFactory +from infinigen.core.placement import placement, density, camera as cam_util +from infinigen.core.placement.split_in_view import split_inview -import surfaces.scatters -from surfaces.scatters import ground_mushroom, slime_mold, moss, ivy, lichen, snow_layer -from surfaces.scatters.utils.selection import scatter_lower, scatter_upward +from infinigen.assets.fluid.fluid import set_fire_to_assets +from infinigen.assets.fluid.asset_cache import FireCachingSystem +from infinigen.assets.fluid.cached_factory_wrappers import CachedBoulderFactory, CachedBushFactory, CachedCactusFactory, CachedCreatureFactory, CachedTreeFactory -from placement.factory import make_asset_collection -from util import blender as butil -from util import exporting -from util.logging import Timer, save_polycounts, create_text_file, Suppress -from util.math import FixedSeed, int_hash -from util.pipeline import RandomStageExecutor -from util.random import sample_registry +import infinigen.assets.scatters +from infinigen.assets.scatters import ground_mushroom, slime_mold, moss, ivy, lichen, snow_layer +from infinigen.assets.scatters.utils.selection import scatter_lower, scatter_upward -from assets.utils.tag import tag_system +from infinigen.core.placement.factory import make_asset_collection +from infinigen.core.util import blender as butil +from infinigen.core.util import exporting +from infinigen.core.util.logging import Timer, save_polycounts, create_text_file, Suppress +from infinigen.core.util.math import FixedSeed, int_hash +from infinigen.core.util.pipeline import RandomStageExecutor +from infinigen.core.util.random import sample_registry + +from infinigen.assets.utils.tag import tag_system VERSION = '1.0.4' @@ -255,9 +252,9 @@ def save_meshes(scene_seed, output_folder, frame_range, resample_idx=False): def validate_version(scene_version): if scene_version is None or scene_version.split('.')[:-1] != VERSION.split('.')[:-1]: raise ValueError( - f'generate.py {VERSION=} attempted to load a scene created by version {scene_version=}') + f'examples/generate_nature.py {VERSION=} attempted to load a scene created by version {scene_version=}') if scene_version != VERSION: - logging.warning(f'Worldgen {VERSION=} has minor version mismatch with {scene_version=}') + logging.warning(f'{VERSION=} has minor version mismatch with {scene_version=}') @gin.configurable def group_collections(config): @@ -433,9 +430,9 @@ def apply_scene_seed(args): @gin.configurable def apply_gin_configs( args, - scene_seed, + configs_folder: Path, skip_unknown=False, - mandatory_config_dir=Path('config/scene_types'), + mandatory_config_dir: Path =None, ): if mandatory_config_dir is not None: @@ -451,7 +448,7 @@ def apply_gin_configs( ) def find_config(g): - for p in Path('config').glob('**/*.gin'): + for p in configs_folder.glob('**/*.gin'): if p.parts[-1] == g: return p if p.parts[-1] == f'{g}.gin': diff --git a/infinigen/core/nodes/color.py b/infinigen/core/nodes/color.py index 0ae55314d..90979f273 100644 --- a/infinigen/core/nodes/color.py +++ b/infinigen/core/nodes/color.py @@ -13,7 +13,7 @@ import colorsys import gin -from util.math import int_hash +from infinigen.core.util.math import int_hash @dataclass class ChannelScheme: diff --git a/infinigen/core/nodes/compatibility.py b/infinigen/core/nodes/compatibility.py index 3c98feeda..8ff7a5084 100644 --- a/infinigen/core/nodes/compatibility.py +++ b/infinigen/core/nodes/compatibility.py @@ -1,7 +1,7 @@ import logging from collections import OrderedDict -from nodes.node_info import Nodes +from .node_info import Nodes logger = logging.getLogger('node_wrangler') diff --git a/infinigen/core/nodes/node_transpiler/transpiler.py b/infinigen/core/nodes/node_transpiler/transpiler.py index afe9eb385..e51fde7b5 100644 --- a/infinigen/core/nodes/node_transpiler/transpiler.py +++ b/infinigen/core/nodes/node_transpiler/transpiler.py @@ -61,10 +61,10 @@ def prefix(dependencies_used) -> str: "import bpy\n" "import mathutils\n" "from numpy.random import uniform, normal, randint\n" - "from nodes.node_wrangler import Nodes, NodeWrangler\n" - "from nodes import node_utils\n" - "from nodes.color import color_category\n" - "from surfaces import surface\n" + "from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler\n" + "from infinigen.core.nodes import node_utils\n" + "from infinigen.core.nodes.color import color_category\n" + "from infinigen.core import surface\n" ) deps_table = [(ng_name, name_used[0]) for ng_name, name_used in dependencies_used.items() if name_used[1]] diff --git a/infinigen/core/nodes/node_transpiler/transpiler_dev_script.py b/infinigen/core/nodes/node_transpiler/transpiler_dev_script.py index 22e1e10ef..2b62e83d6 100644 --- a/infinigen/core/nodes/node_transpiler/transpiler_dev_script.py +++ b/infinigen/core/nodes/node_transpiler/transpiler_dev_script.py @@ -5,14 +5,14 @@ ''' -1. Create a blender file at worldgen/dev_scene.blend +1. Create a blender file 2. Click the "Scripting" tab 3. Copy this script into a new script 4. Set the 'mode' to one of the following options: - mode='print' will print the result script to your terminal - mode='make_script' will create a new script in your blender UI, which you can open and run to apply the node code to an object of your choice - - mode='write_file' will write the script to a new file called 'worldgen/generated_surface_script.py. + - mode='write_file' will write the script to a new file called 'generated_surface_script.py. Make sure not to rename / move the script before committing it to git. 5. Select an object which has some materials and/or geometry nodes on it 6. Click the play button at the top of this script to run it! @@ -28,10 +28,8 @@ import bpy import mathutils -sys.path.append(os.getcwd()) - -from nodes.node_transpiler import transpiler -from nodes import node_wrangler, node_info +from infinigen.core.nodes.node_transpiler import transpiler +from infinigen.core.nodes import node_wrangler, node_info mode = 'make_script' target = 'object' diff --git a/infinigen/core/nodes/node_utils.py b/infinigen/core/nodes/node_utils.py index a8f31186d..563b6d114 100644 --- a/infinigen/core/nodes/node_utils.py +++ b/infinigen/core/nodes/node_utils.py @@ -12,10 +12,10 @@ import bpy -from surfaces import surface -from nodes.node_wrangler import Nodes, NodeWrangler -from util.blender import group_in_collection -from nodes.color import random_color_mapping +from infinigen.core import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.util.blender import group_in_collection +from infinigen.core.nodes.color import random_color_mapping def to_material(name, singleton): diff --git a/infinigen/core/nodes/node_wrangler.py b/infinigen/core/nodes/node_wrangler.py index 3331d75db..d2da1dec6 100644 --- a/infinigen/core/nodes/node_wrangler.py +++ b/infinigen/core/nodes/node_wrangler.py @@ -19,10 +19,10 @@ import bpy import numpy as np -from util.random import random_vector3 -from nodes.node_info import Nodes, NODE_ATTRS_AVAILABLE -from nodes import node_info -from nodes.compatibility import COMPATIBILITY_MAPPINGS +from infinigen.core.util.random import random_vector3 +from infinigen.core.nodes.node_info import Nodes, NODE_ATTRS_AVAILABLE +from infinigen.core.nodes import node_info +from infinigen.core.nodes.compatibility import COMPATIBILITY_MAPPINGS logger = logging.getLogger(__name__) diff --git a/infinigen/core/nodes/nodegroups/transfer_attributes.py b/infinigen/core/nodes/nodegroups/transfer_attributes.py index 3a34a32a5..3c8284e65 100644 --- a/infinigen/core/nodes/nodegroups/transfer_attributes.py +++ b/infinigen/core/nodes/nodegroups/transfer_attributes.py @@ -8,10 +8,10 @@ import mathutils import numpy as np from numpy.random import uniform, normal -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils, node_info -from surfaces import surface -from util import blender as butil +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils, node_info +from infinigen.core import surface +from infinigen.core.util import blender as butil def uvs_to_attribute(obj, name='uv_map'): diff --git a/infinigen/core/placement/__init__.py b/infinigen/core/placement/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/infinigen/core/placement/animation_policy.py b/infinigen/core/placement/animation_policy.py index aeb5f08d0..680588c7f 100644 --- a/infinigen/core/placement/animation_policy.py +++ b/infinigen/core/placement/animation_policy.py @@ -17,11 +17,11 @@ from mathutils import Matrix, Vector, Euler from tqdm import trange, tqdm -from assets.creatures.geometry.curve import Curve +from infinigen.assets.creatures.util.geometry.curve import Curve -from util.math import clip_gaussian, lerp -from util.random import random_general -from util import blender as butil +from infinigen.core.util.math import clip_gaussian, lerp +from infinigen.core.util.random import random_general +from infinigen.core.util import blender as butil logger = logging.getLogger(__name__) diff --git a/infinigen/core/placement/camera.py b/infinigen/core/placement/camera.py index 2d69297bb..c59bbcf3c 100644 --- a/infinigen/core/placement/camera.py +++ b/infinigen/core/placement/camera.py @@ -26,21 +26,20 @@ from mathutils import Matrix, Vector, Euler from mathutils.bvhtree import BVHTree -from assets.utils.decorate import toggle_hide -from rendering.post_render import colorize_depth +from infinigen.core.rendering.post_render import colorize_depth from tqdm import tqdm, trange -from placement import placement +from infinigen.core.placement import placement -from nodes import node_utils -from nodes.node_wrangler import NodeWrangler, Nodes +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.node_wrangler import NodeWrangler, Nodes from . import animation_policy -from util import blender as butil -from util.logging import Timer -from util.math import clip_gaussian, lerp -from util import camera -from util.random import random_general +from infinigen.core.util import blender as butil +from infinigen.core.util.logging import Timer +from infinigen.core.util.math import clip_gaussian, lerp +from infinigen.core.util import camera +from infinigen.core.util.random import random_general logger = logging.getLogger(__name__) @@ -539,38 +538,6 @@ def save_camera_parameters(camera_ids, output_folder, frame, use_dof=False): T = np.asarray(camera_obj.matrix_world, dtype=np.float64) @ np.diag((1.,-1.,-1.,1.)) np.savez(output_file, K=np.asarray(K, dtype=np.float64), T=T, HW=height_width) -@node_utils.to_nodegroup('ng_dist2camera', singleton=True, type='GeometryNodeTree') -def ng_dist2camera(nw: NodeWrangler): - traj = get_camera_trajectory() - trajectory = nw.new_node(Nodes.ObjectInfo, [traj]).outputs['Geometry'] - distance = nw.new_node(Nodes.Proximity, [trajectory], attrs={'target_element': 'POINTS'}).outputs['Distance'] - nw.new_node(Nodes.GroupOutput, input_kwargs={"Distance": distance}) - - -def get_camera_trajectory(): - current_frame = bpy.context.scene.frame_current - if 'Cameras' in bpy.data.collections: - locations = [] - for camera_pair in bpy.data.collections['Cameras'].children: - for camera in camera_pair.objects: - for f in camera.animation_data.action.fcurves: - for k in f.keyframe_points: - fr = int(k.co[0]) - bpy.context.scene.frame_set(fr) - locations.append(camera.location) - bpy.context.scene.frame_set(current_frame) - else: - locations = [[100] * 3] - mesh = bpy.data.meshes.new('temp') - mesh.from_pydata(np.vstack(locations), [], []) - mesh.update() - obj = bpy.data.objects.new('temp', mesh) - bpy.context.scene.collection.objects.link(obj) - bpy.context.view_layer.objects.active = obj - butil.modify_mesh(obj, 'WELD', merge_threshold=.1) - toggle_hide(obj) - return obj - if __name__ == "__main__": """ This interactive section generates a depth map by raycasting through each pixel. diff --git a/infinigen/core/placement/density.py b/infinigen/core/placement/density.py index c7f2cbc4d..19d97616d 100644 --- a/infinigen/core/placement/density.py +++ b/infinigen/core/placement/density.py @@ -11,9 +11,9 @@ import mathutils import numpy as np -from nodes.node_wrangler import NodeWrangler, Nodes -from nodes import node_utils as nu -from surfaces.surface import eval_argument +from infinigen.core.nodes.node_wrangler import NodeWrangler, Nodes +from infinigen.core.nodes import node_utils as nu +from infinigen.core.surface import eval_argument logger = logging.getLogger(__name__) diff --git a/infinigen/core/placement/detail.py b/infinigen/core/placement/detail.py index 02e07c45b..d00318f00 100644 --- a/infinigen/core/placement/detail.py +++ b/infinigen/core/placement/detail.py @@ -14,14 +14,14 @@ import numpy as np import gin -from util import blender as butil -from nodes.nodegroups import transfer_attributes -from util.blender import deep_clone_obj +from infinigen.core.util import blender as butil +from infinigen.core.nodes.nodegroups import transfer_attributes +from infinigen.core.util.blender import deep_clone_obj logger = logging.getLogger('detail') -IS_COARSE = False # Global VARIABLE, set by generate.py and used only for whether to emit warnings +IS_COARSE = False # Global VARIABLE, set by examples/generate_nature.py and used only for whether to emit warnings @gin.configurable def scatter_res_distance(dist): diff --git a/infinigen/core/placement/factory.py b/infinigen/core/placement/factory.py index b809da099..8f2270acf 100644 --- a/infinigen/core/placement/factory.py +++ b/infinigen/core/placement/factory.py @@ -14,8 +14,8 @@ import logging from tqdm import trange -from util import blender as butil -from util.math import FixedSeed, int_hash +from infinigen.core.util import blender as butil +from infinigen.core.util.math import FixedSeed, int_hash from . import detail logger = logging.getLogger(__name__) diff --git a/infinigen/core/placement/instance_scatter.py b/infinigen/core/placement/instance_scatter.py index 75631e806..1183be515 100644 --- a/infinigen/core/placement/instance_scatter.py +++ b/infinigen/core/placement/instance_scatter.py @@ -12,11 +12,11 @@ import numpy as np -from assets.utils.misc import CountInstance -from surfaces import surface -from nodes.node_wrangler import Nodes, NodeWrangler -from util import blender as butil -from placement.camera import nodegroup_active_cam_info +from infinigen.assets.utils.misc import CountInstance +from infinigen.core import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.util import blender as butil +from infinigen.core.placement.camera import nodegroup_active_cam_info logger = logging.getLogger(__name__) diff --git a/infinigen/core/placement/particles.py b/infinigen/core/placement/particles.py index 0bfbde237..517c2a4e0 100644 --- a/infinigen/core/placement/particles.py +++ b/infinigen/core/placement/particles.py @@ -15,9 +15,9 @@ from numpy.random import uniform as U, normal as N, uniform import bpy -import util -from util import blender as butil -from util.random import log_uniform +from infinigen.core.util.logging import Suppress +from infinigen.core.util import blender as butil +from infinigen.core.util.random import log_uniform def bake(emitter, system): @@ -31,7 +31,7 @@ def bake(emitter, system): 'active_object': emitter, 'point_cache': system.point_cache, } - with util.logging.Suppress(): + with Suppress(): bpy.context.scene.frame_end += 1 bpy.ops.ptcache.bake(override, bake=True) bpy.context.scene.frame_end -= 1 diff --git a/infinigen/core/placement/placement.py b/infinigen/core/placement/placement.py index 9a63f7b14..f97e0a9bd 100644 --- a/infinigen/core/placement/placement.py +++ b/infinigen/core/placement/placement.py @@ -19,14 +19,13 @@ from mathutils.bvhtree import BVHTree -import util -from util import blender as butil, camera as camera_util +from infinigen.core.util import blender as butil, camera as camera_util -from nodes.node_wrangler import NodeWrangler, Nodes, geometry_node_group_empty_new -from surfaces import surface +from infinigen.core.nodes.node_wrangler import NodeWrangler, Nodes, geometry_node_group_empty_new +from infinigen.core import surface from .factory import AssetFactory -from placement import detail +from infinigen.core.placement import detail logger = logging.getLogger('placement') diff --git a/infinigen/core/placement/split_in_view.py b/infinigen/core/placement/split_in_view.py index 5149e340d..e0cab09f7 100644 --- a/infinigen/core/placement/split_in_view.py +++ b/infinigen/core/placement/split_in_view.py @@ -12,10 +12,10 @@ import numpy as np from tqdm import trange -from util import blender as butil, camera as cam_util, math -from util.logging import Suppress -from placement.camera import get_sensor_coords -from surfaces import surface +from infinigen.core.util import blender as butil, camera as cam_util, math +from infinigen.core.util.logging import Suppress +from infinigen.core.placement.camera import get_sensor_coords +from infinigen.core import surface def raycast_visiblity_mask(obj, cam, start=None, end=None, verbose=True): diff --git a/infinigen/core/rendering/auto_exposure.py b/infinigen/core/rendering/auto_exposure.py index 8486ffd70..68dc77117 100644 --- a/infinigen/core/rendering/auto_exposure.py +++ b/infinigen/core/rendering/auto_exposure.py @@ -4,10 +4,10 @@ import bpy import mathutils from numpy.random import uniform, normal, randint -from nodes.node_wrangler import Nodes, NodeWrangler -from nodes import node_utils -from nodes.color import color_category -from surfaces import surface +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.nodes import node_utils +from infinigen.core.nodes.color import color_category +from infinigen.core import surface @node_utils.to_nodegroup('nodegroup_auto_exposure', singleton=False, type='CompositorNodeTree') def nodegroup_auto_exposure(nw: NodeWrangler): diff --git a/infinigen/core/rendering/render.py b/infinigen/core/rendering/render.py index ea3aa96dc..bcfdf77da 100644 --- a/infinigen/core/rendering/render.py +++ b/infinigen/core/rendering/render.py @@ -18,17 +18,17 @@ import numpy as np from imageio import imread, imwrite -from infinigen_gpl.extras.enable_gpu import enable_gpu -from nodes.node_wrangler import Nodes, NodeWrangler -from placement import camera as cam_util -from rendering.post_render import (colorize_depth, colorize_flow, +from infinigen.infinigen_gpl.extras.enable_gpu import enable_gpu +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.core.placement import camera as cam_util +from infinigen.core.rendering.post_render import (colorize_depth, colorize_flow, colorize_normals, colorize_int_array, load_depth, load_flow, load_normals, load_seg_mask, load_uniq_inst) -from surfaces import surface -from util import blender as butil -from util import exporting as exputil -from util.logging import Timer +from infinigen.core import surface +from infinigen.core.util import blender as butil +from infinigen.core.util import exporting as exputil +from infinigen.core.util.logging import Timer from .auto_exposure import nodegroup_auto_exposure diff --git a/infinigen/core/rendering/resample.py b/infinigen/core/rendering/resample.py index 03d80cc1e..a0085d84e 100644 --- a/infinigen/core/rendering/resample.py +++ b/infinigen/core/rendering/resample.py @@ -7,17 +7,17 @@ import bpy -from nodes.node_utils import resample_node_group -from nodes.node_wrangler import NodeWrangler +from infinigen.core.nodes.node_utils import resample_node_group +from infinigen.core.nodes.node_wrangler import NodeWrangler -from lighting import lighting +from infinigen.assets.lighting import sky_lighting -from assets.trees.generate import TreeFactory, BushFactory -from assets.glowing_rocks import GlowingRocksFactory +from infinigen.assets.trees.generate import TreeFactory, BushFactory +from infinigen.assets.lighting.glowing_rocks import GlowingRocksFactory -from util.logging import Timer -from util.math import FixedSeed, int_hash -from util import blender as butil +from infinigen.core.util.logging import Timer +from infinigen.core.util.math import FixedSeed, int_hash +from infinigen.core.util import blender as butil def resample_all(factory_class): for placeholder_col in butil.get_collection('placeholders').children: @@ -48,4 +48,4 @@ def resample_scene(scene_seed): resample_all(BushFactory) #resample_all(CreatureFactory) with FixedSeed(scene_seed): - lighting.add_lighting() \ No newline at end of file + sky_lighting.add_lighting() \ No newline at end of file diff --git a/infinigen/core/surfaces/surface.py b/infinigen/core/surface.py similarity index 96% rename from infinigen/core/surfaces/surface.py rename to infinigen/core/surface.py index 0999a74d3..664179a77 100644 --- a/infinigen/core/surfaces/surface.py +++ b/infinigen/core/surface.py @@ -17,10 +17,10 @@ import numpy as np from tqdm import trange -from util import blender as butil -from util.blender import set_geomod_inputs # got moved, left here for import compatibility -from nodes.node_wrangler import NodeWrangler, Nodes, isnode, infer_output_socket, geometry_node_group_empty_new -from nodes import node_info +from infinigen.core.util import blender as butil +from infinigen.core.util.blender import set_geomod_inputs # got moved, left here for import compatibility +from infinigen.core.nodes.node_wrangler import NodeWrangler, Nodes, isnode, infer_output_socket, geometry_node_group_empty_new +from infinigen.core.nodes import node_info def remove_materials(obj): with butil.SelectObjects(obj): @@ -365,7 +365,11 @@ def get_surface(name): if name == '': return NoApply - prefixes = ['infinigen_gpl.surfaces', 'surfaces.templates', 'surfaces.scatters'] + prefixes = [ + 'infinigen.infinigen_gpl.surfaces', + 'infinigen.assets.materials', + 'infinigen.assets.scatters' + ] for prefix in prefixes: try: return importlib.import_module(prefix + '.' + name) diff --git a/infinigen/core/util/__init__.py b/infinigen/core/util/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/infinigen/core/util/blender.py b/infinigen/core/util/blender.py index 7b1bb504b..8bfd30594 100644 --- a/infinigen/core/util/blender.py +++ b/infinigen/core/util/blender.py @@ -29,7 +29,7 @@ from .math import lerp # for other people to import from this file from . import math as mutil from .logging import Suppress -from nodes.node_info import DATATYPE_FIELDS, DATATYPE_DIMS +from infinigen.core.nodes.node_info import DATATYPE_FIELDS, DATATYPE_DIMS logger = logging.getLogger(__name__) diff --git a/infinigen/core/util/camera.py b/infinigen/core/util/camera.py index 4e4d4d68a..0c0dbff68 100644 --- a/infinigen/core/util/camera.py +++ b/infinigen/core/util/camera.py @@ -12,8 +12,8 @@ import bpy_extras from tqdm import trange -from util.math import homogenize, dehomogenize -from util import blender as butil +from infinigen.core.util.math import homogenize, dehomogenize +from infinigen.core.util import blender as butil #--------------------------------------------------------------- # 3x4 P matrix from Blender camera diff --git a/infinigen/core/util/exporting.py b/infinigen/core/util/exporting.py index f1a92e242..cee721207 100644 --- a/infinigen/core/util/exporting.py +++ b/infinigen/core/util/exporting.py @@ -15,7 +15,7 @@ import numpy as np from itertools import chain, product from tqdm import tqdm -from util.math import int_hash +from infinigen.core.util.math import int_hash from bpy.types import DepsgraphObjectInstance def get_mesh_data(obj): diff --git a/infinigen/core/util/logging.py b/infinigen/core/util/logging.py index 8f355458d..4b2af4d20 100644 --- a/infinigen/core/util/logging.py +++ b/infinigen/core/util/logging.py @@ -15,7 +15,6 @@ import bpy import gin -from termcolor import colored timer_results = logging.getLogger('times') diff --git a/infinigen/core/util/pipeline.py b/infinigen/core/util/pipeline.py index 6caa303ef..e97d37d28 100644 --- a/infinigen/core/util/pipeline.py +++ b/infinigen/core/util/pipeline.py @@ -14,9 +14,9 @@ from contextlib import nullcontext -from util.math import FixedSeed, int_hash -from util.logging import Timer -from util.blender import GarbageCollect, count_instance, count_objects +from infinigen.core.util.math import FixedSeed, int_hash +from infinigen.core.util.logging import Timer +from infinigen.core.util.blender import GarbageCollect, count_instance, count_objects class RandomStageExecutor: diff --git a/infinigen/core/util/random.py b/infinigen/core/util/random.py index c59ea044c..c27bdd9f9 100644 --- a/infinigen/core/util/random.py +++ b/infinigen/core/util/random.py @@ -4,10 +4,10 @@ # Authors: Zeyu Ma, Alexander Raistrick -from nodes.color import color_category +from infinigen.core.nodes.color import color_category import gin import numpy as np -from util.math import md5_hash, clip_gaussian +from infinigen.core.util.math import md5_hash, clip_gaussian import random import json import json5 @@ -60,7 +60,7 @@ def random_general(var): num_sample = 1 else: num_sample = args[1] - color_template = json5.load(open(f"config/palette/{args[0]}.json", "r")) + color_template = json5.load(open(f"examples/configs/palette/{args[0]}.json", "r")) colors = color_template["color"] means = np.array(color_template["hsv"]) stds = np.array(color_template["std"]) diff --git a/infinigen/datagen/custom_ground_truth/.gitignore b/infinigen/datagen/customgt/.gitignore similarity index 100% rename from infinigen/datagen/custom_ground_truth/.gitignore rename to infinigen/datagen/customgt/.gitignore diff --git a/infinigen/datagen/custom_ground_truth/CMakeLists.txt b/infinigen/datagen/customgt/CMakeLists.txt similarity index 79% rename from infinigen/datagen/custom_ground_truth/CMakeLists.txt rename to infinigen/datagen/customgt/CMakeLists.txt index 2e01a4f67..c14932ba0 100644 --- a/infinigen/datagen/custom_ground_truth/CMakeLists.txt +++ b/infinigen/datagen/customgt/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.10.0) -project(process_mesh VERSION 0.1.0) +project(customgt VERSION 0.1.0) if (NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" OR ${CMAKE_SYSTEM_NAME} MATCHES "Linux")) message(FATAL_ERROR "${CMAKE_SYSTEM_NAME} not supported") @@ -49,16 +49,16 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") link_libraries(stdc++fs) endif() -add_executable(process_mesh ${ADJACENT_SRC_FILES} dependencies/scharstein_flow_viz/colorcode.cpp dependencies/fast_obj/fast_obj.h dependencies/fast_obj/fast_obj.c dependencies/glad/src/glad.c dependencies/glad/src/glad_egl.c) +add_executable(customgt ${ADJACENT_SRC_FILES} dependencies/scharstein_flow_viz/colorcode.cpp dependencies/fast_obj/fast_obj.h dependencies/fast_obj/fast_obj.c dependencies/glad/src/glad.c dependencies/glad/src/glad_egl.c) -set_property(TARGET process_mesh PROPERTY CXX_STANDARD 17) +set_property(TARGET customgt PROPERTY CXX_STANDARD 17) set(CPACK_PROJECT_NAME ${PROJECT_NAME}) set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) include(CPack) if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - target_link_libraries(process_mesh dl m stdc++ cnpy glfw) + target_link_libraries(customgt dl m stdc++ cnpy glfw) elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - target_link_libraries(process_mesh GL GLU dl EGL m stdc++ X11 cnpy) + target_link_libraries(customgt GL GLU dl EGL m stdc++ X11 cnpy) endif() diff --git a/infinigen/datagen/custom_ground_truth/blender_object.cpp b/infinigen/datagen/customgt/blender_object.cpp similarity index 100% rename from infinigen/datagen/custom_ground_truth/blender_object.cpp rename to infinigen/datagen/customgt/blender_object.cpp diff --git a/infinigen/datagen/custom_ground_truth/blender_object.hpp b/infinigen/datagen/customgt/blender_object.hpp similarity index 100% rename from infinigen/datagen/custom_ground_truth/blender_object.hpp rename to infinigen/datagen/customgt/blender_object.hpp diff --git a/infinigen/datagen/custom_ground_truth/buffer_arrays.cpp b/infinigen/datagen/customgt/buffer_arrays.cpp similarity index 100% rename from infinigen/datagen/custom_ground_truth/buffer_arrays.cpp rename to infinigen/datagen/customgt/buffer_arrays.cpp diff --git a/infinigen/datagen/custom_ground_truth/buffer_arrays.hpp b/infinigen/datagen/customgt/buffer_arrays.hpp similarity index 100% rename from infinigen/datagen/custom_ground_truth/buffer_arrays.hpp rename to infinigen/datagen/customgt/buffer_arrays.hpp diff --git a/infinigen/datagen/custom_ground_truth/camera_view.cpp b/infinigen/datagen/customgt/camera_view.cpp similarity index 100% rename from infinigen/datagen/custom_ground_truth/camera_view.cpp rename to infinigen/datagen/customgt/camera_view.cpp diff --git a/infinigen/datagen/custom_ground_truth/camera_view.hpp b/infinigen/datagen/customgt/camera_view.hpp similarity index 100% rename from infinigen/datagen/custom_ground_truth/camera_view.hpp rename to infinigen/datagen/customgt/camera_view.hpp diff --git a/infinigen/datagen/custom_ground_truth/compress_masks.py b/infinigen/datagen/customgt/compress_masks.py similarity index 100% rename from infinigen/datagen/custom_ground_truth/compress_masks.py rename to infinigen/datagen/customgt/compress_masks.py diff --git a/infinigen/datagen/custom_ground_truth/dependencies/argparse b/infinigen/datagen/customgt/dependencies/argparse similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/argparse rename to infinigen/datagen/customgt/dependencies/argparse diff --git a/infinigen/datagen/custom_ground_truth/dependencies/cnpy b/infinigen/datagen/customgt/dependencies/cnpy similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/cnpy rename to infinigen/datagen/customgt/dependencies/cnpy diff --git a/infinigen/datagen/custom_ground_truth/dependencies/eigen b/infinigen/datagen/customgt/dependencies/eigen similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/eigen rename to infinigen/datagen/customgt/dependencies/eigen diff --git a/infinigen/datagen/custom_ground_truth/dependencies/fast_obj b/infinigen/datagen/customgt/dependencies/fast_obj similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/fast_obj rename to infinigen/datagen/customgt/dependencies/fast_obj diff --git a/infinigen/datagen/custom_ground_truth/dependencies/glad/include/EGL/eglplatform.h b/infinigen/datagen/customgt/dependencies/glad/include/EGL/eglplatform.h similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/glad/include/EGL/eglplatform.h rename to infinigen/datagen/customgt/dependencies/glad/include/EGL/eglplatform.h diff --git a/infinigen/datagen/custom_ground_truth/dependencies/glad/include/KHR/khrplatform.h b/infinigen/datagen/customgt/dependencies/glad/include/KHR/khrplatform.h similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/glad/include/KHR/khrplatform.h rename to infinigen/datagen/customgt/dependencies/glad/include/KHR/khrplatform.h diff --git a/infinigen/datagen/custom_ground_truth/dependencies/glad/include/glad/glad.h b/infinigen/datagen/customgt/dependencies/glad/include/glad/glad.h similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/glad/include/glad/glad.h rename to infinigen/datagen/customgt/dependencies/glad/include/glad/glad.h diff --git a/infinigen/datagen/custom_ground_truth/dependencies/glad/include/glad/glad_egl.h b/infinigen/datagen/customgt/dependencies/glad/include/glad/glad_egl.h similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/glad/include/glad/glad_egl.h rename to infinigen/datagen/customgt/dependencies/glad/include/glad/glad_egl.h diff --git a/infinigen/datagen/custom_ground_truth/dependencies/glad/src/glad.c b/infinigen/datagen/customgt/dependencies/glad/src/glad.c similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/glad/src/glad.c rename to infinigen/datagen/customgt/dependencies/glad/src/glad.c diff --git a/infinigen/datagen/custom_ground_truth/dependencies/glad/src/glad_egl.c b/infinigen/datagen/customgt/dependencies/glad/src/glad_egl.c similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/glad/src/glad_egl.c rename to infinigen/datagen/customgt/dependencies/glad/src/glad_egl.c diff --git a/infinigen/datagen/custom_ground_truth/dependencies/glfw b/infinigen/datagen/customgt/dependencies/glfw similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/glfw rename to infinigen/datagen/customgt/dependencies/glfw diff --git a/infinigen/datagen/custom_ground_truth/dependencies/glm b/infinigen/datagen/customgt/dependencies/glm similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/glm rename to infinigen/datagen/customgt/dependencies/glm diff --git a/infinigen/datagen/custom_ground_truth/dependencies/indicators b/infinigen/datagen/customgt/dependencies/indicators similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/indicators rename to infinigen/datagen/customgt/dependencies/indicators diff --git a/infinigen/datagen/custom_ground_truth/dependencies/json b/infinigen/datagen/customgt/dependencies/json similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/json rename to infinigen/datagen/customgt/dependencies/json diff --git a/infinigen/datagen/custom_ground_truth/dependencies/scharstein_flow_viz/README.txt b/infinigen/datagen/customgt/dependencies/scharstein_flow_viz/README.txt similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/scharstein_flow_viz/README.txt rename to infinigen/datagen/customgt/dependencies/scharstein_flow_viz/README.txt diff --git a/infinigen/datagen/custom_ground_truth/dependencies/scharstein_flow_viz/colorcode.cpp b/infinigen/datagen/customgt/dependencies/scharstein_flow_viz/colorcode.cpp similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/scharstein_flow_viz/colorcode.cpp rename to infinigen/datagen/customgt/dependencies/scharstein_flow_viz/colorcode.cpp diff --git a/infinigen/datagen/custom_ground_truth/dependencies/scharstein_flow_viz/colorcode.h b/infinigen/datagen/customgt/dependencies/scharstein_flow_viz/colorcode.h similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/scharstein_flow_viz/colorcode.h rename to infinigen/datagen/customgt/dependencies/scharstein_flow_viz/colorcode.h diff --git a/infinigen/datagen/custom_ground_truth/dependencies/stb b/infinigen/datagen/customgt/dependencies/stb similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/stb rename to infinigen/datagen/customgt/dependencies/stb diff --git a/infinigen/datagen/custom_ground_truth/dependencies/tinycolormap b/infinigen/datagen/customgt/dependencies/tinycolormap similarity index 100% rename from infinigen/datagen/custom_ground_truth/dependencies/tinycolormap rename to infinigen/datagen/customgt/dependencies/tinycolormap diff --git a/infinigen/datagen/custom_ground_truth/glsl/hair.frag b/infinigen/datagen/customgt/glsl/hair.frag similarity index 100% rename from infinigen/datagen/custom_ground_truth/glsl/hair.frag rename to infinigen/datagen/customgt/glsl/hair.frag diff --git a/infinigen/datagen/custom_ground_truth/glsl/hair.geom b/infinigen/datagen/customgt/glsl/hair.geom similarity index 100% rename from infinigen/datagen/custom_ground_truth/glsl/hair.geom rename to infinigen/datagen/customgt/glsl/hair.geom diff --git a/infinigen/datagen/custom_ground_truth/glsl/hair.vert b/infinigen/datagen/customgt/glsl/hair.vert similarity index 100% rename from infinigen/datagen/custom_ground_truth/glsl/hair.vert rename to infinigen/datagen/customgt/glsl/hair.vert diff --git a/infinigen/datagen/custom_ground_truth/glsl/next_wings.vert b/infinigen/datagen/customgt/glsl/next_wings.vert similarity index 100% rename from infinigen/datagen/custom_ground_truth/glsl/next_wings.vert rename to infinigen/datagen/customgt/glsl/next_wings.vert diff --git a/infinigen/datagen/custom_ground_truth/glsl/spine.frag b/infinigen/datagen/customgt/glsl/spine.frag similarity index 100% rename from infinigen/datagen/custom_ground_truth/glsl/spine.frag rename to infinigen/datagen/customgt/glsl/spine.frag diff --git a/infinigen/datagen/custom_ground_truth/glsl/spine.geom b/infinigen/datagen/customgt/glsl/spine.geom similarity index 100% rename from infinigen/datagen/custom_ground_truth/glsl/spine.geom rename to infinigen/datagen/customgt/glsl/spine.geom diff --git a/infinigen/datagen/custom_ground_truth/glsl/wings.frag b/infinigen/datagen/customgt/glsl/wings.frag similarity index 100% rename from infinigen/datagen/custom_ground_truth/glsl/wings.frag rename to infinigen/datagen/customgt/glsl/wings.frag diff --git a/infinigen/datagen/custom_ground_truth/glsl/wings.geom b/infinigen/datagen/customgt/glsl/wings.geom similarity index 100% rename from infinigen/datagen/custom_ground_truth/glsl/wings.geom rename to infinigen/datagen/customgt/glsl/wings.geom diff --git a/infinigen/datagen/custom_ground_truth/glsl/wings.vert b/infinigen/datagen/customgt/glsl/wings.vert similarity index 100% rename from infinigen/datagen/custom_ground_truth/glsl/wings.vert rename to infinigen/datagen/customgt/glsl/wings.vert diff --git a/infinigen/datagen/custom_ground_truth/io.cpp b/infinigen/datagen/customgt/io.cpp similarity index 100% rename from infinigen/datagen/custom_ground_truth/io.cpp rename to infinigen/datagen/customgt/io.cpp diff --git a/infinigen/datagen/custom_ground_truth/io.hpp b/infinigen/datagen/customgt/io.hpp similarity index 100% rename from infinigen/datagen/custom_ground_truth/io.hpp rename to infinigen/datagen/customgt/io.hpp diff --git a/infinigen/datagen/custom_ground_truth/load_blender_mesh.cpp b/infinigen/datagen/customgt/load_blender_mesh.cpp similarity index 100% rename from infinigen/datagen/custom_ground_truth/load_blender_mesh.cpp rename to infinigen/datagen/customgt/load_blender_mesh.cpp diff --git a/infinigen/datagen/custom_ground_truth/load_blender_mesh.hpp b/infinigen/datagen/customgt/load_blender_mesh.hpp similarity index 100% rename from infinigen/datagen/custom_ground_truth/load_blender_mesh.hpp rename to infinigen/datagen/customgt/load_blender_mesh.hpp diff --git a/infinigen/datagen/custom_ground_truth/main.cpp b/infinigen/datagen/customgt/main.cpp similarity index 99% rename from infinigen/datagen/custom_ground_truth/main.cpp rename to infinigen/datagen/customgt/main.cpp index 332f0c3bb..7b59264b7 100644 --- a/infinigen/datagen/custom_ground_truth/main.cpp +++ b/infinigen/datagen/customgt/main.cpp @@ -92,7 +92,7 @@ int main(int argc, char *argv[]) { const std::regex regex{"VERSION \\\"([0-9\\.]+)\\\""}; std::smatch m; if ((std::regex_search(file_text, m, regex)) && (VERSION != m[1])){ - std::cerr << "Error: The process_mesh executable is out-of-date, you need to re-compile it." << std::endl; + std::cerr << "Error: The customgt executable is out-of-date, you need to re-compile it." << std::endl; exit(1); } diff --git a/infinigen/datagen/custom_ground_truth/shader.cpp b/infinigen/datagen/customgt/shader.cpp similarity index 100% rename from infinigen/datagen/custom_ground_truth/shader.cpp rename to infinigen/datagen/customgt/shader.cpp diff --git a/infinigen/datagen/custom_ground_truth/shader.hpp b/infinigen/datagen/customgt/shader.hpp similarity index 100% rename from infinigen/datagen/custom_ground_truth/shader.hpp rename to infinigen/datagen/customgt/shader.hpp diff --git a/infinigen/datagen/custom_ground_truth/show.py b/infinigen/datagen/customgt/show.py similarity index 100% rename from infinigen/datagen/custom_ground_truth/show.py rename to infinigen/datagen/customgt/show.py diff --git a/infinigen/datagen/custom_ground_truth/string_tools.cpp b/infinigen/datagen/customgt/string_tools.cpp similarity index 100% rename from infinigen/datagen/custom_ground_truth/string_tools.cpp rename to infinigen/datagen/customgt/string_tools.cpp diff --git a/infinigen/datagen/custom_ground_truth/string_tools.hpp b/infinigen/datagen/customgt/string_tools.hpp similarity index 100% rename from infinigen/datagen/custom_ground_truth/string_tools.hpp rename to infinigen/datagen/customgt/string_tools.hpp diff --git a/infinigen/datagen/custom_ground_truth/utils.cpp b/infinigen/datagen/customgt/utils.cpp similarity index 100% rename from infinigen/datagen/custom_ground_truth/utils.cpp rename to infinigen/datagen/customgt/utils.cpp diff --git a/infinigen/datagen/custom_ground_truth/utils.hpp b/infinigen/datagen/customgt/utils.hpp similarity index 100% rename from infinigen/datagen/custom_ground_truth/utils.hpp rename to infinigen/datagen/customgt/utils.hpp diff --git a/infinigen/datagen/job_funcs.py b/infinigen/datagen/job_funcs.py index a8a618b41..438ac8ced 100644 --- a/infinigen/datagen/job_funcs.py +++ b/infinigen/datagen/job_funcs.py @@ -337,7 +337,7 @@ def queue_opengl( tmp_script = Path(folder) / "tmp" / f"opengl_{uuid4().hex}.sh" tmp_script.parent.mkdir(exist_ok=True) - process_mesh_path = Path("../process_mesh/build/process_mesh").resolve() + process_mesh_path = Path("infinigen/datagen/customgt/build/customgt").resolve() input_folder = Path(folder)/f'savemesh{output_suffix}' # OUTPUT SUFFIX IS CORRECT HERE. I know its weird. But input suffix really means 'prev tier of the pipeline if (gt_testing): copy_folder = Path(folder) / f"frames{output_suffix}" diff --git a/infinigen/datagen/manage_jobs copy.py b/infinigen/datagen/manage_jobs copy.py deleted file mode 100644 index cafb59e2d..000000000 --- a/infinigen/datagen/manage_jobs copy.py +++ /dev/null @@ -1,1278 +0,0 @@ -# Copyright (c) Princeton University. -# This source code is licensed under the BSD 3-Clause license found in the LICENSE file in the root directory of this source tree. - -# Authors: -# - Alex Raistrick: refactor, local rendering, video rendering -# - Lahav Lipson: stereo version, local rendering -# - Hei Law: initial version - - -import argparse -import logging -import os -import re -import random -import gin -import subprocess -import time -import sys -import time -import math -import itertools -from uuid import uuid4 -from enum import Enum -from copy import copy -from ast import literal_eval - -from functools import partial, cache -from collections import defaultdict -from datetime import datetime -from pathlib import Path -from shutil import which, rmtree, copyfile, copytree - -import pandas as pd -from tqdm import tqdm - -import numpy as np -import submitit -import wandb -from jinja2 import Environment, FileSystemLoader, select_autoescape - -from tools.util.show_gpu_table import nodes_with_gpus -from tools.util.cleanup import cleanup -from tools.util.submitit_emulator import ScheduledLocalExecutor, ImmediateLocalExecutor, LocalScheduleHandler, LocalJob - -from tools.util import upload_util -from tools.util.upload_util import upload_job_folder # for pickle not to freak out - -PARTITION_ENVVAR = 'INFINIGEN_SLURMPARTITION' # used only if enabled in config -EXCLUDE_FILE_ENVVAR = 'INFINIGEN_SLURM_EXCLUDENODES_LIST' - -class JobState: - NotQueued = "notqueued" - Queued = "queued" - Running = "running" - Succeeded = "succeeded" - Failed = "crashed" - -class SceneState: - NotDone = "notdone" - Done = "done" - Crashed = "crashed" - -JOB_OBJ_SUCCEEDED = 'MARK_AS_SUCCEEDED' -CONCLUDED_STATES = {JobState.Succeeded, JobState.Failed} - -# Will throw exception if the scene was not found. Sometimes this happens if the scene was queued very very recently -# Keys: JobID ArrayJobID User Group State Clustername Ncpus Nnodes Ntasks Reqmem PerNode Cput Walltime Mem ExitStatus -@gin.configurable -def seff(job_obj, retry_on_error=True): - scene_id = job_obj.job_id - assert scene_id.isdigit() - while True: - try: - seff_out = subprocess.check_output(f"/usr/bin/seff -d {scene_id}".split()).decode() - lines = seff_out.splitlines() - return dict(zip(lines[0].split(' ')[2:], lines[1].split(' ')[2:]))["State"] - except: - if not retry_on_error: - raise - time.sleep(1) - -def node_from_slurm_jobid(scene_id): - - if not which('sacct'): - return None - - try: - node_of_scene, *rest = subprocess.check_output(f"{which('sacct')} -j {scene_id} --format Node --noheader".split()).decode().split() - return node_of_scene - except Exception as e: - logging.warning(f'sacct threw {e}') - return None - -def get_scene_state(scene_dict, taskname, scene_folder): - - if not scene_dict.get(f'{taskname}_submitted', False): - return JobState.NotQueued - if scene_dict.get(f'{taskname}_crash_recorded', False): - return JobState.Failed - - job_obj = scene_dict[f'{taskname}_job_obj'] - - # for when both local and slurm scenes are being mixed - if isinstance(job_obj, str): - assert job_obj == JOB_OBJ_SUCCEEDED - return JobState.Succeeded - elif isinstance(job_obj, LocalJob): - res = job_obj.status() - else: - res = seff(job_obj) - - # map from submitit's scene state strings to our JobState enum - if res in {"PENDING", "REQUEUED"}: - return JobState.Queued - elif res == 'RUNNING': - return JobState.Running - elif not (scene_folder/"logs"/f"FINISH_{taskname}").exists(): - return JobState.Failed - - return JobState.Succeeded - -def seed_generator(): - seed_int = np.random.randint(np.iinfo(np.int32).max) - return hex(seed_int).removeprefix('0x') - -@gin.configurable -def get_cmd( - seed, - task, - configs, - taskname, - output_folder, - driver_script='generate.py', - input_folder=None, - process_niceness=None, -): - - if isinstance(task, list): - task = " ".join(task) - - cmd = '' - if process_niceness is not None: - cmd += f'nice -n {process_niceness} ' - cmd += f'python {driver_script} -- ' - if input_folder is not None: - cmd += '--input_folder ' + str(input_folder) + ' ' - if output_folder is not None: - cmd += '--output_folder ' + str(output_folder) + ' ' - cmd += f'--seed {seed} --task {task} --task_uniqname {taskname} ' - if len(configs) != 0: - cmd += f'-g {" ".join(configs)} ' - cmd += '-p' - - return cmd.split() - -@gin.configurable -def get_slurm_banned_nodes(config_path=None): - if config_path == f'ENVVAR_{EXCLUDE_FILE_ENVVAR}': - config_path = os.environ.get(EXCLUDE_FILE_ENVVAR) - if config_path is None: - return [] - with Path(config_path).open('r') as f: - return list(f.read().split()) - -def get_suffix(indices): - - suffix = '' - - if indices is None: - return suffix - - indices = copy(indices) - - for key in ['cam_rig', 'resample', 'frame', 'subcam']: - val = indices.get(key, 0) - suffix += '_' + (f'{val}' if key != 'frame' else f'{val:04d}') - - return suffix - -@gin.configurable -def slurm_submit_cmd( - cmd, - folder, - name, - mem_gb=None, - cpus=None, - gpus=0, - hours=1, - slurm_account=None, - slurm_exclude: list = None, - slurm_niceness=None, - **_ -): - - executor = submitit.AutoExecutor(folder=(folder / "logs")) - executor.update_parameters( - mem_gb=mem_gb, - name=name, - cpus_per_task=cpus, - timeout_min=60*hours, - ) - - if slurm_exclude is not None: - executor.update_parameters(slurm_exclude=','.join(slurm_exclude)) - - if gpus > 0: - executor.update_parameters(gpus_per_node=gpus) - if slurm_account is not None: - - if slurm_account == f'ENVVAR_{PARTITION_ENVVAR}': - slurm_account = os.environ.get(PARTITION_ENVVAR) - if slurm_account is None: - logging.warning(f'{PARTITION_ENVVAR=} was not set, using no slurm account') - - executor.update_parameters(slurm_account=slurm_account) - - slurm_additional_params = {} - - if slurm_niceness is not None: - slurm_additional_params['nice'] = slurm_niceness - - executor.update_parameters(slurm_additional_parameters=slurm_additional_params) - - while True: - try: - if callable(cmd[0]): - func, *arg = cmd - return executor.submit(func, *arg) - render_fn = submitit.helpers.CommandFunction(cmd) - return executor.submit(render_fn) - except submitit.core.utils.FailedJobError as e: - current_time_str = datetime.now().strftime("%m/%d %I:%M%p") - print(f"[{current_time_str}] Job submission failed with error:\n{e}") - time.sleep(60) - -@gin.configurable -def local_submit_cmd(cmd, folder, name, use_scheduler=False, **kwargs): - - ExecutorClass = ScheduledLocalExecutor if use_scheduler else ImmediateLocalExecutor - executor = ExecutorClass(folder=(folder / "logs")) - executor.update_parameters(name=name, **kwargs) - if callable(cmd[0]): - func, *arg = cmd - return executor.submit(func, *arg) - else: - func = submitit.helpers.CommandFunction(cmd) - return executor.submit(func) - -@gin.configurable -def queue_upload(folder, submit_cmd, name, taskname, dir_prefix_len=0, method='rclone', seed=None, **kwargs): - func = partial(upload_job_folder, dir_prefix_len=dir_prefix_len, method=method) - res = submit_cmd((func, folder, taskname), folder, name, **kwargs) - return res, None - -@gin.configurable -def queue_coarse( - folder, - submit_cmd, - name, - seed, - configs, - taskname=None, - exclude_gpus=[], - overrides=[], - input_indices=None, output_indices=None, - **kwargs -): - """ - Generating the coarse scene - """ - - input_suffix = get_suffix(input_indices) - output_suffix = get_suffix(output_indices) - - output_folder = Path(f'{folder}/coarse{output_suffix}') - - cmd = get_cmd(seed, 'coarse', configs, taskname, output_folder=output_folder) + f''' - LOG_DIR='{folder / "logs"}' - '''.split("\n") + overrides - - with (folder / "run_pipeline.sh").open('w') as f: - f.write(f"{' '.join(' '.join(cmd).split())}\n\n") - (folder / "run_pipeline.sh").chmod(0o774) - - res = submit_cmd(cmd, - folder=folder, - name=name, - gpus=0, - slurm_exclude=nodes_with_gpus(*exclude_gpus) + get_slurm_banned_nodes(), - **kwargs - ) - return res, output_folder - -@gin.configurable -def queue_populate( - submit_cmd, - folder, - name, - seed, - configs, - taskname=None, - overrides=[], - input_indices=None, output_indices=None, - **kwargs, -): - """ - Generating the fine scene - """ - - input_suffix = get_suffix(input_indices) - output_suffix = get_suffix(output_indices) - - input_folder = folder/f'coarse{input_suffix}' - output_folder = input_folder - - cmd = get_cmd(seed, 'populate', configs, taskname, - input_folder=input_folder, - output_folder=output_folder) + f''' - LOG_DIR='{folder / "logs"}' - '''.split("\n") + overrides - - with (folder / "run_pipeline.sh").open('a') as f: - f.write(f"{' '.join(' '.join(cmd).split())}\n\n") - - res = submit_cmd(cmd, - folder=folder, - name=name, - gpus=0, - slurm_exclude=get_slurm_banned_nodes(), - **kwargs - ) - return res, output_folder - -@gin.configurable -def queue_fine_terrain( - submit_cmd, - folder, - name, - seed, - configs, - gpus=0, - taskname=None, - exclude_gpus=[], - overrides=[], - input_indices=None, output_indices=None, - **kwargs -): - """ - Generating the fine scene - """ - - input_suffix = get_suffix(input_indices) - output_suffix = get_suffix(output_indices) - - output_folder = Path(f'{folder}/fine{output_suffix}') - - enable_gpu_in_terrain = "Terrain.device='cuda'" if gpus > 0 else "" - cmd = get_cmd(seed, 'fine_terrain', configs, taskname, - input_folder=f'{folder}/coarse{input_suffix}', - output_folder=output_folder) + f''' - LOG_DIR='{folder / "logs"}' - {enable_gpu_in_terrain} - '''.split("\n") + overrides - - with (folder / "run_pipeline.sh").open('a') as f: - f.write(f"{' '.join(' '.join(cmd).split())}\n\n") - - res = submit_cmd(cmd, - folder=folder, - name=name, - gpus=gpus, - slurm_exclude=nodes_with_gpus(*exclude_gpus) + get_slurm_banned_nodes(), - **kwargs - ) - return res, output_folder - -@gin.configurable -def queue_combined( - submit_cmd, - folder, - name, - seed, - configs, - taskname=None, - exclude_gpus=[], - gpus=0, - overrides=[], - include_coarse=True, - input_indices=None, output_indices=None, - **kwargs -): - - input_suffix = get_suffix(input_indices) - output_suffix = get_suffix(output_indices) - - tasks = 'populate fine_terrain' - - if include_coarse: - tasks = 'coarse ' + tasks - - output_folder = Path(f'{folder}/fine{output_suffix}') - - enable_gpu_in_terrain = "Terrain.device='cuda'" if gpus > 0 else "" - cmd = get_cmd(seed, tasks, configs, taskname, - input_folder=f'{folder}/coarse{input_suffix}' if not include_coarse else None, - output_folder=output_folder) + f''' - LOG_DIR='{folder / "logs"}' - {enable_gpu_in_terrain} - '''.split("\n") + overrides - - with (folder / "run_pipeline.sh").open('a') as f: - f.write(f"{' '.join(' '.join(cmd).split())}\n\n") - - res = submit_cmd(cmd, - folder=folder, - name=name, - gpus=gpus, - slurm_exclude=nodes_with_gpus(*exclude_gpus) + get_slurm_banned_nodes(), - **kwargs - ) - return res, output_folder - -@gin.configurable -def queue_render( - submit_cmd, - folder, - name, - seed, - render_type, - configs, - taskname=None, - overrides=[], - exclude_gpus=[], - input_indices=None, output_indices=None, - **submit_kwargs -): - - input_suffix = get_suffix(input_indices) - output_suffix = get_suffix(output_indices) - - output_folder = Path(f'{folder}/frames{output_suffix}') - - cmd = get_cmd(seed, "render", configs, taskname, - input_folder=f'{folder}/fine{input_suffix}', - output_folder=f'{output_folder}') + f''' - render.render_image_func=@{render_type}/render_image - LOG_DIR='{folder / "logs"}' - '''.split("\n") + overrides - - with (folder / "run_pipeline.sh").open('a') as f: - f.write(f"{' '.join(' '.join(cmd).split())}\n\n") - - res = submit_cmd(cmd, - folder=folder, - name=name, - slurm_exclude=nodes_with_gpus(*exclude_gpus) + get_slurm_banned_nodes(), - **submit_kwargs, - ) - return res, output_folder - -@gin.configurable -def queue_mesh_save( - submit_cmd, - folder, - name, - seed, - configs, - taskname=None, - overrides=[], - exclude_gpus=[], - input_indices=None, output_indices=None, - reuse_subcams=True, - **submit_kwargs -): - - if (output_indices['subcam'] > 0) and reuse_subcams: - return JOB_OBJ_SUCCEEDED, None - - input_suffix = get_suffix(input_indices) - output_suffix = get_suffix(output_indices) - - output_folder = Path(f'{folder}/savemesh{output_suffix}') - - output_folder.mkdir(parents=True, exist_ok=True) - - cmd = get_cmd(seed, "mesh_save", configs, taskname, - input_folder=f'{folder}/fine{input_suffix}', - output_folder=f'{folder}/savemesh{output_suffix}') + f''' - LOG_DIR='{folder / "logs"}' - '''.split("\n") + overrides - - with (folder / "run_pipeline.sh").open('a') as f: - f.write(f"{' '.join(' '.join(cmd).split())}\n\n") - - res = submit_cmd(cmd, - folder=folder, - name=name, - slurm_exclude=nodes_with_gpus(*exclude_gpus) + get_slurm_banned_nodes(), - **submit_kwargs, - ) - return res, output_folder - -@gin.configurable -def queue_opengl( - submit_cmd, - folder, - name, - seed, - configs, - taskname=None, - overrides=[], - exclude_gpus=[], - input_indices=None, output_indices=None, - reuse_subcams=True, - gt_testing=False, - **submit_kwargs -): - - if (output_indices['subcam'] > 0) and reuse_subcams: - return JOB_OBJ_SUCCEEDED, None - - output_suffix = get_suffix(output_indices) - - tmp_script = Path(folder) / "tmp" / f"opengl_{uuid4().hex}.sh" - tmp_script.parent.mkdir(exist_ok=True) - - process_mesh_path = Path("../process_mesh/build/process_mesh").resolve() - input_folder = Path(folder)/f'savemesh{output_suffix}' # OUTPUT SUFFIX IS CORRECT HERE. I know its weird. But input suffix really means 'prev tier of the pipeline - if (gt_testing): - copy_folder = Path(folder) / f"frames{output_suffix}" - output_folder = Path(folder) / f"opengl_frames{output_suffix}" - copytree(copy_folder, output_folder, dirs_exist_ok=True) - else: - output_folder = Path(folder) / f"frames{output_suffix}" - output_folder.mkdir(exist_ok=True) - - assert input_folder.exists(), input_folder - assert isinstance(overrides, list) and ("\n" not in ' '.join(overrides)) - - start_frame, end_frame = output_indices['frame'], output_indices['last_cam_frame'] - with tmp_script.open('w') as f: - f.write("set -e\n") # Necessary to detect if the script fails - for frame_idx in range(start_frame, end_frame + 1): - line = ( - f"{process_mesh_path} --width 1920 --height 1080 -in {input_folder} " - f"--frame {frame_idx} -out {output_folder}\n" - ) - line = re.sub("( \([A-Za-z0-9]+\))", "", line) - f.write(line) - f.write(f"touch {folder}/logs/FINISH_{taskname}") - - cmd = f"bash {tmp_script}".split() - - with (folder / "run_pipeline.sh").open('a') as f: - f.write(f"{' '.join(' '.join(cmd).split())}\n\n") - - res = submit_cmd( - cmd, - folder=folder, - name=name, - slurm_exclude=nodes_with_gpus(*exclude_gpus) + get_slurm_banned_nodes(), - **submit_kwargs, - ) - return res, output_folder - -def init_db_from_existing(output_folder: Path): - - # TODO in future: directly use existing_db (with some cleanup / checking). - - db_path = output_folder/'scenes_db.csv' - if not db_path.exists(): - raise ValueError(f'Recieved --use_existing but {db_path=} did not exist') - existing_db = pd.read_csv(db_path, converters={"configs": literal_eval}) - - def init_scene(seed_folder): - if not seed_folder.is_dir(): - return None - if not (seed_folder/'logs').exists(): - logging.warning(f'Skipping {seed_folder=} due to missing "logs" subdirectory') - return None - - configs = existing_db.loc[existing_db["seed"] == seed_folder.name, "configs"].iloc[0] - - scene_dict = { - 'seed': seed_folder.name, - 'all_done': SceneState.NotDone, - 'configs': list(configs) - } - - finish_key = 'FINISH_' - for finish_file_name in (seed_folder/'logs').glob(finish_key + '*'): - taskname = os.path.basename(finish_file_name)[len(finish_key):] - logging.info(f'Marking {seed_folder.name=} {taskname=} as completed') - scene_dict[f'{taskname}_submitted'] = True - scene_dict[f'{taskname}_job_obj'] = JOB_OBJ_SUCCEEDED - - return scene_dict - - return [init_scene(seed_folder) for seed_folder in output_folder.iterdir()] - -@gin.configurable -def sample_scene_spec(i, seed_range=None, config_distribution=None, config_sample_mode='random'): - - if seed_range is None: - seed = seed_generator() - else: - start, end = seed_range - if i > end - start: - return None - seed = hex(start + i).removeprefix('0x') - - if config_distribution is None: - configs = [] - elif config_sample_mode == 'random': - configs_options, weights = zip(*config_distribution) # list of rows to list per column - ps = np.array(weights) / sum(weights) - configs = np.random.choice(configs_options, p=ps) - elif config_sample_mode == 'roundrobin': - configs_options, weights = zip(*config_distribution) # list of rows to list per column - if not all(isinstance(w, int) for w in weights): - raise ValueError(f'{config_sample_mode=} expects integer scene counts as weights but got {weights=} with non-integer values') - idx = np.argmin(i % sum(weights) + 1 > np.cumsum(weights)) - configs = configs_options[idx] - else: - raise ValueError(f'Unrecognized {config_sample_mode=}') - - if isinstance(configs, str) and " " in configs: - configs = configs.split(" ") - if not isinstance(configs, list): - configs = [configs] - - return { - "all_done": SceneState.NotDone, - "seed": seed, - 'configs': configs - } - -@gin.configurable -def init_db(args): - - if args.use_existing: - scenes = init_db_from_existing(args.output_folder) - elif args.specific_seed is not None: - scenes = [{"seed": s, "all_done": SceneState.NotDone} for s in args.specific_seed] - else: - scenes = [sample_scene_spec(i) for i in range(args.num_scenes)] - - scenes = [s for s in scenes if s is not None] - - if len(scenes) < args.num_scenes: - logging.warning(f'Initialized only {len(scenes)=} despite {args.num_scenes=}. Likely due to --use_existing, --specific_seed or seed_range.') - - return scenes - -def update_symlink(scene_folder, scenes): - for new_name, scene in scenes: - - if scene == JOB_OBJ_SUCCEEDED: - continue - elif isinstance(scene, str): - raise ValueError(f'Failed due to {scene=}') - - to = scene_folder / "logs" / f"{new_name}.out" - - std_out = scene_folder / "logs" / f"{scene.job_id}_0_log.out" - - if os.path.islink(to): - os.unlink(to) - os.unlink(scene_folder / "logs" / f"{new_name}.err") - os.symlink(std_out.resolve(), to) - os.symlink(std_out.with_suffix('.err').resolve(), scene_folder / "logs" / f"{new_name}.err") - -def get_disk_usage(folder): - out = subprocess.check_output(f"df -h {folder.resolve()}".replace(" (Princeton)", "").split()).decode() - return int(re.compile("[\s\S]* ([0-9]+)% [\s\S]*").fullmatch(out).group(1)) / 100 - -def make_html_page(output_path, scenes, frame, camera_pair_id, **kwargs): - env = Environment( - loader=FileSystemLoader("tools"), - autoescape=select_autoescape(), - ) - - template = env.get_template("template.html") - seeds = [scene['seed'] for scene in scenes] - html = template.render( - seeds=seeds, - **kwargs, - frame=frame, - camera_pair_id=camera_pair_id, - ) - - with output_path.open('a') as f: - f.write(html) - -@gin.configurable -def run_task( - queue_func, - scene_folder, - scene_dict, - taskname, - dryrun=False -): - - assert scene_folder.parent.exists(), scene_folder - scene_folder.mkdir(exist_ok=True) - stage_scene_name = f"{scene_folder.parent.stem}_{scene_folder.stem}_{taskname}" - assert not scene_dict.get(f'{taskname}_submitted', False) - - if dryrun: - scene_dict[f'{taskname}_job_obj'] = JOB_OBJ_SUCCEEDED - scene_dict[f'{taskname}_submitted'] = 1 - return - - seed = scene_dict['seed'] - - job_obj, output_folder = queue_func( - folder=scene_folder, - name=stage_scene_name, - seed=seed, - taskname=taskname - ) - scene_dict[f'{taskname}_job_obj'] = job_obj - scene_dict[f'{taskname}_output_folder'] = output_folder - scene_dict[f'{taskname}_submitted'] = 1 # marked as submitted - update_symlink(scene_folder, [(taskname, job_obj)]) - -def check_and_perform_cleanup(args, seed, crashed): - scene_folder = args.output_folder/seed - if args.cleanup == 'all' or (args.cleanup == 'except_crashed' and not crashed): - logging.info(f"{seed} - Removing entirety of {scene_folder}") - rmtree(scene_folder) - elif args.cleanup == 'big_files' or (args.cleanup == 'except_crashed' and crashed): - logging.info(f"{seed} - Cleaning up any large files") - cleanup(scene_folder, verbose=False) - - if args.remove_write: - subprocess.check_output(f"chmod -R a-w {scene_folder}".split()) - -def iterate_sequential_tasks(task_list, get_task_state, overrides, configs, input_indices=None, output_indices=None): - - if len(task_list) == 0: - return JobState.Succeeded - - prev_state = JobState.Succeeded - assert task_list[0].get('condition', 'prev_succeeded') == 'prev_succeeded' - - for i, task_spec in enumerate(task_list): - - # check that we should actually run this step, according to its condition - cond = task_spec.get('condition', 'prev_succeeded') - if cond == 'prev_succeeded' and prev_state != JobState.Succeeded: - return - elif cond == 'prev_failed' and prev_state != JobState.Failed: - continue # we wont run this scene, but skipping doesnt count as crashing - elif cond == 'prev_redundant': - pass # any outcome is fine - - # determine whether the current step failing would be catastrophic - fatal = ( - i + 1 >= len(task_list) or - task_list[i + 1].get('condition', 'prev_succeeded') != 'prev_failed' - ) - - queue_func = partial(task_spec['func'], overrides=overrides, configs=configs, - input_indices=input_indices, output_indices=output_indices) - - taskname = task_spec['name'] + get_suffix(output_indices) - state = get_task_state(taskname=taskname) - yield state, taskname, queue_func, fatal - - prev_state = state - -@gin.configurable -def iterate_scene_tasks( - scene_dict, args, - monitor_all, # if True, enumerate scenes that we might have launched earlier, even if we wouldnt launch them now (due to crashes etc) - - # provided by gin - global_tasks, view_dependent_tasks, camera_dependent_tasks, - frame_range, cam_id_ranges, num_resamples=1, render_frame_range=None, - view_block_size=1, # how many frames should share each `view_dependent_task` - cam_block_size=None, # how many frames should share each `camera_dependent_task` - cleanup_viewdep=False, # cleanup the results of `view_dependent_tasks` once each view iter is done? - viewdep_paralell=True, # can we work on multiple view depenendent tasks (usually `fine`) in paralell? - camdep_paralell=True # can we work on multiple camera dependent tasks (usually render/gt) in paralell? -): - - ''' - This function is a generator which yields all scenes we might want to consider monitoring or running for a particular scene - - It `yield`s the available scenes, regardless of whether they are already running etc - ''' - - for task in global_tasks + view_dependent_tasks + camera_dependent_tasks: - if '_' in task['name']: - raise ValueError(f'{task=} with {task["name"]=} is invalid, must not contain underscores') - - if cam_block_size is None: - cam_block_size = view_block_size - - if cam_id_ranges[0] <= 0 or cam_id_ranges[1] <= 0: - raise ValueError(f'{cam_id_ranges=} is invalid, both num. rigs and num subcams must be >= 1 or no work is done') - assert view_block_size >= 1 - assert cam_block_size >= 1 - if cam_block_size > view_block_size: - cam_block_size = view_block_size - seed = scene_dict['seed'] - - scene_folder = args.output_folder/seed - get_task_state = partial(get_scene_state, scene_dict=scene_dict, scene_folder=scene_folder) - - global_overrides = [ - f'execute_tasks.frame_range={repr(list(frame_range))}', - f'execute_tasks.camera_id=[0, 0]' - ] - global_configs = scene_dict.get('configs', []) + args.configs - global_iter = iterate_sequential_tasks( - global_tasks, - get_task_state, - overrides=args.overrides+global_overrides, - configs=global_configs - ) - - for state, *rest in global_iter: - yield state, *rest - if not state == JobState.Succeeded: - return - - view_range = render_frame_range if render_frame_range is not None else frame_range - view_frames = range(view_range[0], view_range[1] + 1, view_block_size) # blender frame_range is inclusive, but python's range is end-exclusive - resamples = range(num_resamples) - cam_rigs = range(cam_id_ranges[0]) - subcams = range(cam_id_ranges[1]) - - running_views = 0 - for cam_rig, view_frame in itertools.product(cam_rigs, view_frames): - - view_frame_range = [view_frame, min(frame_range[1], view_frame + view_block_size - 1)] # blender frame_end is INCLUSIVE - view_overrides = [ - f'execute_tasks.frame_range=[{view_frame_range[0]},{view_frame_range[1]}]', - f'execute_tasks.camera_id=[{cam_rig},{0}]' - ] - - view_idxs = dict(cam_rig=cam_rig, frame=view_frame) - view_tasks_iter = iterate_sequential_tasks( - view_dependent_tasks, get_task_state, - overrides=args.overrides+view_overrides, - configs=global_configs, output_indices=view_idxs - ) - for state, *rest in view_tasks_iter: - yield state, *rest - if state not in CONCLUDED_STATES: - if viewdep_paralell: - running_views += 1 - continue - else: - return - elif state == JobState.Failed and not monitor_all: - return - - running_blocks = 0 - for subcam, resample_idx in itertools.product(subcams, resamples): - for cam_frame in range(view_frame_range[0], view_frame_range[1] + 1, cam_block_size): - - cam_frame_range = [cam_frame, min(view_frame_range[1], cam_frame + cam_block_size - 1)] # blender frame_end is INCLUSIVE - cam_overrides = [ - f'execute_tasks.frame_range=[{cam_frame_range[0]},{cam_frame_range[1]}]', - f'execute_tasks.camera_id=[{cam_rig},{subcam}]', - f'execute_tasks.resample_idx={resample_idx}' - ] - - camdep_indices = dict( - cam_rig=cam_rig, - frame=cam_frame, - subcam=subcam, - resample=resample_idx, - view_first_frame=view_frame_range[0], - last_view_frame=view_frame_range[1], - last_cam_frame=cam_frame_range[1] # this line explicitly used by most jobs - ) - camera_dep_iter = iterate_sequential_tasks( - camera_dependent_tasks, - get_task_state, - overrides=args.overrides+cam_overrides, - configs=global_configs, - input_indices=view_idxs if len(view_dependent_tasks) else None, - output_indices=camdep_indices - ) - for state, *rest in camera_dep_iter: - yield state, *rest - if state not in CONCLUDED_STATES: - if camdep_paralell: - running_blocks += 1 - continue - else: - return - elif state == JobState.Failed and not monitor_all: - return - - if running_blocks > 0: - running_views += 1 - continue - - key = f'viewdep_{cam_rig}_{view_frame}_cleaned' - if cleanup_viewdep and args.cleanup != 'none' and not scene_dict.get(key, False): - for stage_rec in view_dependent_tasks: - taskname = stage_rec['name'] - path = scene_dict[f'{taskname}_output_folder'] - print(f'Cleaning {path} for {taskname}') - if path == scene_folder: - continue - if path is not None and path.exists(): - cleanup(path) - scene_dict[key] = True - - if running_views > 0: - return - - # Upload - if args.upload: - state = get_task_state(taskname='upload') - yield state, 'upload', queue_upload, True - if state != JobState.Succeeded: - return - - if scene_dict['all_done'] != SceneState.NotDone: - return - - # Cleanup - with (args.output_folder / "finished_seeds.txt").open('a') as f: - f.write(f"{seed}\n") - scene_dict['all_done'] = SceneState.Done - check_and_perform_cleanup(args, seed, crashed=False) - -def infer_crash_reason(stdout_file, stderr_file: Path): - - if not stderr_file.exists(): - return f'{stderr_file} not found' - - try: - error_log = stderr_file.read_text() - except UnicodeDecodeError: - return f"failed to parse log file {stderr_file}" - - if "System is out of GPU memory" in error_log: - return "Out of GPU memory" - elif "this scene is timed-out" in error_log or 'DUE TO TIME LIMIT' in error_log: - return "Timed out" - elif "" in error_log: - return "SIGKILL: 9 (out-of-memory, probably)" - elif "SIGCONT" in error_log: - return "SIGCONT (timeout?)" - elif "srun: error" in error_log: - return "srun error" - - if not stdout_file.exists(): - return f'{stdout_file} not found' - if not stderr_file.exists(): - return f'{stderr_file} not found' - - output_text = f"{stdout_file.read_text()}\n{stderr_file.read_text()}\n" - matches = re.findall("(Error:[^\n]+)\n", output_text) - - ignore_errors = [ - 'Error: Not freed memory blocks', - ] - - matches = [m for m in matches if not any(w in m for w in ignore_errors)] - - if len(matches): - return ','.join(matches) - else: - return f"Could not summarize cause, check {stderr_file}" - -def record_crashed_seed(crashed_seed, crash_stage, f, fatal=True): - time_str = datetime.now().strftime("%m/%d %I:%M%p") - stdout_file = args.output_folder / crashed_seed / "logs" / f"{crash_stage}.out" - stderr_file = args.output_folder / crashed_seed / "logs" / f"{crash_stage}.err" - - scene_id, *_ = stderr_file.resolve().stem.split('_') - node_of_scene = node_from_slurm_jobid(scene_id) - - reason = infer_crash_reason(stdout_file, stderr_file) - text = f"{crashed_seed} {crash_stage} {scene_id} {node_of_scene} {reason} {fatal=} {time_str}\n" - print('Crashed: ' + text) - f.write(text) - - return reason - -def write_html_summary(all_scenes, output_folder, max_size=5000): - - names = [("index" if (idx == 0) else f"index_{idx}") for idx in range(0, len(all_scenes), max_size)] - for name, idx in zip(names, range(0, len(all_scenes), max_size)): - html_path = output_folder / f"{name}.html" - if not html_path.exists(): - make_html_page(html_path, all_scenes[idx:idx+max_size], frame=100, - camera_pair_id=0, samples=[f"resmpl{i}" for i in range(5)], pages=names, - ) - -def stats_summary(stats): - stats = {k: v for k, v in stats.items() if not k.startswith(JobState.NotQueued)} - lemmatized = set(l.split('_')[0] for l in stats.keys()) - stats = {l: sum(v for k, v in stats.items() if k.startswith(l)) for l in lemmatized} - - uniq_keys = set(k.split('/')[0] for k in stats.keys()) - totals = {p: sum(v for k, v in stats.items() if k.startswith(p)) for p in uniq_keys} - - for k, v in totals.items(): - stats[f'{k}/total'] = v - - return stats, totals - -def monitor_existing_jobs(all_scenes): - - stats = defaultdict(int) - - for scene in all_scenes: - - scene['num_running'], scene['num_done'] = 0, 0 - any_fatal = False - for state, taskname, _, fatal in iterate_scene_tasks(scene, args, monitor_all=True): - - if state == JobState.NotQueued: - continue - - stats[f'{state}/{taskname}'] += 1 - scene['num_done'] += state in CONCLUDED_STATES - scene['num_running'] += state not in CONCLUDED_STATES - - if state == JobState.Failed: - if not scene.get(f'{taskname}_crash_recorded', False): - scene[f'{taskname}_crash_recorded'] = True - with (args.output_folder / "crash_summaries.txt").open('a') as f: - record_crashed_seed(scene['seed'], taskname, f, fatal=fatal) - if fatal: - any_fatal = True - - if any_fatal: - scene['any_fatal_crash'] = True - - if scene['num_running'] == 0 and any_fatal and scene['all_done'] == SceneState.NotDone: - scene['all_done'] = SceneState.Crashed - with (args.output_folder / "crash_summaries.txt").open('a') as f: - check_and_perform_cleanup(args, scene['seed'], crashed=True) - - return stats - -def jobs_to_launch_next(all_scenes, greedy=True): - scenes = [j for j in all_scenes if (j["all_done"] == SceneState.NotDone)] - if greedy: - scenes = sorted(scenes, key=lambda s: s['num_running'] + s['num_done'], reverse=True) - for scene in scenes: - if scene.get('any_fatal_crash', False): - continue - for state, taskname, queue_func, _ in iterate_scene_tasks(scene, args, monitor_all=False): - if state != JobState.NotQueued: - continue - yield scene, taskname, queue_func - -@gin.configurable -def manage_datagen_jobs(all_scenes, elapsed, num_concurrent, disk_sleep_threshold=0.95): - - if LocalScheduleHandler._inst is not None: - LocalScheduleHandler.instance().poll() - - warmup_pct = min(elapsed / args.warmup_sec, 1) if args.warmup_sec > 0 else 1 - curr_concurrent_max = math.ceil(warmup_pct * num_concurrent) - - # Check results / current state of scenes we have already launched - stats = monitor_existing_jobs(all_scenes) - stats, totals = stats_summary(stats) - - n_in_flight = totals.get(JobState.Running, 0) + totals.get(JobState.Queued, 0) - if n_in_flight > curr_concurrent_max: - raise ValueError(f'manage_datagen_jobs observed {n_in_flight=}, which exceeds allowed {curr_concurrent_max=}') - n_to_launch = max(curr_concurrent_max - n_in_flight, 0) - - pd.DataFrame.from_records(all_scenes).to_csv(args.output_folder/'scenes_db.csv') - - stats['n_in_flight'] = n_in_flight - stats['n_launching'] = n_to_launch - stats['disk_usage'] = get_disk_usage(args.output_folder) - stats['concurrent_max'] = curr_concurrent_max - wandb.log(stats) - print("=" * 60) - for k,v in sorted(stats.items()): - print(f"{k.ljust(30)} : {v}") - print("-" * 60) - - # Dont launch new scenes if disk is getting full - if stats['disk_usage'] > disk_sleep_threshold: - print(f"{args.output_folder} is too full ({get_disk_usage(args.output_folder)}%). Sleeping.") - wandb.alert(title='Disk full', text=f'Sleeping due to full disk at {args.output_folder=}', wait_duration=3*60*60) - time.sleep(60) - return - - # Launch to get back to intended n=`curr_concurrent_max` that should be in flight - for spec in itertools.islice(jobs_to_launch_next(all_scenes), n_to_launch): - scene, taskname, queue_func = spec - logging.info(f"{scene['seed']} - running {taskname}") - run_task(queue_func, args.output_folder / str(scene['seed']), scene, taskname) - -@gin.configurable -def main(args, shuffle=True, wandb_project='render_beta'): - - os.umask(0o007) - - all_scenes = init_db(args) - scene_name = args.output_folder.parts[-1] - - write_html_summary(all_scenes, args.output_folder) if args.cleanup != 'all' else None - wandb.init(name=scene_name, config=vars(args), project=wandb_project, mode=args.wandb_mode) - - logging.basicConfig( - #filename=str(args.output_folder / "jobs.log"), - level=args.loglevel, - format='[%(asctime)s]: %(message)s', - ) - - start_time = datetime.now() - - scenes = [j for j in all_scenes if j['all_done'] == SceneState.NotDone] - if shuffle: - np.random.shuffle(scenes) - else: - scenes = sorted(scenes, key=lambda j: j['seed']) - while any(j['all_done'] == SceneState.NotDone for j in all_scenes): - now = datetime.now() - print(f'{args.output_folder} {start_time.strftime("%m/%d %I:%M%p")} -> {now.strftime("%m/%d %I:%M%p")}') - manage_datagen_jobs(scenes, elapsed=(now-start_time).total_seconds()) - time.sleep(4) - - -def set_blender_path_global(args): - - global BLENDER_PATH - if args.blender_path is None: - if 'BLENDER' in os.environ: - BLENDER_PATH = os.environ['BLENDER'] - else: - BLENDER_PATH = '../blender/blender' # assuming we run from infinigen/worldgen - else: - BLENDER_PATH = args.blender_path - if not os.path.exists(BLENDER_PATH): - raise ValueError(f'Couldnt not find {BLENDER_PATH=}, make sure --blender_path or $BLENDER is specified') - -if __name__ == "__main__": - assert Path('.').resolve().parts[-1] == 'worldgen' - - slurm_available = (which("sbatch") is not None) - parser = argparse.ArgumentParser() # to guarantee that the render scenes finish, try render_image.time_limit=2000 - parser.add_argument( - '-o', - '--output_folder', - type=Path, - required=True - ) - parser.add_argument( - '--blender_path', - type=str, - default=None, - help="Full path to a `blender` executable with all dependencies installed. If set to None, the system will use the $BLENDER environment variable" - ) - parser.add_argument( - '--num_scenes', - type=int, - default=1, - help="Number of scenes to attempt before terminating" - ) - parser.add_argument( - '--meta_seed', - type=int, - default=None, - help="What seed should be used to determine the random seeds of each scene? Leave as None unless deliberately replicat" - ) - parser.add_argument( - '--specific_seed', - default=None, - nargs='+', - help="The default, None, will choose a random seed per scene. Otherwise, all scenes will have the specified seed. Interpreted as an integer if possible." - ) - parser.add_argument( - '--use_existing', - action='store_true', - help="If set, then assume output_folder is an existing folder from a terminated run, and make a best-possible-effort to resume from where it left off" - ) - parser.add_argument( - '--warmup_sec', - type=float, - default=0, - help="Perform a staggered start over the specified period, so that jobs dont sync up or all write to disk at similar times." - ) - parser.add_argument( - '--cleanup', - type=str, - choices=['all', 'big_files', 'none', 'except_crashed'], - default='none', - help="What files should be cleaned up by the manager as it runs?" - ) - parser.add_argument( - '--remove_write', - action='store_true', - help="If set, remove Unix write permissions from the generated files, to prevent a user accidentally deleting data." - ) - parser.add_argument( - '--upload', - action='store_true', - help="If set, attempt to upload scenes as tarballs to GDrive of SMB depending on configs. See `upload_util.py` for more details before using." - ) - parser.add_argument( - '--configs', - nargs='*', - default=[], - help="List of gin config names to pass through to all underlying scene generation jobs." - ) - parser.add_argument( - '-p', - '--overrides', - nargs='+', - type=str, - default=[], - help="List of gin overrides to pass through to all underlying scene generation jobs" - ) - parser.add_argument( - '--wandb_mode', - type=str, - default='disabled', - choices=['online', 'offline', 'disabled'], - help="Mode kwarg for wandb.init(). Set up wandb before use." - ) - parser.add_argument( - '--pipeline_configs', - type=str, - nargs='+', - help="List of gin config names from tools/pipeline_configs to configure this execution" - ) - parser.add_argument( - '--pipeline_overrides', - nargs='+', - type=str, - default=[], - help="List of gin overrides to configure this execution", - ) - parser.add_argument('--overwrite', action='store_true') - parser.add_argument('-d', '--debug', action="store_const", dest="loglevel", const=logging.DEBUG, default=logging.INFO) - parser.add_argument( '-v', '--verbose', action="store_const", dest="loglevel", const=logging.INFO) - args = parser.parse_args() - - if not args.upload and args.cleanup == 'all': - raise ValueError(f'Pipeline is configured with {args.cleanup=} yet {args.upload=}! No output would be preserved!') - if args.upload and args.cleanup == 'none': - raise ValueError(f'--upload currently applies --cleanup big_files') - assert args.specific_seed is None or args.num_scenes == 1 - set_blender_path_global(args) - - overwrite_ok = args.use_existing or args.overwrite - if args.output_folder.exists() and not overwrite_ok: - raise FileExistsError(f'--output_folder {args.output_folder} already exists! Please delete it, specify a different --output_folder, or use --overwrite') - args.output_folder.mkdir(parents=True, exist_ok=overwrite_ok) - - if args.meta_seed is not None: - random.seed(args.meta_seed) - np.random.seed(args.meta_seed) - - def find_config(g): - for p in Path('infinigen/datagen/configs').glob('**/*.gin'): - if p.parts[-1] == g: - return p - if p.parts[-1] == f'{g}.gin': - return p - raise ValueError(f'Couldn not locate {g} or {g}.gin in anywhere pipeline_configs/**') - configs = [find_config(n) for n in ['base.gin'] + args.pipeline_configs] - for c in configs: - assert os.path.exists(c), c - bindings = args.pipeline_overrides - gin.parse_config_files_and_bindings(configs, bindings=bindings) - - main(args) diff --git a/infinigen/datagen/tools/blendscript_import_infinigen.py b/infinigen/datagen/tools/blendscript_import_infinigen.py index 7c09d5666..01b993aa8 100644 --- a/infinigen/datagen/tools/blendscript_import_infinigen.py +++ b/infinigen/datagen/tools/blendscript_import_infinigen.py @@ -13,8 +13,6 @@ import sys, os pwd = os.getcwd() -if not pwd.endswith('worldgen'): - raise ValueError(f'Current working directory is {pwd}, please cd infinigen/worldgen and run ../blender/blender ...') sys.path.append(pwd) import generate # so gin can find all its targets diff --git a/infinigen/datagen/tools/dev/generate_terrain_assets.py b/infinigen/datagen/tools/dev/generate_terrain_assets.py index 4a5facc09..3d3f81b63 100644 --- a/infinigen/datagen/tools/dev/generate_terrain_assets.py +++ b/infinigen/datagen/tools/dev/generate_terrain_assets.py @@ -20,8 +20,8 @@ from terrain.assets.landtiles import landtile_asset from terrain.assets.upsidedown_mountains import upsidedown_mountains_asset from util import blender as butil -from util.math import int_hash, FixedSeed -from util.organization import Assets, LandTile, AssetFile +from infinigen.core.util.math import int_hash, FixedSeed +from infinigen.core.util.organization import Assets, LandTile, AssetFile def asset_generation( diff --git a/infinigen/datagen/tools/dev/landtile_viewer.py b/infinigen/datagen/tools/dev/landtile_viewer.py index 494025f1b..4d23be24d 100644 --- a/infinigen/datagen/tools/dev/landtile_viewer.py +++ b/infinigen/datagen/tools/dev/landtile_viewer.py @@ -14,8 +14,8 @@ import numpy as np from nodes.node_wrangler import Nodes, NodeWrangler from terrain.utils import Mesh, read -from util.blender import clear_scene -from util.organization import AssetFile +from infinigen.core.util.blender import clear_scene +from infinigen.core.util.organization import AssetFile if __name__ == "__main__": parser = argparse.ArgumentParser() diff --git a/infinigen/datagen/tools/dev/palette/readme.md b/infinigen/datagen/tools/dev/palette/readme.md index a8446b367..0b510dc45 100644 --- a/infinigen/datagen/tools/dev/palette/readme.md +++ b/infinigen/datagen/tools/dev/palette/readme.md @@ -5,7 +5,7 @@ This palette generating tool is enabled using `GoogleImagesSearch` (currently us ## Step 1 ``` -cd worldgen/tools/palette/ +cd infinigen/tools/terrain/palette/ # you can change "mountain rock" to other key words python palette.py -k "mountain rock" ``` @@ -30,7 +30,7 @@ After manually comemnt out them, you have: ![](demo4.png) -Then you move the ready palatte to location: `infinigen/worldgen/config/palette` +Then you move the ready palatte to location: `infinigen/examples/configs/palette` ## Step 3 diff --git a/infinigen/datagen/util/submitit_emulator.py b/infinigen/datagen/util/submitit_emulator.py index 11ddf6513..854818a59 100644 --- a/infinigen/datagen/util/submitit_emulator.py +++ b/infinigen/datagen/util/submitit_emulator.py @@ -249,7 +249,7 @@ def get_all_processes(): if test == 'render': - random_command = "python generate.py -- --seed 56823 --task coarse -p main.output_folder=outputs/test2 move_camera.stereo_baseline=0.15 LOG_DIR=logs" + random_command = "python examples/generate_nature.py -- --seed 56823 --task coarse -p main.output_folder=outputs/test2 move_camera.stereo_baseline=0.15 LOG_DIR=logs" executor = ScheduledLocalExecutor(folder="test_log") executor.update_parameters(gpus=1) diff --git a/infinigen/terrain/assets/caves/core.py b/infinigen/terrain/assets/caves/core.py index 12a665f2a..f42ebb1f8 100644 --- a/infinigen/terrain/assets/caves/core.py +++ b/infinigen/terrain/assets/caves/core.py @@ -8,13 +8,14 @@ import bpy import gin -import terrain.mesh_to_sdf as mesh_to_sdf import numpy as np from numpy import ascontiguousarray as AC -from terrain.utils import Mesh -from util.blender import SelectObjects, ViewportMode -from util.math import FixedSeed -from util.organization import AssetFile + +import infinigen.terrain.mesh_to_sdf as mesh_to_sdf +from infinigen.terrain.utils import Mesh +from infinigen.core.util.blender import SelectObjects, ViewportMode +from infinigen.core.util.math import FixedSeed +from infinigen.core.util.organization import AssetFile from .geometry_utils import increment_step, pitch_up, yaw_clockwise from .pcfg import generate_string diff --git a/infinigen/terrain/assets/landtiles/ant_landscape.py b/infinigen/terrain/assets/landtiles/ant_landscape.py index 661f7e6b2..058f3b7a8 100644 --- a/infinigen/terrain/assets/landtiles/ant_landscape.py +++ b/infinigen/terrain/assets/landtiles/ant_landscape.py @@ -9,10 +9,11 @@ import bpy import cv2 import numpy as np -from terrain.land_process.erosion import run_erosion -from terrain.land_process.snowfall import run_snowfall -from terrain.utils import smooth, random_int -from util.organization import AssetFile, LandTile + +from infinigen.terrain.land_process.erosion import run_erosion +from infinigen.terrain.land_process.snowfall import run_snowfall +from infinigen.terrain.utils import smooth, random_int +from infinigen.core.util.organization import AssetFile, LandTile def create( diff --git a/infinigen/terrain/assets/landtiles/core.py b/infinigen/terrain/assets/landtiles/core.py index aa2d0755a..6f1c265c6 100644 --- a/infinigen/terrain/assets/landtiles/core.py +++ b/infinigen/terrain/assets/landtiles/core.py @@ -9,8 +9,8 @@ import cv2 import gin import numpy as np -from terrain.utils import boundary_smooth, read, smooth -from util.organization import AssetFile, LandTile, Process +from infinigen.terrain.utils import boundary_smooth, read, smooth +from infinigen.core.util.organization import AssetFile, LandTile, Process from .ant_landscape import ant_landscape_asset from .custom import coast_asset, multi_mountains_asset, coast_params, multi_mountains_params diff --git a/infinigen/terrain/assets/landtiles/custom.py b/infinigen/terrain/assets/landtiles/custom.py index 0b75917c5..c8f6e4d0c 100644 --- a/infinigen/terrain/assets/landtiles/custom.py +++ b/infinigen/terrain/assets/landtiles/custom.py @@ -10,13 +10,13 @@ import cv2 import gin import numpy as np -from terrain.elements.core import Element -from terrain.elements.mountains import Mountains -from terrain.land_process.erosion import run_erosion -from terrain.land_process.snowfall import run_snowfall -from terrain.utils import grid_distance, perlin_noise, random_int -from util.organization import AssetFile -from util.random import random_general as rg +from infinigen.terrain.elements.core import Element +from infinigen.terrain.elements.mountains import Mountains +from infinigen.terrain.land_process.erosion import run_erosion +from infinigen.terrain.land_process.snowfall import run_snowfall +from infinigen.terrain.utils import grid_distance, perlin_noise, random_int +from infinigen.core.util.organization import AssetFile +from infinigen.core.util.random import random_general as rg coast_params_ = {} diff --git a/infinigen/terrain/assets/ocean.py b/infinigen/terrain/assets/ocean.py index 46c1a6c80..f669e9ff3 100644 --- a/infinigen/terrain/assets/ocean.py +++ b/infinigen/terrain/assets/ocean.py @@ -10,10 +10,10 @@ import gin import os import shutil -from terrain.utils import random_int -from util.blender import ViewportMode -from util.logging import Timer -from util.random import random_general as rg +from infinigen.terrain.utils import random_int +from infinigen.core.util.blender import ViewportMode +from infinigen.core.util.logging import Timer +from infinigen.core.util.random import random_general as rg spatial_size = 40 diff --git a/infinigen/terrain/assets/upsidedown_mountains.py b/infinigen/terrain/assets/upsidedown_mountains.py index 0b05ebfa3..76ff8870f 100644 --- a/infinigen/terrain/assets/upsidedown_mountains.py +++ b/infinigen/terrain/assets/upsidedown_mountains.py @@ -13,12 +13,12 @@ from landlab.components import FlowDirectorSteepest, TransportLengthHillslopeDiffuser from numpy import ascontiguousarray as AC from skimage.measure import label -from terrain.elements.core import Element -from terrain.elements.mountains import Mountains -from terrain.utils import read +from infinigen.terrain.elements.core import Element +from infinigen.terrain.elements.mountains import Mountains +from infinigen.terrain.utils import read from tqdm import tqdm -from util.organization import AssetFile -from util.random import random_general as rg +from infinigen.core.util.organization import AssetFile +from infinigen.core.util.random import random_general as rg @gin.configurable diff --git a/infinigen/terrain/core.py b/infinigen/terrain/core.py index 830f30329..4b6bd7a34 100644 --- a/infinigen/terrain/core.py +++ b/infinigen/terrain/core.py @@ -12,16 +12,16 @@ import gin import numpy as np from mathutils.bvhtree import BVHTree -from terrain.mesher import OpaqueSphericalMesher, TransparentSphericalMesher, UniformMesher -from terrain.scene import scene, transfer_scene_info -from terrain.surface_kernel.core import SurfaceKernel -from terrain.utils import Mesh, move_modifier, Vars, AttributeType, FieldsType -from terrain.assets.ocean import ocean_asset -from util.blender import SelectObjects, delete -from util.logging import Timer -from util.math import FixedSeed, int_hash -from util.organization import SurfaceTypes, Attributes, Task, TerrainNames, ElementNames, Transparency, Materials, Assets, ElementTag, Tags, SelectionCriterions -from assets.utils.tag import tag_object, tag_system +from infinigen.terrain.mesher import OpaqueSphericalMesher, TransparentSphericalMesher, UniformMesher +from infinigen.terrain.scene import scene, transfer_scene_info +from infinigen.terrain.surface_kernel.core import SurfaceKernel +from infinigen.terrain.utils import Mesh, move_modifier, Vars, AttributeType, FieldsType +from infinigen.terrain.assets.ocean import ocean_asset +from infinigen.core.util.blender import SelectObjects, delete +from infinigen.core.util.logging import Timer +from infinigen.core.util.math import FixedSeed, int_hash +from infinigen.core.util.organization import SurfaceTypes, Attributes, Task, TerrainNames, ElementNames, Transparency, Materials, Assets, ElementTag, Tags, SelectionCriterions +from infinigen.assets.utils.tag import tag_object, tag_system from numpy import ascontiguousarray as AC logger = logging.getLogger('terrain') diff --git a/infinigen/terrain/elements/atmosphere.py b/infinigen/terrain/elements/atmosphere.py index 3b1b40fee..054ac651b 100644 --- a/infinigen/terrain/elements/atmosphere.py +++ b/infinigen/terrain/elements/atmosphere.py @@ -7,7 +7,7 @@ import gin import numpy as np from numpy import ascontiguousarray as AC -from util.organization import Materials, Transparency, ElementNames +from infinigen.core.util.organization import Materials, Transparency, ElementNames from .core import Element diff --git a/infinigen/terrain/elements/caves.py b/infinigen/terrain/elements/caves.py index dd10210ed..22d98a920 100644 --- a/infinigen/terrain/elements/caves.py +++ b/infinigen/terrain/elements/caves.py @@ -9,11 +9,11 @@ import gin import numpy as np from numpy import ascontiguousarray as AC -from terrain.assets.caves import assets_to_data, caves_asset -from terrain.utils import random_int, random_int_large -from util.math import FixedSeed, int_hash -from util.random import random_general as rg -from util.organization import AssetFile +from infinigen.terrain.assets.caves import assets_to_data, caves_asset +from infinigen.terrain.utils import random_int, random_int_large +from infinigen.core.util.math import FixedSeed, int_hash +from infinigen.core.util.random import random_general as rg +from infinigen.core.util.organization import AssetFile from .core import Element diff --git a/infinigen/terrain/elements/core.py b/infinigen/terrain/elements/core.py index 124543bdb..688d8f5e6 100644 --- a/infinigen/terrain/elements/core.py +++ b/infinigen/terrain/elements/core.py @@ -8,8 +8,8 @@ import numpy as np from numpy import ascontiguousarray as AC -from terrain.utils import ASFLOAT, ASINT, Vars, load_cdll, register_func -from util.organization import Materials +from infinigen.terrain.utils import ASFLOAT, ASINT, Vars, load_cdll, register_func +from infinigen.core.util.organization import Materials class Element: diff --git a/infinigen/terrain/elements/ground.py b/infinigen/terrain/elements/ground.py index 2d7a2ed84..4dfacc810 100644 --- a/infinigen/terrain/elements/ground.py +++ b/infinigen/terrain/elements/ground.py @@ -7,9 +7,9 @@ import gin import numpy as np from numpy import ascontiguousarray as AC -from terrain.utils import random_int -from util.organization import Materials, Transparency, Tags, ElementNames, ElementTag -from util.random import random_general as rg +from infinigen.terrain.utils import random_int +from infinigen.core.util.organization import Materials, Transparency, Tags, ElementNames, ElementTag +from infinigen.core.util.random import random_general as rg from .core import Element diff --git a/infinigen/terrain/elements/landtiles.py b/infinigen/terrain/elements/landtiles.py index 070665dc9..4a53ed1e5 100644 --- a/infinigen/terrain/elements/landtiles.py +++ b/infinigen/terrain/elements/landtiles.py @@ -9,11 +9,12 @@ import gin import numpy as np from numpy import ascontiguousarray as AC -from terrain.assets.landtiles import assets_to_data, landtile_asset -from terrain.utils import random_int, random_int_large -from util.math import FixedSeed, int_hash -from util.organization import Tags, Materials, LandTile, Process, Transparency, ElementNames, ElementTag, AssetFile -from util.random import random_general as rg + +from infinigen.terrain.assets.landtiles import assets_to_data, landtile_asset +from infinigen.terrain.utils import random_int, random_int_large +from infinigen.core.util.math import FixedSeed, int_hash +from infinigen.core.util.organization import Tags, Materials, LandTile, Process, Transparency, ElementNames, ElementTag, AssetFile +from infinigen.core.util.random import random_general as rg from .core import Element diff --git a/infinigen/terrain/elements/mountains.py b/infinigen/terrain/elements/mountains.py index 5a944c366..52992acdf 100644 --- a/infinigen/terrain/elements/mountains.py +++ b/infinigen/terrain/elements/mountains.py @@ -7,9 +7,9 @@ import gin import numpy as np from numpy import ascontiguousarray as AC -from terrain.utils import random_int -from util.organization import Materials, Transparency, ElementNames, ElementTag -from util.random import random_general as rg +from infinigen.terrain.utils import random_int +from infinigen.core.util.organization import Materials, Transparency, ElementNames, ElementTag +from infinigen.core.util.random import random_general as rg from .core import Element diff --git a/infinigen/terrain/elements/upsidedown_mountains.py b/infinigen/terrain/elements/upsidedown_mountains.py index d4d904b2d..7e73fadce 100644 --- a/infinigen/terrain/elements/upsidedown_mountains.py +++ b/infinigen/terrain/elements/upsidedown_mountains.py @@ -9,10 +9,10 @@ import gin import numpy as np from numpy import ascontiguousarray as AC -from terrain.assets.upsidedown_mountains import assets_to_data, upsidedown_mountains_asset -from terrain.utils import random_int, random_int_large -from util.math import FixedSeed, int_hash -from util.organization import Materials, Transparency, ElementNames, ElementTag, Tags, AssetFile +from infinigen.terrain.assets.upsidedown_mountains import assets_to_data, upsidedown_mountains_asset +from infinigen.terrain.utils import random_int, random_int_large +from infinigen.core.util.math import FixedSeed, int_hash +from infinigen.core.util.organization import Materials, Transparency, ElementNames, ElementTag, Tags, AssetFile from .core import Element diff --git a/infinigen/terrain/elements/voronoi_rocks.py b/infinigen/terrain/elements/voronoi_rocks.py index b37cfbf52..217832a0e 100644 --- a/infinigen/terrain/elements/voronoi_rocks.py +++ b/infinigen/terrain/elements/voronoi_rocks.py @@ -7,8 +7,8 @@ import gin import numpy as np from numpy import ascontiguousarray as AC -from terrain.utils import random_int -from util.organization import Materials, ElementNames, Transparency, ElementTag, Tags +from infinigen.terrain.utils import random_int +from infinigen.core.util.organization import Materials, ElementNames, Transparency, ElementTag, Tags from .core import Element from .landtiles import LandTiles diff --git a/infinigen/terrain/elements/warped_rocks.py b/infinigen/terrain/elements/warped_rocks.py index a3e1f8c57..75392915c 100644 --- a/infinigen/terrain/elements/warped_rocks.py +++ b/infinigen/terrain/elements/warped_rocks.py @@ -7,8 +7,8 @@ import gin import numpy as np from numpy import ascontiguousarray as AC -from terrain.utils import random_int -from util.organization import Materials, ElementNames, Transparency, ElementTag, Tags +from infinigen.terrain.utils import random_int +from infinigen.core.util.organization import Materials, ElementNames, Transparency, ElementTag, Tags from .core import Element diff --git a/infinigen/terrain/elements/waterbody.py b/infinigen/terrain/elements/waterbody.py index 0408d72be..cff581fe5 100644 --- a/infinigen/terrain/elements/waterbody.py +++ b/infinigen/terrain/elements/waterbody.py @@ -7,7 +7,7 @@ import gin import numpy as np from numpy import ascontiguousarray as AC -from util.organization import Materials, Transparency, ElementNames, ElementTag, Attributes +from infinigen.core.util.organization import Materials, Transparency, ElementNames, ElementTag, Attributes from .core import Element diff --git a/infinigen/terrain/land_process/erosion.py b/infinigen/terrain/land_process/erosion.py index 1d175230c..114d52f3e 100644 --- a/infinigen/terrain/land_process/erosion.py +++ b/infinigen/terrain/land_process/erosion.py @@ -10,8 +10,8 @@ import gin import numpy as np from numpy import ascontiguousarray as AC -from terrain.utils import ASFLOAT, load_cdll, read, smooth -from util.organization import AssetFile, Process +from infinigen.terrain.utils import ASFLOAT, load_cdll, read, smooth +from infinigen.core.util.organization import AssetFile, Process @gin.configurable @@ -47,7 +47,7 @@ def run_erosion( watertrack = np.zeros_like(heightmap) func( ASFLOAT(heightmap), ASFLOAT(result_heightmap), ASFLOAT(watertrack), - N, N, 0, n_iter, 0, spatial * tile_size, "terrain/source/cpu/soil_machine/soil/sand.soil".encode('utf-8'), + N, N, 0, n_iter, 0, spatial * tile_size, "infinigen/terrain/source/cpu/soil_machine/soil/sand.soil".encode('utf-8'), ) heightmap = result_heightmap + ground_level watertrack = watertrack.reshape((N, N)) diff --git a/infinigen/terrain/land_process/snowfall.py b/infinigen/terrain/land_process/snowfall.py index 961b5d817..fe95a46c6 100644 --- a/infinigen/terrain/land_process/snowfall.py +++ b/infinigen/terrain/land_process/snowfall.py @@ -9,10 +9,11 @@ import numpy as np from landlab import RasterModelGrid from landlab.components import FlowDirectorSteepest, TransportLengthHillslopeDiffuser -from terrain.utils import get_normal, read, smooth + +from infinigen.terrain.utils import get_normal, read, smooth from tqdm import tqdm -from util.organization import AssetFile, Process -from util.random import random_general as rg +from infinigen.core.util.organization import AssetFile, Process +from infinigen.core.util.random import random_general as rg snowfall_params_ = {} @gin.configurable diff --git a/infinigen/terrain/mesher/_marching_cubes_lewiner.py b/infinigen/terrain/mesher/_marching_cubes_lewiner.py index cb655d121..4ad515e17 100644 --- a/infinigen/terrain/mesher/_marching_cubes_lewiner.py +++ b/infinigen/terrain/mesher/_marching_cubes_lewiner.py @@ -8,7 +8,7 @@ import numpy as np from . import _marching_cubes_lewiner_luts as mcluts -from terrain import _marching_cubes_lewiner_cy +from infinigen.terrain import marching_cubes as _marching_cubes_lewiner_cy def marching_cubes(volume, level=None, *, spacing=(1., 1., 1.), diff --git a/infinigen/terrain/mesher/cube_spherical_mesher.py b/infinigen/terrain/mesher/cube_spherical_mesher.py index 5a232ec41..a5d09064b 100644 --- a/infinigen/terrain/mesher/cube_spherical_mesher.py +++ b/infinigen/terrain/mesher/cube_spherical_mesher.py @@ -10,9 +10,9 @@ import numpy as np from numpy import ascontiguousarray as AC from ._marching_cubes_lewiner import marching_cubes -from terrain.utils import ASDOUBLE, ASINT, Mesh, write_attributes, register_func, load_cdll -from terrain.utils import Timer as tTimer -from util.organization import Tags +from infinigen.terrain.utils import ASDOUBLE, ASINT, Mesh, write_attributes, register_func, load_cdll +from infinigen.terrain.utils import Timer as tTimer +from infinigen.core.util.organization import Tags from tqdm import tqdm @gin.configurable("CubeSphericalMesherTimer") diff --git a/infinigen/terrain/mesher/frontview_spherical_mesher.py b/infinigen/terrain/mesher/frontview_spherical_mesher.py index 5d7ff61c3..881a8c7b5 100644 --- a/infinigen/terrain/mesher/frontview_spherical_mesher.py +++ b/infinigen/terrain/mesher/frontview_spherical_mesher.py @@ -10,8 +10,8 @@ import numpy as np from numpy import ascontiguousarray as AC from ._marching_cubes_lewiner import marching_cubes -from terrain.utils import Mesh, ASDOUBLE, ASINT, write_attributes, register_func, load_cdll -from terrain.utils import Timer as tTimer +from infinigen.terrain.utils import Mesh, ASDOUBLE, ASINT, write_attributes, register_func, load_cdll +from infinigen.terrain.utils import Timer as tTimer from tqdm import tqdm @gin.configurable("FrontviewSphericalMesherTimer") diff --git a/infinigen/terrain/mesher/spherical_mesher.py b/infinigen/terrain/mesher/spherical_mesher.py index 0411231b1..80598b784 100644 --- a/infinigen/terrain/mesher/spherical_mesher.py +++ b/infinigen/terrain/mesher/spherical_mesher.py @@ -7,8 +7,8 @@ import numpy as np import gin -from util.logging import Timer -from terrain.utils import Mesh, get_caminfo, write_attributes, Vars +from infinigen.core.util.logging import Timer +from infinigen.terrain.utils import Mesh, get_caminfo, write_attributes, Vars from .cube_spherical_mesher import CubeSphericalMesher from .frontview_spherical_mesher import FrontviewSphericalMesher diff --git a/infinigen/terrain/mesher/uniform_mesher.py b/infinigen/terrain/mesher/uniform_mesher.py index 7961fee37..bbce11037 100644 --- a/infinigen/terrain/mesher/uniform_mesher.py +++ b/infinigen/terrain/mesher/uniform_mesher.py @@ -9,9 +9,9 @@ import gin import numpy as np from numpy import ascontiguousarray as AC -from terrain.utils import ASDOUBLE, ASINT, Mesh -from terrain.utils import Timer as tTimer -from terrain.utils import Vars, load_cdll, register_func, write_attributes +from infinigen.terrain.utils import ASDOUBLE, ASINT, Mesh +from infinigen.terrain.utils import Timer as tTimer +from infinigen.terrain.utils import Vars, load_cdll, register_func, write_attributes from ._marching_cubes_lewiner import marching_cubes diff --git a/infinigen/terrain/scene.py b/infinigen/terrain/scene.py index 50eb9178e..4a0385ff7 100644 --- a/infinigen/terrain/scene.py +++ b/infinigen/terrain/scene.py @@ -5,18 +5,18 @@ import gin -from terrain.elements.caves import Caves -from terrain.elements.ground import Ground -from terrain.elements.landtiles import LandTiles, Volcanos, FloatingIce -from terrain.elements.upsidedown_mountains import UpsidedownMountains -from terrain.elements.voronoi_rocks import VoronoiRocks, VoronoiGrains -from terrain.elements.warped_rocks import WarpedRocks -from terrain.elements.waterbody import Waterbody -from terrain.elements.atmosphere import Atmosphere +from infinigen.terrain.elements.caves import Caves +from infinigen.terrain.elements.ground import Ground +from infinigen.terrain.elements.landtiles import LandTiles, Volcanos, FloatingIce +from infinigen.terrain.elements.upsidedown_mountains import UpsidedownMountains +from infinigen.terrain.elements.voronoi_rocks import VoronoiRocks, VoronoiGrains +from infinigen.terrain.elements.warped_rocks import WarpedRocks +from infinigen.terrain.elements.waterbody import Waterbody +from infinigen.terrain.elements.atmosphere import Atmosphere -from terrain.utils import chance -from util.organization import ElementNames, Assets -from util.math import FixedSeed, int_hash +from infinigen.terrain.utils import chance +from infinigen.core.util.organization import ElementNames, Assets +from infinigen.core.util.math import FixedSeed, int_hash @gin.configurable def scene( diff --git a/infinigen/terrain/source/common/surfaces/chunkyrock.h b/infinigen/terrain/source/common/surfaces/chunkyrock.h index ec1708547..b683d7e52 100644 --- a/infinigen/terrain/source/common/surfaces/chunkyrock.h +++ b/infinigen/terrain/source/common/surfaces/chunkyrock.h @@ -1,5 +1,5 @@ -// Code generated using version 1.0.0 of worldgen/tools/kernelize_surfaces.py; -// refer to worldgen/surfaces/templates/chunkyrock.py which has the copyright +// Code generated using version 1.0.0 of infinigen/tools/kernelize_surfaces.py; +// refer to infinigen/assets/materials/chunkyrock.py which has the copyright // and authors DEVICE_FUNC void geo_rocks(float3_nonbuiltin position, float3_nonbuiltin normal, diff --git a/infinigen/terrain/source/common/surfaces/cobble_stone.h b/infinigen/terrain/source/common/surfaces/cobble_stone.h index 9126cfbcc..3c4ddbb2e 100644 --- a/infinigen/terrain/source/common/surfaces/cobble_stone.h +++ b/infinigen/terrain/source/common/surfaces/cobble_stone.h @@ -1,5 +1,5 @@ -// Code generated using version 1.0.0 of worldgen/tools/kernelize_surfaces.py; -// refer to worldgen/surfaces/templates/cobble_stone.py which has the copyright +// Code generated using version 1.0.0 of infinigen/tools/kernelize_surfaces.py; +// refer to infinigen/assets/materials/cobble_stone.py which has the copyright // and authors DEVICE_FUNC void geo_cobblestone( float3_nonbuiltin position, float3_nonbuiltin normal, diff --git a/infinigen/terrain/source/common/surfaces/cracked_ground.h b/infinigen/terrain/source/common/surfaces/cracked_ground.h index 40d1f4897..a8c0e480b 100644 --- a/infinigen/terrain/source/common/surfaces/cracked_ground.h +++ b/infinigen/terrain/source/common/surfaces/cracked_ground.h @@ -1,5 +1,5 @@ -// Code generated using version 1.0.0 of worldgen/tools/kernelize_surfaces.py; -// refer to worldgen/surfaces/templates/cracked_ground.py which has the +// Code generated using version 1.0.0 of infinigen/tools/kernelize_surfaces.py; +// refer to infinigen/assets/materials/cracked_ground.py which has the // copyright and authors DEVICE_FUNC void nodegroup_apply_value_to_normal( float Input_0, float Input_1, float3_nonbuiltin normal, diff --git a/infinigen/terrain/source/common/surfaces/dirt.h b/infinigen/terrain/source/common/surfaces/dirt.h index d36f6452a..b131b10d5 100644 --- a/infinigen/terrain/source/common/surfaces/dirt.h +++ b/infinigen/terrain/source/common/surfaces/dirt.h @@ -1,5 +1,5 @@ -// Code generated using version 1.0.0 of worldgen/tools/kernelize_surfaces.py; -// refer to worldgen/surfaces/templates/dirt.py which has the copyright and +// Code generated using version 1.0.0 of infinigen/tools/kernelize_surfaces.py; +// refer to infinigen/assets/materials/dirt.py which has the copyright and // authors DEVICE_FUNC void geo_dirt(float3_nonbuiltin position, float3_nonbuiltin normal, diff --git a/infinigen/terrain/source/common/surfaces/ice.h b/infinigen/terrain/source/common/surfaces/ice.h index 2bc611e2e..db15e9698 100644 --- a/infinigen/terrain/source/common/surfaces/ice.h +++ b/infinigen/terrain/source/common/surfaces/ice.h @@ -1,5 +1,5 @@ -// Code generated using version 1.0.0 of worldgen/tools/kernelize_surfaces.py; -// refer to worldgen/surfaces/templates/ice.py which has the copyright and +// Code generated using version 1.0.0 of infinigen/tools/kernelize_surfaces.py; +// refer to infinigen/assets/materials/ice.py which has the copyright and // authors DEVICE_FUNC void geo_ice(float3_nonbuiltin position, float3_nonbuiltin normal, POINTER_OR_REFERENCE_ARG float *float_vars, diff --git a/infinigen/terrain/source/common/surfaces/mountain.h b/infinigen/terrain/source/common/surfaces/mountain.h index 01c5574cf..335d27e01 100644 --- a/infinigen/terrain/source/common/surfaces/mountain.h +++ b/infinigen/terrain/source/common/surfaces/mountain.h @@ -1,5 +1,5 @@ -// Code generated using version 1.0.0 of worldgen/tools/kernelize_surfaces.py; -// refer to worldgen/surfaces/templates/mountain.py which has the copyright and +// Code generated using version 1.0.0 of infinigen/tools/kernelize_surfaces.py; +// refer to infinigen/assets/materials/mountain.py which has the copyright and // authors DEVICE_FUNC void geo_MOUNTAIN(float3_nonbuiltin position, float3_nonbuiltin normal, diff --git a/infinigen/terrain/source/common/surfaces/mud.h b/infinigen/terrain/source/common/surfaces/mud.h index 2cbd47ac0..fa121562b 100644 --- a/infinigen/terrain/source/common/surfaces/mud.h +++ b/infinigen/terrain/source/common/surfaces/mud.h @@ -1,5 +1,5 @@ -// Code generated using version 1.0.0 of worldgen/tools/kernelize_surfaces.py; -// refer to worldgen/surfaces/templates/mud.py which has the copyright and +// Code generated using version 1.0.0 of infinigen/tools/kernelize_surfaces.py; +// refer to infinigen/assets/materials/mud.py which has the copyright and // authors DEVICE_FUNC void geo_mud(float3_nonbuiltin position, float3_nonbuiltin normal, POINTER_OR_REFERENCE_ARG float *float_vars, diff --git a/infinigen/terrain/source/common/surfaces/sand.h b/infinigen/terrain/source/common/surfaces/sand.h index 51570b7b4..d72e8796b 100644 --- a/infinigen/terrain/source/common/surfaces/sand.h +++ b/infinigen/terrain/source/common/surfaces/sand.h @@ -1,5 +1,5 @@ -// Code generated using version 1.0.0 of worldgen/tools/kernelize_surfaces.py; -// refer to worldgen/surfaces/templates/sand.py which has the copyright and +// Code generated using version 1.0.0 of infinigen/tools/kernelize_surfaces.py; +// refer to infinigen/assets/materials/sand.py which has the copyright and // authors DEVICE_FUNC void geo_SAND(float3_nonbuiltin position, float3_nonbuiltin normal, diff --git a/infinigen/terrain/source/common/surfaces/sandstone.h b/infinigen/terrain/source/common/surfaces/sandstone.h index 87a6ce63d..675931b7f 100644 --- a/infinigen/terrain/source/common/surfaces/sandstone.h +++ b/infinigen/terrain/source/common/surfaces/sandstone.h @@ -1,5 +1,5 @@ -// Code generated using version 1.0.0 of worldgen/tools/kernelize_surfaces.py; -// refer to worldgen/surfaces/templates/sandstone.py which has the copyright and +// Code generated using version 1.0.0 of infinigen/tools/kernelize_surfaces.py; +// refer to infinigen/assets/materials/sandstone.py which has the copyright and // authors DEVICE_FUNC void nodegroup_roughness(float Input_0, float Input_1, float Input_2, float Input_3, diff --git a/infinigen/terrain/source/common/surfaces/snow.h b/infinigen/terrain/source/common/surfaces/snow.h index 120b938d3..1f8572280 100644 --- a/infinigen/terrain/source/common/surfaces/snow.h +++ b/infinigen/terrain/source/common/surfaces/snow.h @@ -1,5 +1,5 @@ -// Code generated using version 1.0.0 of worldgen/tools/kernelize_surfaces.py; -// refer to worldgen/surfaces/templates/snow.py which has the copyright and +// Code generated using version 1.0.0 of infinigen/tools/kernelize_surfaces.py; +// refer to infinigen/assets/materials/snow.py which has the copyright and // authors DEVICE_FUNC void geo_snowtexture(float3_nonbuiltin position, float3_nonbuiltin normal, diff --git a/infinigen/terrain/source/common/surfaces/soil.h b/infinigen/terrain/source/common/surfaces/soil.h index 03eb359b0..a62af64bd 100644 --- a/infinigen/terrain/source/common/surfaces/soil.h +++ b/infinigen/terrain/source/common/surfaces/soil.h @@ -1,5 +1,5 @@ -// Code generated using version 1.0.0 of worldgen/tools/kernelize_surfaces.py; -// refer to worldgen/surfaces/templates/soil.py which has the copyright and +// Code generated using version 1.0.0 of infinigen/tools/kernelize_surfaces.py; +// refer to infinigen/assets/materials/soil.py which has the copyright and // authors DEVICE_FUNC void nodegroup_pebble( float Input_0, float Input_1, diff --git a/infinigen/terrain/source/common/surfaces/stone.h b/infinigen/terrain/source/common/surfaces/stone.h index 5608ef555..270679a7e 100644 --- a/infinigen/terrain/source/common/surfaces/stone.h +++ b/infinigen/terrain/source/common/surfaces/stone.h @@ -1,5 +1,5 @@ -// Code generated using version 1.0.0 of worldgen/tools/kernelize_surfaces.py; -// refer to worldgen/surfaces/templates/stone.py which has the copyright and +// Code generated using version 1.0.0 of infinigen/tools/kernelize_surfaces.py; +// refer to infinigen/assets/materials/stone.py which has the copyright and // authors DEVICE_FUNC void geo_stone(float3_nonbuiltin position, float3_nonbuiltin normal, diff --git a/infinigen/terrain/surface_kernel/core.py b/infinigen/terrain/surface_kernel/core.py index bc7df92ac..0c5fa028f 100644 --- a/infinigen/terrain/surface_kernel/core.py +++ b/infinigen/terrain/surface_kernel/core.py @@ -9,7 +9,7 @@ import numpy as np from numpy import ascontiguousarray as AC -from terrain.utils import KernelDataType, Vars, load_cdll, register_func, ASFLOAT, ASINT, KERNELDATATYPE_DIMS, KERNELDATATYPE_NPTYPE, Mesh +from infinigen.terrain.utils import KernelDataType, Vars, load_cdll, register_func, ASFLOAT, ASINT, KERNELDATATYPE_DIMS, KERNELDATATYPE_NPTYPE, Mesh from .kernelizer import Kernelizer diff --git a/infinigen/terrain/surface_kernel/kernelizer.py b/infinigen/terrain/surface_kernel/kernelizer.py index cb222927a..66d3eb100 100644 --- a/infinigen/terrain/surface_kernel/kernelizer.py +++ b/infinigen/terrain/surface_kernel/kernelizer.py @@ -9,7 +9,7 @@ from collections import OrderedDict import numpy as np -from terrain.utils import SocketType, Vars, KernelDataType, usable_name, Nodes, NODE_ATTRS_AVAILABLE, SOCKETTYPE_KERNEL, \ +from infinigen.terrain.utils import SocketType, Vars, KernelDataType, usable_name, Nodes, NODE_ATTRS_AVAILABLE, SOCKETTYPE_KERNEL, \ sanitize, special_sanitize, special_sanitize_float_curve, concat_string, value_string, var_list, NODE_FUNCTIONS, \ collecting_vars, get_imp_var_name, special_sanitize_constant diff --git a/infinigen/terrain/utils/camera.py b/infinigen/terrain/utils/camera.py index a255d134a..ee6fe80a4 100644 --- a/infinigen/terrain/utils/camera.py +++ b/infinigen/terrain/utils/camera.py @@ -7,7 +7,7 @@ import bpy import gin import numpy as np -from placement.camera import get_camera +from infinigen.core.placement.camera import get_camera from scipy.spatial.transform import Rotation as R diff --git a/infinigen/terrain/utils/ctype_util.py b/infinigen/terrain/utils/ctype_util.py index 71862a717..1abb8db15 100644 --- a/infinigen/terrain/utils/ctype_util.py +++ b/infinigen/terrain/utils/ctype_util.py @@ -25,4 +25,5 @@ def register_func(me, dll, name, argtypes=[], restype=None, caller_name=None): func.restype = restype def load_cdll(path): - return CDLL(Path(sys.path[-1]) / path, mode=RTLD_LOCAL) \ No newline at end of file + root = Path(__file__).parent.parent.parent + return CDLL(root/path, mode=RTLD_LOCAL) diff --git a/infinigen/terrain/utils/kernelizer_util.py b/infinigen/terrain/utils/kernelizer_util.py index 929f8a9e9..46bad9207 100644 --- a/infinigen/terrain/utils/kernelizer_util.py +++ b/infinigen/terrain/utils/kernelizer_util.py @@ -5,9 +5,9 @@ import numpy as np -from nodes.node_info import Nodes as oNodes -from nodes.node_info import NODE_ATTRS_AVAILABLE as o_NODE_ATTRS_AVAILABLE -from surfaces.surface import Registry +from infinigen.core.nodes.node_info import Nodes as oNodes +from infinigen.core.nodes.node_info import NODE_ATTRS_AVAILABLE as o_NODE_ATTRS_AVAILABLE +from infinigen.core.surface import Registry class Vars: Position = "position" diff --git a/infinigen/terrain/utils/logging.py b/infinigen/terrain/utils/logging.py index 98ff3ca4d..f8f44f674 100644 --- a/infinigen/terrain/utils/logging.py +++ b/infinigen/terrain/utils/logging.py @@ -7,7 +7,7 @@ import psutil import os import gin -from util.logging import Timer as oTimer +from infinigen.core.util.logging import Timer as oTimer def report_memory(): diff --git a/infinigen/terrain/utils/mesh.py b/infinigen/terrain/utils/mesh.py index 170df196f..2e435262f 100644 --- a/infinigen/terrain/utils/mesh.py +++ b/infinigen/terrain/utils/mesh.py @@ -11,9 +11,9 @@ import numpy as np import trimesh from numpy import ascontiguousarray as AC -from util import blender as butil -from util.logging import Timer -from util.organization import Attributes +from infinigen.core.util import blender as butil +from infinigen.core.util.logging import Timer +from infinigen.core.util.organization import Attributes from .camera import getK from .ctype_util import ASDOUBLE, ASINT, load_cdll, register_func diff --git a/infinigen/tools/blendscript_import_infinigen.py b/infinigen/tools/blendscript_import_infinigen.py new file mode 100644 index 000000000..b84c01952 --- /dev/null +++ b/infinigen/tools/blendscript_import_infinigen.py @@ -0,0 +1,25 @@ + + +''' +Copy this file into blender's scripting window and run it whenever you open a new blender instance. + +It will configure the sys.path and load gin. This is necessary before any other procgen files can be imported/used within blender. + +Once this is done, you can do things like `from infinigen.assets.creatures.util.genomes.carnivore import CarnivoreFactory` then `CarnivoreFactory(0).spawn_asset(0)` directly in the blender commandline +''' + +import bpy +from pathlib import Path +import sys, os + +pwd = os.getcwd() +sys.path.append(pwd) + +import examples.generate_nature # so gin can find all its targets +import gin +gin.clear_config() +gin.enter_interactive_mode() + +gin.parse_config_files_and_bindings(['config/base.gin'], []) +from infinigen.core.surface import registry +registry.initialize_from_gin() \ No newline at end of file diff --git a/infinigen/tools/install/compile_flip_fluids.sh b/infinigen/tools/install/compile_flip_fluids.sh index 114c1351f..107c1d43c 100644 --- a/infinigen/tools/install/compile_flip_fluids.sh +++ b/infinigen/tools/install/compile_flip_fluids.sh @@ -23,5 +23,5 @@ if [ ! -d "${FLIP_FLUIDS_ADDON_FOLDER}" ]; then python build.py cd - cp -r "${FLIP_FLUIDS_ADDON_FOLDER}" "${BLENDER_ADDONS}" - "${BLENDER_EXE}" --background -noaudio -P ./worldgen/fluid/flip_init.py + "${BLENDER_EXE}" --background -noaudio -P ./infinigen/assets/fluid/flip_init.py fi \ No newline at end of file diff --git a/infinigen/tools/install/compile_opengl.sh b/infinigen/tools/install/compile_opengl.sh index 02d60f1c2..a26aef250 100644 --- a/infinigen/tools/install/compile_opengl.sh +++ b/infinigen/tools/install/compile_opengl.sh @@ -1,9 +1,9 @@ #!/bin/bash -# Compile process_mesh (i.e. OpenGL-based ground truth) -cd ./process_mesh + +cd ./infinigen/datagen/customgt cmake -S . -Bbuild -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_BUILD_TYPE=Release cmake --build build --target all -./build/process_mesh -in x -out x --height 100 --width 10 --frame 0 +./build/customgt -in x -out x --height 100 --width 10 --frame 0 if [ $? -eq 174 ]; then echo "OpenGL/EGL ground truth is working." else diff --git a/infinigen/tools/submit_asset_cache.py b/infinigen/tools/submit_asset_cache.py new file mode 100644 index 000000000..a08a753cb --- /dev/null +++ b/infinigen/tools/submit_asset_cache.py @@ -0,0 +1,58 @@ +# Copyright (c) Princeton University. +# This source code is licensed under the BSD 3-clause license found in the LICENSE file in the root directory of this source tree. + +# Authors: Karhan Kayan + +import submitit +import argparse +from pathlib import Path +import sys +import os +import time + +sys.path.append(str(Path(os.path.split(os.path.abspath(__file__))[0]) / "..")) + + +def get_slurm_banned_nodes(config_path=None): + if config_path is None: + return [] + with Path(config_path).open('r') as f: + return list(f.read().split()) + + +parser = argparse.ArgumentParser() +parser.add_argument('-b', '--blender_path', type=str) +parser.add_argument('-f', '--asset_folder', type=str) +parser.add_argument('-a', '--assets', nargs='+', default=[ + 'CachedBushFactory', + 'CachedTreeFactory', + 'CachedCactusFactory', + 'CachedCreatureFactory', + 'CachedBoulderFactory' +]) +parser.add_argument('-n', '--number', type=int, default=1) +parser.add_argument('-s', '--start_frame', type=int, default=-20) +parser.add_argument('-d', '--simulation_duration', type=int, default=24*20+20) +# parser.add_argument('-r', '--resolution', type=int) +# parser.add_argument('--dissolve_speed', type=int, default=25) +# parser.add_argument('--dom_scale', type=int, default=1) +args = parser.parse_args() + +Path(args.asset_folder).mkdir(parents=True, exist_ok=True) + + +for asset in args.assets: + for i in range(args.number): + cmd = f"{args.blender_path} --background -noaudio --python fluid/run_asset_cache.py -- -f {args.asset_folder}/ -a {asset} -s {args.start_frame} -d {args.simulation_duration}".split(" ") + print(cmd) + executor = submitit.AutoExecutor(folder=str(Path(args.asset_folder) / "logs")) + executor.update_parameters( + mem_gb=16, + name=f"{asset}_{i}", + cpus_per_task=4, + timeout_min=60*24, + slurm_account="pvl", + slurm_exclude= "node408,node409", + ) + render_fn = submitit.helpers.CommandFunction(cmd) + executor.submit(render_fn) diff --git a/infinigen/tools/terrain/generate_terrain_assets.py b/infinigen/tools/terrain/generate_terrain_assets.py new file mode 100644 index 000000000..14649540b --- /dev/null +++ b/infinigen/tools/terrain/generate_terrain_assets.py @@ -0,0 +1,83 @@ +# Copyright (c) Princeton University. +# This source code is licensed under the BSD 3-Clause license found in the LICENSE file in the root directory of this source tree. + +# Authors: Zeyu Ma + + +''' +fileheader placeholder +''' + +import os +import sys +import argparse +from pathlib import Path + +sys.path.append(os.getcwd()) + +import bpy +from infinigen.terrain.assets.caves import caves_asset +from infinigen.terrain.assets.landtiles import landtile_asset +from infinigen.terrain.assets.upsidedown_mountains import upsidedown_mountains_asset +from infinigen.core.util import blender as butil +from infinigen.core.util.math import int_hash, FixedSeed +from infinigen.core.util.organization import Assets, LandTile, AssetFile + + +def asset_generation( + output_folder, + assets, + instance_ids, + seed, + device, + check_only=False, +): + for i in instance_ids: + for asset in assets: + if asset in [LandTile.Mesa, LandTile.Canyon, LandTile.Canyons, LandTile.Cliff, LandTile.Mountain, LandTile.River, LandTile.Volcano, LandTile.MultiMountains, LandTile.Coast]: + if not (output_folder/asset/f"{i}"/AssetFile.Finish).exists(): + print(asset, i) + if not check_only: + with FixedSeed(int_hash([asset, seed, i])): + landtile_asset(output_folder/asset/f"{i}", asset, device=device) + if asset == Assets.UpsidedownMountains: + if not (output_folder/asset/f"{i}"/AssetFile.Finish).exists(): + print(asset, i) + if not check_only: + with FixedSeed(int_hash([asset, seed, i])): + upsidedown_mountains_asset(output_folder/Assets.UpsidedownMountains/f"{i}", device=device) + if asset == Assets.Caves: + if not (output_folder/asset/f"{i}"/AssetFile.Finish).exists(): + print(asset, i) + if not check_only: + with FixedSeed(int_hash([asset, seed, i])): + caves_asset(output_folder/Assets.Caves/f"{i}") + + +if __name__ == "__main__": + # by default infinigen does on-the-fly terrain asset generation, but if you want to pre-generate a pool of assets, run this code + parser = argparse.ArgumentParser() + parser.add_argument('-a', '--assets', nargs='+', default=[ + LandTile.MultiMountains, + LandTile.Coast, + LandTile.Mesa, + LandTile.Canyon, + LandTile.Canyons, + LandTile.Cliff, + LandTile.Mountain, + LandTile.River, + LandTile.Volcano, + Assets.UpsidedownMountains, + Assets.Caves, + ]) + parser.add_argument('-s', '--start', type=int, default=0) + parser.add_argument('-e', '--end', type=int, default=1) + parser.add_argument('-f', '--folder') + parser.add_argument('--seed', type=int, default=0) + parser.add_argument('--check_only', type=int, default=0) + parser.add_argument('--device', type=str, default="cpu") + args = parser.parse_args(sys.argv[sys.argv.index("--") + 1:]) + bpy.ops.preferences.addon_enable(module='add_mesh_extra_objects') + bpy.ops.preferences.addon_enable(module='ant_landscape') + butil.clear_scene(targets=[bpy.data.objects]) + asset_generation(Path(args.folder), args.assets, list(range(args.start, args.end)), args.seed, args.device, check_only=args.check_only) diff --git a/infinigen/tools/kernelize_surfaces.py b/infinigen/tools/terrain/kernelize_surfaces.py similarity index 73% rename from infinigen/tools/kernelize_surfaces.py rename to infinigen/tools/terrain/kernelize_surfaces.py index bd10cc909..d1da7a648 100644 --- a/infinigen/tools/kernelize_surfaces.py +++ b/infinigen/tools/terrain/kernelize_surfaces.py @@ -12,10 +12,10 @@ from pathlib import Path import bpy -from core import VERSION -from surfaces.templates import chunkyrock, cobble_stone, cracked_ground, dirt, ice, mountain, mud, sand, sandstone, snow, soil, stone -from terrain.surface_kernel.kernelizer import Kernelizer -from util.blender import clear_scene +from infinigen.core import VERSION +from infinigen.assets.materials import chunkyrock, cobble_stone, cracked_ground, dirt, ice, mountain, mud, sand, sandstone, snow, soil, stone +from infinigen.terrain.surface_kernel.kernelizer import Kernelizer +from infinigen.core.util.blender import clear_scene if __name__ == "__main__": parser = Kernelizer() @@ -29,7 +29,7 @@ folder.mkdir(exist_ok=1) dst = folder/f"{surface.name}.h" with open(dst, "w") as f: - f.write(f'''// Code generated using version {VERSION} of worldgen/tools/kernelize_surfaces.py; refer to worldgen/surfaces/templates/{surface.name}.py which has the copyright and authors''') + f.write(f'''// Code generated using version {VERSION} of infinigen/tools/kernelize_surfaces.py; refer to infinigen/assets/materials/{surface.name}.py which has the copyright and authors''') f.write(code) f.write("\n") # optional: clang-format needed to format output code diff --git a/infinigen/tools/terrain/landtile_viewer.py b/infinigen/tools/terrain/landtile_viewer.py new file mode 100644 index 000000000..79bca13a9 --- /dev/null +++ b/infinigen/tools/terrain/landtile_viewer.py @@ -0,0 +1,40 @@ +# Copyright (c) Princeton University. +# This source code is licensed under the BSD 3-Clause license found in the LICENSE file in the root directory of this source tree. + +# Authors: Zeyu Ma + + +import os +import sys + +#sys.path.append(f"{os.path.split(os.path.abspath(__file__))[0]}/../..") +import argparse + +import bpy +import numpy as np +from infinigen.core.nodes.node_wrangler import Nodes, NodeWrangler +from infinigen.terrain.utils import Mesh, read +from infinigen.core.util.blender import clear_scene +from infinigen.core.util.organization import AssetFile + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('-i', '--input', type=str) + parser.add_argument('-o', '--overlay', type=int, default=False) + args = parser.parse_args(sys.argv[sys.argv.index("--") + 1:]) + folder = os.path.dirname(args.input) + tile_size = float(np.loadtxt(f"{folder}/{AssetFile.TileSize}.txt")) + image = read(args.input) + mesh = Mesh(heightmap=image, L=tile_size) + if args.overlay: + image = read(args.input.replace(AssetFile.Heightmap, AssetFile.Mask)) + mesh.vertex_attributes["attribute"] = image.reshape(-1).astype(np.float32) + clear_scene() + obj = mesh.export_blender("preview") + if args.overlay: + material = bpy.data.materials.new(name="preview_material") + material.use_nodes = True + nw = NodeWrangler(material.node_tree) + new_attribute_node = nw.new_node(Nodes.Attribute, [], {"attribute_name": "attribute"}) + material.node_tree.links.new(new_attribute_node.outputs['Color'], material.node_tree.nodes['Principled BSDF'].inputs['Base Color']) + obj.active_material = material diff --git a/infinigen/tools/terrain/palette/.gitignore b/infinigen/tools/terrain/palette/.gitignore new file mode 100644 index 000000000..c1eaafafe --- /dev/null +++ b/infinigen/tools/terrain/palette/.gitignore @@ -0,0 +1,3 @@ +images +css +json \ No newline at end of file diff --git a/infinigen/tools/terrain/palette/demo1.png b/infinigen/tools/terrain/palette/demo1.png new file mode 100644 index 0000000000000000000000000000000000000000..640f96627f0f4fe414f31464bb0bc9d3514bfeb4 GIT binary patch literal 193176 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 literal 0 HcmV?d00001 diff --git a/infinigen/tools/terrain/palette/demo3.png b/infinigen/tools/terrain/palette/demo3.png new file mode 100644 index 0000000000000000000000000000000000000000..ce3f888d83a96d66ba41f61057694dc41bf0d908 GIT binary patch literal 650307 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

BADC^V;!ix#$WJ7B(@o*6YPsF|jjjSJm#@GVA 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%0AJRa^`}czO#Prp_!{<+U_YHinv*CkQ?8tjChOXv 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 z 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

F=7h(*g(W#E#n4#2n-q;LF9-Ey`Asc< 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

77(TaoQjg8up;9|9POckPZxi^O^| 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

QX5b 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�xgxJms*(#m9 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 literal 0 HcmV?d00001 diff --git a/infinigen/tools/terrain/palette/demo4.png b/infinigen/tools/terrain/palette/demo4.png new file mode 100644 index 0000000000000000000000000000000000000000..96938a095434aaf0bb4b6ac3212f228800f02871 GIT binary patch literal 82598 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�ZiI&)zKE_Fx5-Ipost$P_Gg&;35>Zo`i)+74)_~`w4_j#Tf zl!;p2%Y;1|V40+^)Zs8!NS~V#>?SSSMptmW-&VF==$&Ut4;ozdce%Sh%;~@##E3|O z>b_s_3PI%a{jUTNUGUFh9ZkRQ~+V*>Lb?Q3wem+*dE z6(2}nLXkbvq^=vimUspSpAK=XB{?q^i{Kfka<#T1h&o0qK-FHv84eyLPBqKu3u5+s;Y zFr)$7eJJ+kGSJ~Nzi<*2%6%KUM_ykms2fNLgpG zQ{qy18%d8Yfl3%O(1U=vNlEeCALTaz#5!SBA}YBn12s}PJcHXtn~B{iUSDE(yv67U zt|FZsq}3ZvgK+MdOK|3d1$*X%CR0_)f&57$`}lhvBC>q;N}Hqc@1T&I_riAVW8Lqt ze#_yy8ot;1`mIzrarLNe#RS~YH>lk&a~}UL?3m~PL>0)>r%7_yL|$@tR+!J~Nm=l? zavg;FQO0k)4dK?7kw|OS;@EbrIjjidfS}}H!~?R6hRfw!CduD#>p(hI=3y-LM9(Gz zUuEMms0OHWId_x09jQ#Qe;?kHf~}VsZHceC!+|3jc7^|!sAqA$y-_>XcIGMsdw>B+ zf~txS9(G}CVmF!)mIv-D0xD-4oUjx-ODqiLsu}%;8`)Y!;4)Ix_)YAK;o-Qa_F`=Y zI5QLtM0;6Sa59D}M(z7G!(|M#=p1$Ns06Ha@~U~XP*Pe!Z$r1%sYxmbzA%loTSoYqN zJmK9^MKYxY+G|A$ zSCYa3GYkIqx{MlI1`+It8iYs^)T^ioeLn&3uUkDtD0O;tiIfb(e9^tiwBHqOhw;Hn zVqk~xf;=2%7>dCItWo%KKYz|1^36Nl+jHtIdQZ&Tf>4i}(Wp#(+{#10-0VGFgoL zF9?Pz0T!DAItq;))1mtpq67el?z~t1`!8+~_5c(qp=+~CYK!IHhz0;4Li4$%$I}G= zGwix3KnfSb52vaBLWE`dM4tukGJ&TF{%1+f6abO=s=j*-{}%#`fy4m-#q5Qqvj4S8 zJ}iIX8%G2_Z$FHG?MKp{>6<2C5Zqb+hW+dE^+(|Q4mnx_y14MaBlDLsqhUb z@r7(}4gE*Qe3c}~p_Nv>aIR}p>st)*phmgBgTvtg`0^Tb`FDl32eW_dBt4r3Dg!rC zrtTSASD%ahZHEOlm7q|DYfvqD8}yiC7@f z=HYUHm1!a}nJTtbEm=I=MN&AjMAA;-V35J{@QuC z%<@v-@7qwVx45vC52BquHMmdWFJURHuw}HtJ}aRFLtb0i1o*r-GgaR_>Do?aSa-ZP zD47nnKEfByf58(xWl#DSiw5IFf8fmU*v-k@-<-4DiK-hNw)o$BiwTCnO$AYIiqJvt zAEtwT+#a8>=MKmGd!lqt6P+s6P*N|~rWLt63Is*k9lv6aM$U47vM zF8`Cf!RRMsRFY8xk+}5h+uuL%c+*tzJaa;nFwN^5L962J7QpWIj;5FOkzqLUU1)xl5&=Uu&vp(1w z7I)VF?D&c*E;lr95iZ60wsTGyb; zUwr^&mH@OCYWMhv9Hzf@xT~e#Obg9Rjsf{~FP6V@*yRAIjC(0A+2J+y8reCvGW@^f z#d-;F%Sjx61Q$>$v-V}&f8YF)q9{S$hbPdbsJEGJu+jUZOgWhQ7=!u=I1HY(LK?{y z(BQFOAjIhpR)y2|HBCFS4H)3pY$^-XeKdrBCH_|)u%Mz;36pRab2gPJz%g_$+WyOB zU+RFnW9gA=m$!Y04h!^{i|<}vRhNim>M(5;&TqB#gzll)2vMptUoo*;Yu3iEpscLtS{!gnvcwNuN6=6kJK=EoIJ@&7SO97S*0^~J`3$FBE%J2Vzwjty{Kk2nLsEv$e3z$7V-1|Qp zHL zkZphPpfgGRmC7r?xRu2ln!CNBsnS{mw+UlM#EIs&g%+xemKLggOnuv8XvLtF7xHXG zMfvyjuCP{XfZiE6J@_9r9Rke54U98$6#HJpfs8@@Q((5yCG;7e9eLz4mUIJ@^)8G^3^>*3Z*2+hYsZUs6;Af_ur?MB{q?>AU=EOR~4`no6n17euLh) zXBef3GU-r#*K4ZUj|opR#o#eY^rG~#++FH4{U6MNf8-e`rYKP>O$BO7WM8K;Ge|}~ zOQe>L8~DB0YIb{ZP-EPS60bAV3@mMB{vqjxdp)rfQo||8XP?SETQw?7=B+`%pvRS> zYCG3%fPis3sVFxkI`3jVd`}8FDV$W2JO&-UPiMTcK(umenZ}`3uQ7L*v~!C@!rpf-YD??d9ap;GvhJW zLF@K9$852`H9CCYDh2nz$M`=}FqWoZK(>vlY&@N{$Q=aEM?aViU+e&+ z%H$Qm(Oh6D`pK>WQ=(Q;C^)f(!Xyv2=}vGBDAE@gyLzOJJ@?5V-Hb>X13`Or&mOz%ziPwvf%op@l1J zi251t#6s-_i-iUw^~dOENeVs~1G)2;11Bs3Uo-|}7&O`txF^_lk?WU z{*`FLaa{b7!|H)!{A_MRPK&3s!RH0_w3VcOxL>WZ@bv~JHIFkJH5@(}Izod3gO_vh z+(d>3zw=$l-QHTI*-qbqc^#AP>%>bV50C2A_|Goh?ZS#TjdrZr8I$z~uII88l@R%R z_07s9Q%TyOE(}7pu8hI&(_as(jJ}xOT^*aN7KOa665u0 z@lBX+jcMda=1U0iOSLnd4+uPhQvSFz7qNQ-flNA05$|ge!sAKPgdLiYCsJa^lAs5y z5#A34^*ZZ2kp_Ix=Yon5sNd0Nb!V+F+Bs$!iC?yu(d7CP$7Kz}{o6$mKKY>0uLWo_ zQg7W`(^}v|Nr6nY8HBt-F)}9nfC;G#KLg8>=IW1U9zhQ6!qL16X+Q2GJ`l(e_G_`7 zsp=LUiv+amQTbAvyP212v+<9UI_D4P{hOQ3)s#6AMyYjq2^d-b;y zd%^aHw*BHdD4idpQw(PHtb;@5hO+V`4;X*cD5@P(RXGlcI2(G{%#nnO5+hTE->ANL zquSCaDE;~KjynrPF`MaBUE;DPkqnIL0^Ra%oJdQ`{`_FlVZiK2t1i9Rk4}(F&z2bY zOW487BFPY%o|X=$z7-x0XZxBhV3cmS47>@aV69#=2F|BOzXj;Wk`H-95;I1^b$ zWc}NB6X)C3WVg371`u>xb)1=uUYj8wjSiEam+L#pKa76-G};@3`^OkX#E2Rq?{iP< zQmcJdt^WP{>Uiy>8<8BT4SU^`5;~eSg*e-LCPK5Z?d0XUzEz_&+s^+{|6|RMVmInE zg!3sLg^iX?^s;@5%1g{#d}raJYN!O+8n zemyj}85UoLVW5Ss+9kC-C9ODMt4(chM%ECU&*9peNyOGz0mez#ZP#_gy=SwzIxIP| zD`-GuemD0=jqztG@1ILQoiF#H)k`R+|M)2~V$2XT32|e&9T4p13+6}=1#?a)F^c+|CAi%>h5D!_ue)X2KCk{ zBN^OG9j#+U%}1)=G;u5&X{wU>$ zrx{0e0hw1-pv;ig>$GTYom9|M*>ECtLIKe=Il0T42In$5<>ugrEqgT{OG9C-bQVqJ z-tgzgFsHQhq#tKJLIkF(N}ax$D#^7QV@w%3W<7oykCZAssUpYu!VTd; z{nDcecslOQC;W#8n_}eQ^=WR|S))|Dsb$o`a~(S^rT6_8!#;9hLl!m`16Jqpum16H zcEl;z;P3?;jeNAO+(Qh*Sratw-o6Er5emLao*ha)B?ir9Zu!qU%ag!Gj6L&nsN*7$5P6?zi0csM?m{U1-hFR130 z@Q%v?w9+U+NBG@R5UTcU!D5l!vqqy@J?SViTR+!+ zvgfG3?^PoeR(1RSL&I()p@7HIF-mqU8QR5TGbKM)FR-?Te@@EhY?^ug$9-Tktx~8Nzx8JwL#-Ka0TRXxrA(;qz?y z%d`rGd+_MxzKJ7bNwHn#ABkCrRiy)U2KhlNluy1sMK%%*3)F78qkZzTo4L>Mb58RC zARRQ}mC3ip1;k-i7A}+oT(JSf0u#x)IUj7zT1)imbDV79=PwKTew_Aj`m0rA_W*v( zOv-rf%lHjg^}{~AQSm^(0+g7J%J64Hxw|IrLy&+0w)$)v8g?PlE(fLs@Aq?R`)C(^ zEE=f0aNVmc3GNU|==m#Jt~fZJXP9Jv)a;MwCm#*SHop$Xuu$J$-Ml!wyhtf=AlaGu zMnR8?Y`arDI6COXVr=#7-f1`%ozuKp|VUg&Gfg|j{3 z#5=DOokYDN_cYjk%rNs`*iSSLMEd&2;cRi+dp+M!f-z;%f|`Q-yRItRRuLbdvCX~Q z?sNhoe?t-w8%Vc(B7pWH6HJ#<#_KN5(RHt&ME3fnda>@FR!~iwMd9;&I5`%ae*$I- zDzL1qp%Fg_H^_7SXywbvN;r9+%j~iATfyk6-63G&3K9S@u-%Cf^)thdWoSeT~(qe1LtvI7twCc`MTlHe<;F{!-TRcHKA6n?7Ns&wCM5^uYN zo0)5D`%}BqnU7EIJ=wnU@3K_8Im-D9v(ZWC_r{?g^QqR4EJ24z!#sybHXI4umWa2X zg?8Q3T8S2omcRa{Ze?NFhpr)-esc(J?k$T&`=ecfRAxe#R3E)^2~8E$npK?#kt%^+ zgY3EUhQQl)P44N%Wp10ivL%AfzC|@G>OV0$9|-X5Y$peR^!z7wFQ!={Xeu5gq0fw1 z>!NA{B_;Wl7wRCVh%i$orrqGw6ZjdwXo2)u z<*25~KaSj!^6&>Hx7N>WH4fOoxgw+9zmtO@2h8F*_DC6P6dX^fPT=(a4hsI8pG>Y0 z1MeYZq&Kk}q5WsM(7dPA!Wll-u2PM8U?M&ZoxMEaf0JGm+fV7ccKFzvGZO#Px*WtlJkZ!65L$^Dul9wo|6?D4v}N2=+EVA+Cy~Jn7%A<9|1&7r zO|FK zxpyxpe|}a=M!{p00Y0!PH0%y?ULU}oZFI=BUGC6Jg&43F<6ONO9SV~jua})#_=Ju7 zlFodjsS=hrPzxetoDe%-wn zXmF;@8|AF(hs3Je zDhWi6G(H%lah{)-*TlX?vnL{%VnGXOt6na;CO>2Km7-pA%k7URPxCt6)RLHD5-RRZ zENj-u0>lF-#UsGiue(Icwx(}<6LL%`Nm37-Aa6twBu?MB;b4IvUgx!k8+*VvgRg7q zy6B+U4UVB`@9%4~FRN`>Q=@m)8smed4DVaW6$~9(t4m`grC`NHZe|#%^wIZS+UI5O zfv>{VAL?8K++x%a>Ml$U4{5J@`^Qvp&BIj>yGykP&Ctgaz9dNWLvcB!YfK9}`Gz^- zAD7NKtkg?uNb5xtJ1yw^&B&!u+FbhU-&RY!5f~n~;Tfz=?x>DmLtY=u)&a6S-sYQP z*@B)^;~ak9qpEs;Wf9yor12v}@^A)x%;}t-bRkr{Bf;#^3qF?Ug1{xEb}jke9wY(v z#_7LZF7{`Eq{vYEiTRd1jm_^VT3{=V5O(To;>qEsXyAFVd@8!39-KFLpfR{>7)t3a zsdh~wz?o4UNQ&%I^!*esscJOl1jK~pC^^Mk{*U`hQz*ffP{;SH1kh2-0M0$ru*}Ia z8YPd`g_tBwWM+9?VWJtKb=~ytGhaJf8Qn6(`+1(U(##yvBq1E=DBxMNd5R-KQw5TI z8;#rVJa%=*nf+rCb3!?jkgj5$4qN8!TSr@dp6^W$17_CraH-w-=$DurlTN8Ri`86R z$-25hX2L|V(y%nS9}NS;paX%08n0M@%+x{`&Xe@V7(kd+PD8ewuCgRgMr-P=`Rm`I z*#_j>6$RP^@AKMe${Lz*M#|uWbsCMIM>FRODU>fQYBVIoZT*z2^R(Jm0Jl2tv0h8Q zPYX#lNSPh1Q4kPJ=A2t@Ly-iWNzs?nXs^oPE;3H{21(Oiy5QYUe>WH)&-7?nrIze+ z{dKNW;cgZwVR&fe0j+b;?H9J#O!~>;^}wG#1r|9mgML7XPx zN%x{2jYfs8dQM3v@C{Btd)HVzpdYJ{Y&+#LWTsJxwC%3`@rz>BJ-;1fe|$S=occC@ zp2=kW-Ay`sFHIG$zb+&B=>1RmIEH=cfYX))Sx|LEm1aIzy#ZilT`t8%0^lye-IJYc zto}TiA`sDD(R{QF!Z=0q#ag`%1WwEWd1uhvN4mB;m%1Kb=Tj#PI9f+_|5D%4T*;6Y1>vWcvkAS7n%-E?mV4W43=rt8uPKtZ>xykuc_ zGBNJEI__y{6qjp0S*R^D_8^l<6hJ6eq~F`)B?#`G5L(=`lWk}em$d3Rqb8d)?9PWHCo8<>f(8DZL51a*EbNoMT=3LEkDtD zv6?owaQ)E;2vUsz_^*Iq^5ub@#2=?0mLdv(D;4xJ!2vXQmCnan$?S%bFqyJ1e}Hw{ zN?d+9DT&>yxmuFI>VvlW+6gLxd$Gav7d=}1(Bx5qT9W`%L05GuKF&{Y?_bGr}p zWWy!F2-_erw`EcoDXDBa=4oA$(HrAOJ7GFnMnopO?eH(PXwsbS#WuGZZyrIorK%~U#TOu}^ z&_sBbsBC?>s*ZUn%cImnJHJv!> zu8v(#i@Uu7LnG;|y&7gyTfoJxh45mJ3t!W0C*xGzItqaJX2X<^J$g%YC0k;E)Clm& zp+GP)`hZN5^?0!+_K$?hO8k1!eHXfLwMRD%R8~8VOy!O>18~IY4s+Y@jZn^Uv|~gL zHGdI02_tx;+fVjei{yFF0bHh`@;i;l$p)SOz}Z-+TrL??WH>-*oJLd@Ut#4fG^<1N zbdAqhGGl$kozd`Zs8eOlhn+#m0u$t)5hPXWElUIfFq#Vb&#k1(-_$TPodc_(Mn7tj4r|gmOv8w zKA%&wX978Q3$9qEuH44G{#A-6H4fs1h4H|*nP&+vQZJumgY`|uP~qSsNit@a2VsSa zkRcv9&FOr1BlW4R`IIRZL#sqWgf9^H{`+Vgm&K^5!%_D;JThRl_yDXHo8QCC_=D_g z1gY@Co4wWXQ_FpygnoPYsHqeckt?deGEVLaYs%<*w&FI`7n7CW^i07(pxJ2_y+J-- zGbniw+cuhTE8BZp>mY-4Qb0U$UvB$=SM6wXhK_ki8s_H>ah!uD_uy>G%2nHeujJAt?1H^C~W|LIBw(BAy>x!0K zz|wFB+0?vxIm>i3(~siz9+FHfyOr~ zcMCXX1UWZoR2!$rxiaTgb6lchA|gUCth#0U(DssqISQDgUM}N7oQ0ahVc#ep{Zn^H zlcN6BBz<-2C@e&ikB!X&i<1IqYW!FmZap^@Jm?SeS~+hJ&TVnf!QM*qcht&&tdN%Z zYkKlSZ_UnV8qwZDO7U#_x1V{h^i|mXb8Thu>cWqs$f=6AEl+J)$I->`+U&Glc z2skP=m{)OevLd7-H2gGL!MLxq{h{VOd2Z(FwEd}dx|FK%%v}9swee0dDvT$8Gt(2rCu|+)#eJ7TflDOpjoH=0LmXT}wVHf*`Aa z`h)KDe8|tTrPS4Q(}4S*h#*XGJEjI2hoyl{{RaFJi8G*T=kR=RO#4OY4Ge=3MPSpr zBiM3e5H`9Q`@}cb$y5lsE zip>~cnNA2E3N*uv6CX-b!pC9kdA+Y`Jn8Cc%^2qB+sdLO%ojG|P28D)*)CgZm{Ucu+%ELQ|LD+Y@@UP7 z?uLyEaX5bR;oXa*6d5hXJaEdlvN*5NsR@>sd`y+m zAF($?GCcemr6Fx#EX6NtwTT(oUIgPjF!>EjgBbttv}KSv(b?h_Ko6Hlgs$#&P55@+ zm^&nv#lCv-DSh8%#YB7u1Ewj5M8JUdcHwuIsGF>8A-XI-2Lc>$-VaxR3?O1dK4GZ^ zi`vuZpHd!p_5@7hZn;ti)y!CI%&6fi6giqzCJAk(mxKTV04IqEP8Aqb-@u<+IdA1# z;?#p33KQyncgfywn`dHx6rVCnKnvZ-t||%E%LYn%sprw1XS_w8F9$36!%qaqHo0?9 zRm&QkxwK#)0f{*1DEb`Dbn6sQ>RY17n66Xfy9ysIUQU29{TfEPL zvMW**Mu5TeXZl+s-^XQyHKsTKz?>RDdL;f}`}^-m>KuzVpp55TT^@t?1EZ2-n8LXC z;Hpcf@i{R;nTnCkZgTs8pI2{B(VaeIWa?tA$3ie~S5GaTTKuqebKSpJFA?~%07c{(F&?c7@^?ih=eG)X(x1obL5jbe2)#f8v4wEl)v_m z{TyeA=Z6A~Qo1GSZa36GO4AHvqO=*Vza!>{HnUs2Pqy}rqOIZ-rYdigpm^;S(>J(d z-^dh7Knl8{4^bXdx1JEWAvP02_(vGQBnP=#M|&Xi_;t;?k?V&-A*@ z^+T|wVMNKvByVQ71`l*XUxONjw zAcMl|K%TxPXN}3-`+GSUBBGQEjQNMb=Y`8bG{V0_Jw;YZuse>;Q{Rg&4{X;!Jc<~W zB_Ta3sm`RI7I`6g`@#Dfh9&OFe(X^jhDofIH9*#~8;GoUtC^ogpL>ISe$Hea8sDy4 z)=aScr;&mufQ+#EqF>DgRHBC&A?5r0LWM5LQCfDvLvWaBEs>>=Tq{8|0tvGmfb+xGc;7Jh6EVY^9VF0+`%3q8`* zHXgmjFOAjGPPbRA+k|K;j~Fe8NGg*$Gc45V(@ zkQbi^c4(%Ou~KVQcfG;S#x{ft8HHx%;MnHeyOK_Umu^{oy8|fW*d@`09myCMlTrM; zz!6k>?fP>0BsTKD%4{}=D@`ua@6dxpeqcz;!l0lrax>7Wm;P$e1ka6hSgs$Iwc(k5 zr>_QIAHY(T>*iC@ywOsVht4QEf~i>|^`w?J6XNnpC{}llNv3{&yiH`$Y4q2&zS^7c z?MWBKZ3$w;yp9ytub`%{r3ui_f;nDNbqD!ywOT5XvFGS2(tba`$Xk^Szy$Vy9mP-WHz@Sy z8Db!g5FoXpahVGc2dR5PaI0Rna$GmNkrt}HM;@)V@JlrfbFfbu#BhaoC+mH)hYuY_ zHWZCf&yOy0*hKD=j zAK9!T8cZR0aK2L|K`M9iZTOgUOYqVs1jyEXxtO&g-tm5GX!Y++|L1)svFF29^%eOt zfbqWwjDIA#hocI(V8HP*M2qt7$yj0b3+CW{&jG`!N2n@1Tq%+gSofdP^C|vlOXB`KQLXO za!u|XED{Leo3r^3s6f^j=Ai$9n1LJPeKHScoGo5AWR?bI!@m-ekjIWgxa&Vq2(M{1-?vMnK+d#b|3TU@93dq1 zRbRY;t|405m>{#E>_CFG#SZenWrh-TEuk1JzKo7!SqUia^3^%Q z5f)%SuS!s0B2s}%0B5E+y3d`x+mXUAQL(gR%|}Q6|BX|>^`bU46~!?qkB2PQySFX# zAF1%)|EVe(GE8FyY_r(C5}s^}JXaL<3l95lN@4iG!L& z9`w9*T5!Bl*A0U?Ap@&%l$BPeq5zynbM0-|T{*5^##dIVivG*};>v8H-lFZP!L!ce z=5R0yy&wp#p!><~vVS3dP?l0PF;H~~X>hgSHOg|)K?J~QvIdv2D}ojegjfpnR0R>|j=F*-I6j7f+FjD%W+U@|Kq`}@`UN#<+Qc_x0_QJx*(G&Yxu5w2*;ooTgtjTpu z%lEx6{0-q0Vd(Um`P2Z^s|Y|pR#RWJW=ilb!i3nJbD30GH*7blJf`qUqsXhgYpaBv zM|$i(w;bHq0a-h}+gN$fO~dMOw%2y0ETgwpV;f(uIg#mc-|Cv&S!iTh9?fv=l01UB zIvsOl5qee#b;tqT-08&#|8`r(XuM9yv}8;Ob?6|9Cm-D(4KmAG%08w3*MgTilO=2Q z^d(k)y;9ybU1>e8_Xc?DT{idwc?W(BDb*i}LY}S{<$%<5qDx+5#)}_qXo@&u^tS-y zeh3bxfRl+%>pqRz|B6Esolf~HG}71Gu|?pU;A+yjpM+7`+=aVEGH`i zv>2!zz!HZ0CZ;CJ+JG1XG7A8FytptYbO=DNV`;b;lY5p7ur$08-8eAkgVC=mq_Kv1 zt-W0;XJ*Ni{sH@y^s2?+$M`NWefyOMskT@6OKUje)pDzaX%*8e6*L_M23s8ZaYD%s zKU~(i9S>gA9WIJfne)A(WOy*HF^-hdyXa16^KtPmg;kd3)YpZMw+a9*o`mB>tU^iv zt&KLj*cL%&`UnhgjzZinXDzZregw*&cY;V!U{_zoYZ*&Q6CKrzo}91WNyZxJu}0Ci zJ#7r`%(<>JBw>n^K|`2E+~(8LT6IEMn3Jwi?YR`9mAUT!+VD`yqDWbpUf9wTAA0Yitgi)JEO;KJacwdO2kh9|IgUB3*ao(?U3!uuoGsA zu2^HO4Wc~yW%sg;X0foZ;-yQ|)v9SqdI%*CuiLQC;7OM^Q~lbV;gy&%XBnd^JEc`+ zDP#7f<J1AwuD6vMSbIr@YZ`(DE};EAjpKR~7#&aS)S_S(b^DI*o&66%ZE}M-TChBi2Xc9b(QZu z&${*#jtf1%X+bUSLLY1OJH+n#o9dsF`=G-F6^tnIk36t*HRszTCQ79asNDq!9p|KT z?ECmU2?=bzS5jb>wi7a@v|x#;R#f(WdW-I;`9uv9ED6xVY8`e*l^g7hQ6d2gJvjip zv9tsvfth5QRZafHWHj73>CnQu8Y%6*BF%Y6YMIb}@&Iz}sZf^KmX;3_T>cL^7l%=8 zxH;@-d7p-toWO%my8HRJ`M@`^Gl0~X9XM$(_M?@1mg3`%pgX1#lPRIl?;@u+FRo^$ zm}@x_uo8T!6sGZ^7Yg78_7)t@7cc=IrA4v#etv(89fbbcy;Lm}h7JWc6>FPQetAmMMt=Y~6IN8~165KtMi_PI~r;#Q;$Mq6K_! zkHp6dLc#m%gP0UE1A=5De9`q(0?~+Qw)!G@vaqnY2i~z@{FTrqQ>R35uFEUmf;-CB z5}!G|wo6z!tVj5UPrkt zFn%P|^6*l@e&3kKJlAk%gFNRtOg(UQMgoAo(>_0mFXX&Yy(v(%i+OEYeH5=f<~RM` z^q<7hmh`P*1_sS~pDRYLsU$Y^8m9CQm{cAc-Tk?;jK4#PWA^b}9(T3?iT&^dg~|dr zq>21Z5^pV!iEalB$BaV@|{K%D3 zAGB`=bCQ1Il7!LhJ$J2~Yg#y_&ou1oY0*4+|MXy9p;EX)FKrK`teT{4?Y0TlyWATW zB>0i)s>1bNpAd#r6FkMjpqYMjZSo)rpz7Cl(&tKHuwuhZp>|A5Z*66%H7H-~MhIfA z%i^tP8Il#WM0DQd%O;v9F33B3nzmr46 zzgU!^ZoNY7P0BN*82FXUw6I#>VPcnsxk&Ny0f6wmva3C`XvXwt45v3qn9po&bF@5Q zcpa~jS`Kvb+@F7#>Awd|Q#^(1`-<7f+bQzhm+Gp?tqTPd_UKR7a5sG2X@i^{;C-)G zLeQMOs^@?_vJvrZOMZoxhEpjne1#{3`s>`M%YS-ruJuZ4{zGrbJFX>vDzeB-iYNkf zc-i&bsl>2|&=zI$szF;u=dNv4g%a~ztc9T})$rtd^r`6Okuef6_lx?AgUP;UZ_hxYfs4I4k+y-0NTR z>D~8u9$%gc9_vNZMsGn6=3zh!V*=WzudN<#`;*kyL*9Tq$2Soj&=5AE04Y~Hav)94 z!AL^_lN!WlObu25rtUD1Js5R&(~PG7u>7-~6N*rt$pogNTlQX>JEtE(38cYZ26um3 z2=`?>o&fpRt;IQoxkeno#hT$H7e6Sl_e=@6YTz#B23fvQAK23VRcP<}vzhW^{2K+vprHb82W zynH>VzP%Rf*#9w@+$VP#A}|W4J!MP7MBsbMsRsCWj(77Y% zs&L4EDa9|OXI5*lRy0ufUf6`Hm$A;U{Lv}ozIdP0l_IHZIfPg}MctKlJoF?g9g|;E zM+k_;)F`8>K{viAEKz`es@7exZi|-5sDL59ILzUS6>vPSha60jaSdC)WVw+`i>Lh; z@8<&WenyMgVwvu3j-26Qn(`#&*9;DRu*dVG7C_wi!lUsoc0sN+GRA0=4}8BPQqI<| zHZp%3dSF*^fzBHYls4!X(Jti-0?p;hs+!9rOhiNC#e9w!NQBl*3Kak4*=o5Jn)od#5F@NY6e zvs3GOzB$?Ca^MJrop~UXx(H%^6GK@Ti;tLCWSS`8E(tE%MR0vmZn*MY$)^dMx5m?jhmhsm;&m)hBX8HAccXECWmTgobIR%GW6_2Ko|cv})9=Ia`Uvg9TBliJH|?w7J%}FH1)6Ga95(=KZ>rgG4@I0`SUGmJ~X@4&RKc*J`s{rO`kPhKG#)$Mte_ z=~+vFB%d*u;iG|SvITN-V)DkMlGVpRrR-y&p=iKm?_TFxf7^i9ZBmC@pW zh_J0LPEU=Qtp3L>LsUiPpr21VMIVdyJmw(%>z;FiJ|D5~#bYb4C}!U@arwHxcg%*~ zT{wYoe=+sB#k7JFLVYhF$HI%!Q2Dik3{V+VX`bq*M>n-?;g#UaS;N)WiSVr}$%^99 zjpvv6;J&Wu5KE~mP3AKd{4*8Ne{-SgSLz26HEdRRk9YE)I<01>Ga9|Y3h z6c%)GXjX9~Z!whO95uKFcyP=y+08fC`X z;ao{}j=}Vs@Btax9pX;B^xNk`aal$;g(-R&XdVzJOxV+k0V;24ZQqTW(iFcjGMMA$a632p(zD z6V?6@=@^A{1nAk~YImn=MLIZnmlXrBRkH3{7n98kwKU6&%Q?u$Lre7!?*VEyAAPP~ z9<3h`^CZ}sAkMSkFYSo^&V<{a-JFIujK)QD5`eKsjVY#%A?Wmu`&t%gwo3F#Z~AK} z_eMLrJd6I14eH}~-cG?|mhzZiw_EWUcH(5onEh%XJm<=JGuk|40HE0hke}G$kO6ZT zh<&ZuT&Yg~F@P&6b6bAc%HpJAheAkJ&?ovrPkTSPEOTu>)9>ufrL2(0x)#&Oe2P6+ zS5f;l;5bL75NdZaod0OwyZ)E&A$`AEP3ZKBIZuJ@H*>GP*YYotqmMJAAv%raUlS9& zY?R`je?}g3<+laI3(tJMy)M6e2GmU3_}faqKP?wt$=Qr@#6n#(Mxr5Hrl98G`;CA-_4ll{E zX*#xMG>oMwNa?lx-U5i>rkT_yWoLzyGDm)$>9Y=%a-}HbG$4~0m5&i^iKz`79`fOv zCx`Y#WF1NmqPqkk&troDbo7CZ!IssIz{e}0_7Gi%6+b^mhTK9!~9U$2kF7r?G zP?3sXrN7t0tF1vJPW%6S&?veX(J3gOM-D9|iw+{2tZ?gSo8hd-JMy}otaf`Cf9P@2 z{bJpC^+qG8ySl{z9B&rkBcP!jAfcwn+oVk3b_IwVSCTJ3Ru|Jm!zQ;rJ}VWk)DB-B zGOiVjF_z@v(V9)4@33f$i}~TOoRL+i|N8p1JWG3xr#IBuFW~X{ZbOK>1GW}6&MZLp zF1O6!L_hEYZGqIXso(mKg^m=!`$oh6Heh1|+AbJSIf(xr>>v4jF^kulca2Q}$yPvEb;DN*Oy_6N{sY4&K&a+>5v`*ZW9DX1fQ z19hZeV-@HrHSFE?pNCg~RI`bLK3}=fzh=D1aY9VG5=4X~u$4*OEyju=)p9|S%ud~E z)Wxk?XRk*GFr<&iasP2SKl%<2SRHYxj5ap{15mCc0g_ zuF?5;a%LD~K;fIaeaWp&(za=E!eh|sAGKM|Eb!E<5+ouC!S9$g%6~5dCdD@`0GnM* zSy@@9W)g5@;k4dHb=qR?~~|9g3$KBYnJV)X~$8UbOc{6vzJp2 zt&+XD7rhb3_rGXeSQ^ScGS+-3E~Ir6*Sw71dUc5pKT7}jb3~W8{>i@C*FcdB*~97^TjTCm%WurUpRph7t@=_mE66gkSeB=st=7F^q^uF$7Ox zr2%cuFLmgAtHDjoL_Y%?V6mr$Yb68wWYT}}`d~?@Zd{NW%J5U8%V{b4y&Q-GV(}74 zE}sqq+}KL=zc)4o@d4@|4e0`7z-*es$^33*&Qa(E3#4)d znh@kWCaqJHn@;@kS8bJvr9om$h5N@^;R*0zn6(kFDi?_1;<*EcQZRwaA6wCZRN6XR zr@MJO8QveuiledoiE&KI{X(nmdqKYhoCbw%_&?=p7&P_6{)`-~z@|Okg1Ntto$$R^ ziH!eaJJ*53&#Va>Tu%xZZ&)24eJ(R1M6X2n(;O;J0mN3dj{B3!1obwdX`=g2Pjgy5M`tIu;>(_!bK%~xn6+7(s>n1jyy~D#=%Q-2 zeZe>73L|!2uZ!&8!@_l^(aE9eav>D`8z8D5oqjFHe+y6&h932vzmW?6n@r;A@hq2h zWXl1M}ka0TlB6JAw$m7Q`a{BR0UoKY_Zf zkrYIU2EkJRGJFez|4}e}N`eR&&cFnbaq9J)%6I92v;d&`$ws{62Q);)amIxtfD#tz zUSxXvftO^D1DMfR0T9|b;M}V{3gk4CPTU7#s5xv_oBwwozP$_xNW2#On724!g=63$ zjVZ;vf%p#xOP#C0UGih05}TLOF9B+Z5*yoFn?ZNFTjnm8S)2T$$*X1J**q8ikOaIL z3L#+m>jhBjh31;lrpvTvDNAdPWa_aCZte z0o+WP49Kbj8YZv;S$(n&=RgXP9fT1ScD@zBb@P%AgM|_5@p35Z_I<}g9Z-wUa}ExO z>(dHN_fZtG?bbi945+21t7rXrs&fCzh-%O2I-4Acv9brzm9=TR2Lo@|gD|$0WgkH?{mzoBbtyhY}u zS%4Oz+GWGwI~xpH7g_j!8jJwFEjIqE^8kI$cE=T)Gz?;4LLRLbb?B`1#Lrp4n*yNKuY?%? z?IGgRu)2+>5G%{U%xo&NBnOnI7Cr7}N222p?)Gf6*jGLcvqf(emB0AY1q?1a6P+}% z6{gCWHSZ>08>3qN{bVi^2hMm=bk0q>AsW?dwk@X*y8nm{hCpH&r%%tSD_el*;Mc_L zIlqfGBd#1yP3L&Tn~W;yR?S+q(ZWx%@U?B@+?S&89!#zaK3$-1(=96>g=pFUvJ1nm z(zU#`x-m`+kdBk7Lm90Y_K?kM+Et{vuM|U@_N|MgX;Rls|w`1x8#BC3*en& z%=6f^Nbb<{4+aY}Uso3u{ni~mU0z+FK|#TB^OTI%Pyy1}68euilj4oK3A7{t{d(rbJcJzmTx<%F%--$7ulHWhlRF-E8at_ zB5o?)kN+Fs$8BNV4k~e5Zhehf<~0g=@7{k7(XaPG*!MvVq1k{o6R+W;STo4kmm~7t z^rXx=xdLAQ{mYG2+VPPhGh_7->GDdCmsjUZk^7KCaioOK_$T9+vtSOtvlt+-O`sV3 z0$scFe+&s==cbq#`CADDBtHL237fQ(vl)jK81|EFkF3wS2yqt~n3;}9Xe+vRT+O%R z(R~sD>Qvy_rwwZzCDVzeGtq#`R+eSTeUK(EYbs`chPsUr#XU3h7pVMZ4w%LHW^U~y zwEInv>EL0mPw&uZj#VhVFoDIo$B^#{9D%(hM@e{&jxRBdHb-~ z(x%{|FgqSUf-Yq{nY(HrfP=t^DH>*spd^CaGm0&d5c2V7+2fT}9n?O@nSZ*QY5k20bWBs(A$ zQ=@^1nv#Zp7(BNe8YhHOXfN%TqSytKdFXUC zd+2x$VEkc(Gt8_N;||YhcNZO2fXd^nlY2_EC8$&0aS0`WAyRuJNCvx_!H_G{0T?|n z+rXE?P>LJHwU6pHN)9sod4nBTG6<)}^eu(s!*LgB!vjS_wilW@dztr(-@29-NpoS% zMc}6?K7ZbBKv8m#UGMeYLLjI}c~~CQNd|cD9TxM$x5dTb+ymlWqnW}pMvk;y<6A@E z$c^&P5FM72-O9<6&#btAtk-n553MRh)cviszDTz?Xq`59&wsE=QtSSkKz4|;f1HDy z6>&{Ub|}xdQp+ETI!5-S+9A5H1Zl#_l=J6w~eW**M&!{v-}Xp<4FIg zaw;keGK>Tt3=s@5jd%rd-%aj%sL{P1W5=BXRjKbM%gGJ5_q#&3E;~QImyQk#hf*>y zgluwbhbZq;PN^1=Pjeuya3sD2pmKv-|3#NhxDro&lNg4MQDDv!< zO&&;TjR^~mkg2w?9wHV&R~qCZeY{GQt1kI^`Ry%=0-%)sfR<63;@kd!D)Ot@_H{&3 z-(%WviG&6w=n@E=#_=>}B$1bc|$(KX8QDu}? zP1{?n``qCeaiwd@9?X`F$gBsTk=d&WZ-_6{G8Rrr4sYeLAKKD)# zI*HQki5S6Qcp=Ke>2vsWWA-~ERE)~?9A+uF?{RG;^>!k5^T9+=muqTjf><|U5#C@( z7c(R$CvyVwgRREmSD+eFiYJo>jm5>(Cl@36gYqC}B$5eM&(}AYi*ysNoZr-iICd$S ztCh2RXMk9qP_WVZkZ4S^u5F3p( zYCqrLzvAM10X$4S+DYt>$RV=(QkQr{`(R8rs2J8w1UYOx)zFafFK1`!6322a=vGno z8aHOtb>^fmgPB;v7EhfAt?w zPTzhe+zF~Lcis0Zfa9D@>hlgc(&Fv(fc15)+>;9-oN{h$KlDV=tt2KT0BeY~SAe+R z_K$au{^FgQKElDl8ULQ)iFZ_+)H(`$PhH6OB;=Z3lrSN0*bXMWrPbAY%US2a*}Jpz zos$bJvAFKu>-t9~f9aCrSA5?|^(e1gj}~=jD z5oU_5VfvQ(Gbr#jg7}+Bn6Dw;kskRtg_t3t!bXO$p3U@z@O%aZGBhwaqoAODnZEYR zQ>WGFYPCiuSQb%c7D}Ecb~@u&KIlH!DxE6!cgwViw5vndCY^=T5&C7E`HKG!4@rj1;LxDlSB_ z>ff8G&cjA9nV8abfUaS+n1sz1e_ooZ8m5UHdG3~Shz!E1+qvN>LtymBQe(gZIXCv7 zaJl>btpBP&s8th2J71;+mra@r8?;VlT)H_O@TH2>dYPGZ;x&yuxpaS`=Ytd{W;fW_ z0Q8L*S{-{HsQWiHUtt)|<(u#w7)=$ey4RzT11WFN4gVNo4G_+JMi>Jpydjxl+7N9Y z0Xat@x?MA3KFH#F*t}Me<(m&rLsPt)cA#L2!`V+}9aD{T*Tg@%^HUefo!Vve<$C|_ zjj;wVe{#LAGaX?&w}!bYyWV_5;UDu<=dDpBhzsez`rB=RDF79W7re8!YXl zc>l&?sauWnRqsTNm1tDcc2ZelrhJe|_o9)j0H*nzRrex^y`TF6@e;vI>Tz|BfB%?^ z|8I^@pR}ny=128jHc5fGpSlm@yZ7c7P}(1uD*Xg0#YPHXewM#Bey`LF$VOw6ih|i? z`QRpVpGH=%2OlKJxFmjfcefR(0%(9o`a0O%0Z#S~FaBF_AjP^COlnk=NY(c-ZZQjk z3&2}1hg#0#b&m)+jI+=hoa`s z{K@OO6v=n3B6^>;yrMUV(j{2?suqna{IW z@LvlogYaa?*7M<2po6%ca1TyetPw|=o!LSHH3sMzGMdd$SJ?6+?TFvlMz%ghe^z@< zrTn(b!0_85&k$dG@Nca-ncF&yb?bzSmGsq#>% zC&jk+me)TPHTl_2QT~FUv}Qr|h7JpKfXNCT#7${?-I{qCu++E~#5Maob7Vamm#@b0 zy~g{w>&R@HapmJ5mv@2+hzq#V)3#cs*mTq-KfLKcc;w}!c!cKu#V|B#qOK)+$d*Q7 zU$woxCV<&<8>BS#cQ*KH$IvC&sT}|3N_7ixb~l2Hz0kpo zHt2mDxpU=Cgsr z>6%9x9s026^^0Ja<^WVWqp+yRk1PECP=5A`+5|ELG_m_b`R3oBybi62?`8GBjBtR_ zYLQ##4k^p4Xi>BFDG>;H@(XmfYq^5<(mHtuMiaQCH&4aiGGPph_=c$|wN?Z%6j=<@ zn2&pZS-eMm-p*W-j#18bcwXSoNPX7)sF92hgLCHA^FAjZq&5r3M-kkoV#CCZnA666 z$NxjO+dJMa_PGY^FssyahwiSj^I!qniHcSy|8}D+yf_pdEHOI_)Wi`Hn*2afwNtFw z%Gx4?cIS^-9_&MjWC`eG%sTy%rfW<3()-r5qtYz4dc&#G2%l=qtet=+;(q_9iCapr z7J1(MOAXEs1!W^Zu|zSz_u$s-VwC@MJk_RkU!{+>1M_agB@g*Hjdta5rA<%2*Eyc# zN-9JS%@?nkRtaU^T!@hZOFC7-jWpFJ{mY`;EInSIF6cg6W>wr=)k^%VE(3Yn*M40kXRr-RZmzAe!|t zZtnSI{YjrhxFno*PJ>kGO(=)JK*Y0vd#So=oUUIR^|mK`bp4F-D1XSugdU5{-URJ# z@H~|^op4Our#GlnhJ&neSCbpkOw-_W!J=)2H?fAw8E*pFI=O&<{qtv^B}{#o!yDW$y<>GstJQ8?v`!OOL*y$0OVe5NkuFnSZe>)oTlnhT4h`LP2QaX3A`o&-q9i5JCL`LPEYDS9HWe9!V^Etw&5osrsD2DSI3kHL-!yj!lh}NH5>}2U>PL z`jb{(_-TU#PUv|Gb?I?! z(UgBB9^h7rhZUoxtaa-gm#`3_Ri~7l{a3B`7h?#ka?b(-U&AgFI1WAr&sTiy;_~y( zb_-+VLm*_9r_sehC3#G z-cq}mE6}Gc-L*vEHy}?SJRofcFu%KuhV5+jQP47}O!^wbUN-13^W|#9jn6$>o*Tur z+eK*(?6fB8$}Z?h#zs<^W$Q`W|8lp-1bU~WzqPq(x>#)n?}i4_QB}nq0o-iIw@p-l ziKJ%^Ip$BNgh3OVcI!NcE&Zm~zWK?#iNIT}`@1FeB1`)+7uS1HGJdycZyk}37+X2 zDJ>qeB?6<(dHfRB{~0>wD(Or(quVN$@!}j?p*Fs#^gLi2f=_sf-842i8~G;LA|H?M zN;=o#lt@~`rAWK9GzTaEE)&1YqQ#oLizIW-Nyi%6s26KJtBK-j*LgXX(X8Jh&ReIa zdfIXk_@`^v?6#8fi|!Zdq9+m}e$oYc-KWwPZ?YN%xfs<&%r*MM)y0pvJ>Wk7bM0Ft z^~dGM`%~_zoWTcN^^H5BGdH@756I9`*z-Vj`YE6m1wAisgYNimPoM;{`k~d-I~ESj zDfMJvJ|NXdK4Z?`n?d7R3K5&*bDGMs9taM8L{>T#mLghPBef@Ww*J(&_z5PJzlBwF z%TlU!!8OF$(@Wd}IE1B3F35nK7u&+AlAPl*3bI-CMtNp&2=6M;Q8@-5dr*d6RGnDK z?I)(Hlud_k;RjXPq)buO$5xC@PoKGbk7ry9V?byZaZ1P z@y|A{E_x#2)*p8Kb{+SUgA9S62 zemaG{`xZ;FZVJP1*o!JFC-)wj&+UQ=kO%t!L5}G8`FUJ=x*{O4y_CATfPx}ck`WjE zk~=;9C57LmbfL5X57?sq*(d##{j9uA6UgpFpPvFozA*}NUNd_6=e@Yr7oktgGS=OQTq2u+7)Pafj;>Z^BZqnY@>WaSI-2D3KvDC_J{cpMuVb1mG5w&UU7Xz3> z7MM`xyWq$->_L?jAJ8N_*CE&t^wk*qeK~8DVU~ORB~*ac$W?vONjj zQlgeWgU4d1Z0l>EBA2EkgFl}LQKi{iHw_lEE`Jv1?~%jgtcx1%s9){#khBve@D%ip zTp)pqZx?I&VO!FtofEJgG5_r21~!2IJA+|}V9+oRSAn%*JB+YpHpd=Z`nvH62d(4M z8AaZJ#pk@{Fv=)t?PDTEGI&xs`u(Ll;L( zHW?xIllNm9{Tgr0MP_C~oZsB#HqCu680h>bv+jm{@y`f8t99PsB;V9qQ}VK=HtR$8 zndP(;r1pM-XS61D$3N!Y;fgJ<*92+gy>mk!x*YJHZ{e>i(ZK-)T?yz;so&-^6+Ny9 zV-a^*?*k(&&u8=l4Tavm9cFJto}xso?k&<=+rG`g^`=!1-h#gr+4~) zvG8Kj^n zMYEOYMH5(dg|qS{yRMN>qc#q7Y?fdkTyCxhji$bgL@CC}BJ>nNj(2Gmmny-*lWE8U z{c82F1jSX?(945T_w%L9t7ap<3W;Qtj=jA>m(w8wY2K)|9R>96JA()&q(Muh)A|Fr z^;pV2ZAI}@B%@SLN4){C8A2dw_gY63f9ysXD9>*$GpTH^7IVz*QmP3zwiVL2SJTbG zK6;U_5I=-NlGUjk_P<-gQT>gws9raxn#RX1tKDYLJ;laxE9O$bnuwQ-4?_if7p~uc zBC$kLI=aXr3C$b1fK_!sM5MLzoj>Lbt>CO6ZquC)`;gKW{1i-W;L)>?NXeP?EAIQ% zSJZdr2P{3K#YV3-CF3_8UqK}=GCe%TQ*ci8dmE`JtbZo{3Nh-MN*;^pGg1~}Qt;U$ zlY5ZTuETs_c&n)8?P+2sFu>)AR(1+))TkX!0*WN7EWQ_Ta$;+Hc{rpXtMn)0+9DQP~C-Q;FMq)?VmQt7gkB3J?x0hm%D9ci}_oM9>PgGHFw?Y2Ejaf z>P3JzF2(gW5+VuDC8WuA{Fyjld_`&3TYnu6>J`p+Vc{ttD#I}x$qP7?ptB{o7L9kd z?FkQ6a+fn7Y1HkwC4VLR%nI#ctbFev1K;zlIe zK1!Ul{S!3}jTvCQ0E{4h(1_Rm!yU)wl?`;-7~E{dSow?{$@N}G{GRe&UR`Ejf@jp; z8g1%s8&OTM(E}Un{cdH!I+&w*mO%T{t8ln2b<(2?We-tqL+Fpe7)dxMgIOA2iS7uw zS*v@J04(p3d_65zi*MLlSF!M^-{rb*mGB`P+&!x@L$xIX z#!MYQMSNuG7XTMPPc(Nc&_n~X=4rr6rT2UGHAO%X&%g%3pi29j6GAF^ulp+BPOs$+ z1f{M%aASoNitb!JeWE>B)m?Dm$Al<1KtYQFA!+rg;cwB+condvtu zuuXWLN{LLcPjDvX_GsAe-$~;)Q>NV-(4Nf?d{9w9DAhcz2xoMz>l;W?I7+*l%0HO+qVwr+-Lv;E7VfPi3&=o+I`F`@X~2A86f=fU))cgOWoY zj&1YrBZ&ZLv)N;8WR$X~t{ohQo!*vO!w6I-S&-^PHJ2;%ZixWJnZLY5qvGebFZ2gi z4ePiEgYI%K;dvgc*##akcWVH-BE~bPDAzmJg>K913`I$G48d_wuVYC-Lq;_($>(r7 zOY9)b!yt)EQxQ-`yV6Dfdgx@?N4VhGKk!AcUI8Ja6v+|nyFyHYDqvA6#kph1#%um% zkcad8>eCe0W<|S1$!`_Z6ukw)hGL}+dltdY7_jqDJQZ0e+$_`%NIH==+i>8ZUIwU7 zg>RP~P{_&Mm_6f@lBSkyI##|Uj=r*z8~63~DXZ=vKyP&zT^1RA5z?|K@gJs+5!`#C z;=Pos)EVIYw8`Rf>1v{7b?motn0FY`5z3kVA^`(`Z|tg0v(y%Y=Ygx=1J5n0A{F4` zNv3#FJRb6`sfexeH_7&4FQMyZM{z0-+m+T&I&)4+AqxaSRBux;6)lySOqB@30~-#| zMtwB-SZZVEkG2j8IMZBo^<+v3hxewjaj_WTS3@7tFk6*3ZE*LE@&gR{LgL;!z)?}} z$2&PkeSOHE9Q;UtfxOR2c?u)Ts1jYhIZjfOh2H*U_L8X{4HC{A)_BM`tb-y1zmfFd zEE3wi9{>FP9XEOa>?Mz&|9UYhZ=hod3j^GMBrL!Ucs+B4zZ3zheOiSg!sy&<^HxQ% zr7qVF#r?%w@B#YncviX2rg50n5>bhSPbmGBt(0YSNK~<9?t4y zHDTaw4Zi0NGn@-qZ&3nB2`^etMHy6rZc>MAX*R%T%T^~V$y!|2LIcG07XpFV{LZnb z^g9Bxkis#m7a?!rUP7T~!JAS}so+_=yquu*qa6)yR;*n53)|%A8y26_3w*o(P$^2G+2YGRvn+z^E5wb7xb-$e9X&;21ls%pE zJF65^(E}{_8eSev7uwJYq{$C=U~pj)uKX)|t^^ajH;uG5Be3DgLiNma;5lPEjZI9Z z@+9L%5?t@MllF(+>*hMSoo5FVFyprZJL_axoCC|5V!fK42Z3%(5YmmwN0=LiT1mJ{ z2UFh>ClXuRp6+%m2_;c`Sse=sc)sWnK4u@)}Dzp0iHq z_~gC&T%8tYy6xRvtu)p&2OvHbA@TWQ9#E7nH=W9uXS16 z82<;K%5VYe48y#EV`EU*_lH64e8k$C5H8!Q*0Fe*QPbdh<|*u<33yVZx78DDhL!gXzQn#=)jW`&UbcWVc9F=wl3Yo=ZnU`Vf0@4S=PP zAo$uO%TtLRRnu*Le~FhO}OkXO!rf;tq1Z6b-0l$A2v_4gL|r-hWfxbabucvM?Z zqpdT`lHhofj>JQs!Pb9+V`f@F>{=y&r+e?G?~J zzzTvt(#57#U(XE`6{8QBl#;m)fEB!g5+ODn>jqvvFGy9bnQLuG()#YARksLP<~cPQ z(J~gyLXY5z?8%>PE%M8az$F#xP!0-DLPj?srIyf{rv=Sy9oDZH49cfQ&$QJm3 zD#3O!0-A;`W}?`SQwTNex_N zYHo7Hz6kIGc?PdBXl-WvOaDgHSs>6$jd$X@|52Hn6_q{vl_J*it*Rv2!GciOA%YA! zx}@Kc?FCk$-x~EO5;|1H!m^Ki!YiUkZ4T*~(bwv2YDCK%K*IC!Wv>4uR~qo^1t!We zWV85WsHms{EWcVUxgS}+=>nz(_5tI^2;rV>7Z!~v>}a5PsG1G;(2I^SN559xMYUKG z*qvwYoh2rd-^mfUi&l5_=-C%5_#3a0_O}uDppfLW!6V!VWP$B3zqtK( z+U&gaw#c~%ZWiyC7Y$Mb#WUrPzu+yNtgVOI>}vj!V@?U;`oGe0${z?`d4ru2WuVO+ zRWP7g#gvguX$8YILrZm1x<>>T+c&v3GrG;>y?!er(CQR^+oKLgN$Ju=Dl7Ps_nnW( zLlqAr`VA>SS~aS^!;mZtJ`3OtIcw(aVC(f1k?0Nyi(Wo6q8H5axRh$L_x ztXvD6H?v{2>;;HBTqvDn8z)-dJ|19s#ut}myI@HJ=uv#kB<$tZ7sRNVt!L%a&e!enIdGSc&O5|yGdJ6oI3SEbI=++0mE z^Q@tAufwT^&4*Ng%=esxg6hZ^T5@4us@tKmXG5-kjNlt8m(ScZS8vj@y(}NGR0uV- zugW2GLRrCE^A-SYc!r8nsDVw^ADT8%ACB!bpfov%5>HMl!?C*bQJl#~{x0yHhwD_o0Baa$cwcoY_k;sH#P#OFl{mz_QL zU@fogAI)tD-177O%_^uNZ5K~j+qF7(Kbx`qccoEg=G4NILv zZX%B%oE2XKpx=W<-UqxVsk7*VF$!RsqH~ zdrjunUv2Za= zeUMIek%9B5k`bf|M%{R`@4b{ysZa!8u1i6JOZ2|^YuB2R#d%5(mWP&IDOTQzUkJln zAyus{eyrw|cHBSZRhJ4`2*=dUo@Xv9G?qst0aW0lzuUw9i?c;W7Oo6rmFh18RU_VD=p~lD8P&stf!f1j8T>n~I^nH^ZVSo0mXU%!q$ABLJN@#$xZXoGA$ED zA>mFO155vq?6AKGv@*eOFy;$-_>Sa^s|$pO{u?PGU3*HSDn%0Z`1JJjkn2%=7J!nR0*J8s{W&5_Qa#|vA*5fg zy^PRdA}01+cd~)i==)~RqSFG7Zbp0l3r`y^Q9?DkgeLFT!5foUznEfWJ03r#3P+4ho+Jnx(yq z?P20IY#I(o;|rmw%p_zQO1NX!eS*@LJ;s8=7mh0oD=?+ZcZr?I2ZoA@k78G}tQuNg zf`tpe4$O*q@E9JquI#jBJkCMBnwyz7i;^(XdInU+?~{zC4yW0iK6 zIFewF&HeqSniZfI+FMV>*twtKxXI(oZAsll@~K;;<*q_4x|aZ@B_?9kn`LpkjP23j z;LJDPaSjd2=3?311ncT(iyHl+@v`1?RH3euD)z`eZ`#`hGw6y2k3VWl?*9pjo#M^% z%0jwMPoG!XyhO*gxD36z737_`$p1tH07~4}%bYl@rt*VRS^PeHD#`&j{+JiSc%INe z6>A64XvkYI!#e&%bGc@*_AjtqAgrHgAf~3z{+G;|q{JIgM5a&cH~Z)(k&c@|dlv55bp?75Jkx52H(;=?4d!>GI| zjgBb=FZ=W_`uX26bS9sCesl1RT0hL8O;;y)fwVL2{{KdIUZZ$F{vbGNS40_Es3F2EcB3O3VrA+%6xMb-w`d)WV$_t&4fw+&? z#L&NR4~;ATNn+T=#gHDh6gMP1`=s=5y*bks@Kdl9tzA7$j;sTPC(HAtg9=hi%gD+7 zDlIMj*{B!xiEs6C*8Sz|NXp5&-`ZrjgW1*Vprh*UMGhVXpkrxL!9bIz&MiSkMmFJ(!uRRu zf`|V{7&b!z;P$xC#Adt%yjV$z5JV~8_~=M5ezq;cF3f3Z-kQI7=Z|@kc>_wzG0C+* z+euefJhi26Mac0sP4~I9^)0jSb!qq#0_{;F|FW-y+dO0BZ%K~5(}g7jR><5Jjdexjk7U= zfgBnyQ=#+)zTeY^DBmRigFL;rb#At(%C0BCw7 zu+Hl69Co$N0=rD7t@*crdbI1xEv_#Xu^3}n?hH#$! z`S?x7qSmGob|^-|NVZQ2`>G5M1ja9PB?i6uVn$RYb_aZY8!vqD*EQY8q+#D_5G(<4 z`yQa-VU2MEoO_B|m*)xwTj#?O0bxfUMB8*UT`MVrNpS1ryPovojTDGef;r2};dk^e zz#jMrXVJT|5I?!Lwa|7jlM!T<69-S*x*2s!TVInGVU8gU#$q6MlS8p#B&dW*Qb06_ zIO|*V?0)u|SVuu#`+x@4mejkvxF~e7iK573hrKu+<40%L4e^nZ8DE$pDHt zozop;Z^ReY%1K~7Zzf8?JSGMB9Knv&RuKhbBm4#b6IFhKows7IXj%DL?{$Lym>!>l zNNB5q(pL-9pLYHUXB($r{YKDlQMAXqWjo&KTytm-*JmmKk`dY&+P2xhf?5$%t@921 z?f>9*$&r~Oyvr8%6G$bT9Vk!wgHAGGov(0j-n_mh^lN1NZ=3a_uW;#@qBq`u8^OOn z{w9);MHdwi5Qrt?{VbrY%&5yZetDPWViNg5K$(mIg#I2?UWANP(0xL;NYOb*reV2dbNZWm}2P=C5W|LsGf`_7XAdd+w>PEG3d%_ z)mxrVU^H?}18%M#GqSjxevD=DpRPvmOtToG-+$X4O7iF8nd)pkdqm+-{If7@ykfR- zLV2Lr-rW?j(=oOr4L6%*>u%QEFq}wAv%-?Yw>=VWswcI;ZvGJ9b0~ef1mYe=F0Wi?j~#grade*r zxE|1fP3MRr8IoA9wn}Ds-F#eWv?J}2`65LS@;fyW2f{4KDwTM-6;Id3PagH2IMkY7 z+}I|W?uMyQOUS@YGhWSAtp2oFQ{JDn*V$l`g>eWpPsqn*v<~_(Q~HX+FIG-;LJ-@nX|cr9%Bn+$6lNmF zw_fKPYGCIw6B4lc4x&8&R{Bx0ZwkoIU53DWD`chz(|mg$6tsxZbjFmPT|?)ne8Id{10q;$@`*umxvaGAqmtb z@6vxs?^YC3%Oy;ubwbuKS`oBNby|)yh?^beK#Mh*4>K#b$!O%ZdM;yexsXj_snKje zFZ3a4F-mgU$Bf}M|IAROs~m92%vE|suVq)XBR|K%UntgkRzW%vtum;#8MSi@b?zM| zQx&mZh4(BPF&)q4<)mT81Z9#`sv93HHB@|tf*@7E9h7oCq61Ww|0+=BQ>p2slp^Z4 z!zp&(QU19YCv_R8Qs&~X!#k?c*$76Tos;K3$nKAu-R&J>s>9DbdN|uM@#`c+COZQ@ z-V{z)ZKJL`#{5!X!t*b|M10rd>i*J`dDU!_cQM&J$@ z-M+ft&GJC9N)iV~SKyK%cW1%xR5~Ol&+_d3um<~0cCI>(M)FVU{I>Ytk)Xca4&`1g z8Dy!@s6VRzQM1b}dC^aXt(A zcxKVh61Kff66~EAh}yE z;;vC(Jr17bc&4s0#s(2mOxlJHPWx!5tZ(oN>uo$zE0v}5d8KY{ZLxG+iQI$$O0w2} zm{ytnRMA4g3hI6;bu{d@8ri$&g}S%pfIn&6VpORO``wF|;2wIb=-%`?%cUS578c?N zs@_&2=BLagDP=mmiD%ykO6@k2&Qa~cJYa0)yUwhoMg(QibS+sz`L@S`Ux#ToQulyQatlwtOt;D(x{~C4%+!S5XdUoQ=}BVFitwrK$%39Wm*jdz$#T7lz`<5 z;N2w0(*U9ARbz#~nL|!a#lJJr80F!mJ(_O4g=5Zq->Gy?{qVEBNp9pg#jmvo!M{^H zHj=T{ZT%%q6qS={O||u%#iU91y80@j&76Z)Mq7L3f_355aaT6~#xD~E^Uy1x$7cRn zv^RzU#_G}nyu~>P9BxlmY60g1Wgh$fws;_J8vgn3Q;KAk41dQNaH!2%uDR-T%A7Qc zXN$wL5$hac+#}S6zv$(1IK*~}RSf*i6guwB-+5TMpVD7!zlydaw(lT;qwSS^_cvVZ zj(PF&1IEW~pX5%lj}yv{*q2}|a2{a0ze5Uurx}$h)M1f;45ME}oT#=y@3-f)xv5pI zf|NtO0d}se!6h^vvAT2Lg@xFA$VXhbBB@MB3w1QRz5A1|pQhgGDEJMP@C9q9y_x#R z-4VT5YB2 z4L9gLsSq7pd zk_LErNZ6cOR7w6?2U?;R)x`FmXvHAj#4_mQN82sDI1MP(27Bb){=NC;ky+?PMzdw3`{`TOs=Cit+#Gr(gcjPyZj8^Z)$ne`MSL ze|}BH1$wK?@w{59!cO}KY*NkkqdXaO7Fg8r3{e{VF6YcEjc!w=;w|!I^c4%+fzoPw z2iLg9ylRn0@%%2by3bgX`@LkB+ND^_u9?WV?2R{#*9S8WWi}`CxbVGyZhbjWw-gE} zA$j>djcOjSK}Qj=V5O4FQZ3G0c2>zt5U(^g((GYpMb+GR;ZjO_ileF31S&H82ii7sG5clT?!> zdhgEUA?;z|uzqTu++y^>;p<7xEE`SgHG$0+*5N93+e0^IkT0Fer%0S-ogc+X)KWzE zFc*JGS}XDRJbaxAxMjjPPO%uIHtEPgQ0K*8>l@wr9-hUab^1pzq=-#!ER|cd5sKBa z$r9-CC|}-Pd|+@8@8djcINPd!u6>>Uyp8y1FiWdZ=r&`oEWO+jz6Uq%sKbL&zG8R9 zO1IRU)Xj^`Sg2ctxkCK#Nr$oHoWt$8UxtgM-_N`K*(u34<{3VuIFZ)i$;Rd7qVBL( z?#fQ!DT+^6lC>R0=z4tjgRdzG>J(6AP3BBz3&R1mw!nl5pZ60dopxh1FdOorR>t^q z*Eg9gGYE`610ZO3Ri2wQ3p@MlevEuHA-VB-U@ZPspQBYNb|kmjRblpe^!BDhmx*6% z6*0f|`^xExM6WN5S1iEnn&W_&hxfQ8MLn;+(ly3rjI^$^eX#?2=F`_{qBO77Ov|^> zs*hBpk7$vu3-{trw@^Jw{5DXO@rbIR{*a`kzO>sv1V>oBE17r!vx%wxok}Po{tmiKCsz1hAX?6;23R8CDribmUXP~6K8-I``txa| zKcR!R<72!KPKadxmbuZGF4#O;rX{wOz2UWY>G_#Qhv$1dSxE7$gQ`pEx9f2=Wy5;= zQ9V{1#p#8F$-G~2X(m{~>y(MMOSZq-^U>SgYfMfP@JdzH`S5nh)RS<~<17XZ(55Go zSAK1A&Sy3nN*?b37&FZl=Q2S>V9rq%SgVj@K2w~s%VE7NL8DgAdYDoLj6`HP{SyNs zTX53kmFkF@G$GQAT^FVJRCZx!Fu1`>?hTogs_?XlrMezxI?(;(2BA+G_x!lq14|qQ zvQ8y9M%-b~d1xpfc4v=yrAnL$b9xMlUZw-dHY_r<)D?!6PATfXSWuKk3WJ&IHTkQK zQ2t;`b)(IfBNyX>KMY^;Tk#8U2OM^vJA?+UIRzR7?sZ|gC~l)Sq%^2gXP#TVvPk7i z>0vPF=J#pcOw{*Kn%$nW1Zjy3aF?LIB>8PW5)+OyE+gf=8%ToLs36VUZ|I@i`-KnJ ztLOv5$1wB_6E3Un+uKmRF49}o-XX6T)v>N+dA}!I)tM>TDxzDlYMvhCAq;G(FEps? zb~L$1Co7xoyg9F`*>@GnSwt4ydL;TOT+RrhCjnx^dA?G=Am0hF)vR?rH$V>J^Lmg6 z_DR2e2C6x;gXtp8w2?gEW*le#-_eneu1>4K$L-zjjwEi>0H2kc)-o|zwj25$^k`e+ zJ}n(BGgwmN{ZrQ&pLwWK!f)P}=-S(Yc?DBkD(0WnGH zp%q@A^`N9h@tTa`ae1oW5*BMU(6d?WJlX?0YhWQ-$5sj!h{V2T41mW9Q%#@r`lx+J z6KJpj47?}`Vh)d3*rM`#4}6m$__a`IQV7=5Yc0h9Rq#3mB~$h%TGqG>TI(swiIgqc z_a`E4_*KkuaIpla<#><^hx94W1tE;`+s-BQsPP7T=>nq&6xOgBfkge)jfYFIAgi#p zfyY7EMw<+hIV1L)C8YP{%j9}&L7m-*(&f~$@U)8^*DYg?EkxDPP99McG`b9ILl;?) zH>>?_5WX=&;0wBXBm7%@u4&I3U>DkgF>awsN#cgo_n^57-Cw}vlsfmV9|YV@vk)p) z1tWs6RGqxCCm7|I^$N%fb07j&92mt_BDT#hjs3jbIV`B{=CJ(}LGFf$&Lsu}dq^^v zrR19+PruePy1vHZ1K)@_pNJXrFo^k6susbLTp!t6sS36Sgd}a5cTqqTQRyudZM4yc zuqL($gN#X!?3FgdUS3lJ%MI*?ef<6i_pQYh>TWCVG`#wW5@!vrngN)7vnEB217o4^ zej7v`is@C@dgHMl%}#g*W#vNuYB5f&&fsTZ&QS; z$S&%d^;xf~HzMDf65R^KUHX-@xuTt643xF8Y9nLM{I+bg_ZI(yLP02??H+8rDI!)+q`$NbF>{UQPyBBt0Ik zY9!C+>p91VD>IBA!2V|iK$|@B;0J?b3iy#5^ZvJ}!%=S;x=XUq$A4(qe#_BzBDLeew@H>l! zavNh-QS$1iNc4xqMPV3E7+g}tAH;PZz_^H=$i&meAmJtUpZzLB=+$s@9(?Ts~-q{+|cw}ajAt{)-y9s2ac^`TN6h0HeR9WhB}eB8W)_*t{dCCycN0eS{3QEaj{w9 zG%o!CXyORE!j<+0t><42Fsd>Rb&iL8F}O2H!~)mYb;Gab!EoBNrL(dN?_Q>SGFzi> zGI%Ie^rNWAD_2AuUs3h%0}2_mE`rv=p2|<@Ludy$NuJT(P(1e3*V>FcOFDnNx{Dp$ z)znqD+;%b-ewuB&J!S|vR~IF(oWHl&pwK;Fx>EYm_$?mGS}2*DsuI+}s4pmTH)L@? z2;U2QL}@($ewTDvjydwLwOQj^Y;|KHr=U;-)>I>xl#W0lG5S26i!V0MB(;84?UXsR z13GIo$dL9QO=$ksaZyxMkRy?^!n7GLMa3#Z8^V!4-N7H|QO~tub0M#f-@vhf-{~lQ zJ?!6ALRnIsqdO+451p>HMti>@V;v{eF`92Z4Gn%I8ci9UF*!~FSfWfIf5AcUXMsEiAw(K@P)#%m(#4nEo&H<4 zClP*mzl`-B90WU>cn%IP<|FSZLM$jbbuJf@NutUFuj%EI2^4H@HGEzdL93jE^H_Fw z3640jO(W#LY~=e5-*$=aPN|yg&@k`UAE!Vs-s!07S951Kf39wItQ1(k&Ht*w>mVAm z0B$nKDM{*;;bIbX(5xPn#d5n?0~s{B=w1DW?*frOc5>$d#t0CRdBL#Ou!KJdovBDg zV;^e~cVcfx;0J(D0Y4%X6cRrqU-kZIzc(+0{&cl6s3{NS;*b?a4bY8-Y~{sx$$+9t zKg6k#nejCwZl5#pbspU?1gg zaWSG z@owydcSZ0`CaVNyHyD$=$Fun5B=`uv05p%7L=z0cjydYlVt4^Cx-tFscD{Tm61N-^{PSI5;z9b94p%5smWK#bEpw^cOJZ~gR{*5eZ(!XdK9nXa} zS~?>Z^!i@C)C>HZ9Vnd+!`X3uBP(ww0!vs?-Hg#j$c)a!SwzYgq^ohR_F#SSd24YK zs4-2Jr>qZE(glV}=0rOam#vUE*I|&gR>Y)jqbjm+^_*|dH)mLVdSq(|5PVfa8QDWS zjnS-!05bu}`L9YtV;S6LkWB<%3-}MeJx%KtBI}nK% zU*FQJT>@~BaO{QL5myt1iL`fT$e4Vd)=0l5?Sm?(ST%uLJCGWS=9}Z(6_vi(sr0SVMxgweUXpL|#MXHIG8) zCiH%IL7i7B=NzOY`r)oEFsqqH8>nr9%}oi-Qamg|91=SpDEnz(nw*nt))-34@c^*E z!XN~f2(`s#t-X9XjC)iY@>%+JV1V7093}?;Dcx)6kpL<#$Dr@WZ)&fb1rx{PMYfvE z1qgNg5t5E_ihP|8Vw{o9QY$y-HPZDy<182OIbnE5D5e)+#vUuVe*+!9{Y(kQdii-i z{*K5}{X0(w{EKhl>>r!n*}N=`dI~n2``4}$Rie%*5gfJ|A0?})^D*ixkzk4f#H=Fz zP#JK#1Q{4h0|U!)S#s^UdDz(>1de+)(GzFUL%t2>FL9!5=6A9Y9W8zUg--6wXz))k zw18ZG`|%~~dCYBWx^?K(sVse!*73hmd;K^uc_kWTL#IQeY$v3L)_HBvkXRtcFn9x< zlO^GIH0{Af$Kvbs1G6Cv6B4|xA>Pjq3fV&K4PMiLgN8-kWV7vtU$*#9wRX>Y+o5Ox zsh@bdzcgY~g4jk(L27jorQ8P^5~yeTD!E7fDh!Nz6gm$r!S4E8W-FAFu&2xpZ0T-h zcivRPs+&IW?2izy6$IZhh2}!RoQWQxsPDQ2#`knBVFVtAV{@G$gL|Wh(qgSVIb+Ozp>)beVf8- zf8!UERG&_i0En$Box2Z;5Sdwt2CAqB(9vg#Rr#FhV{}xPX;YQyrG54{4xzVJ$WQ$3 zh|Uh#tE4rq6-A4xV>{mClSF^U7X<{%M(^{U2e}w@ zv*B!vja0F1Pce#01*pM4l0c}@rv9aNF7A$0iS`L4zo_$w`d}o|Pbx$(+p1#|q;sH# zP-ihi# zdY8avWp0yE-%@n-vZ@G!(aauJ^M2;za4EgIIQAc+o8*7J$X8Ni;tC6+(OLNT_UYwb{HKaMrUm$+DI}a(Sl>US7Gn+KyTOruxlHH4+rA79ath`FCvrBcbi^ElZ z2g*7BcWP5k?T@RlpLGLfD>~Ip^QEQ-;ZrG1wRiwYa>HPYvCqo0m4DfdM8r4r+ z(0Q=vdIbxH-_x0flmC)HM({Cg{eXws_}$Z8K`a7C6d8xC#a+AIGsXS(#42rWC2V}a zP*xYrBM89lB&W*&+|H*4JRicp{vHxY-~!nUsr$=EXX~ElXa&!dtJD}ZnfarxP|8a4FYCscslV97I`Pm^zEd0a9 z4PDdgmmolA`<8VBc$t1fZgTa1>|r3TC9V+H5}mC7xRyNq<6826oK)r@PAbuer%|CS5*6k6x9k4T#MmOIvzpX?*4^N5qCyq7HW*x zl#|MJa`R~BMy3|3jkAUBFOshvuovZVPI&2Th-aG7G z&Dfx2$bMlS?=$a;*wqK&megc0^}m;1gZl`r;El+E7UBj#?L$Z zSTjRYVJn)c*GUC*1-dAB9EV+q01c4CwJkM~@m@-CCRTJ0aMy4=5JI=&w*S$-RvnBU zOK*|nCo;f4wKhGj(~tqAbc@-nLwoGHa*fH-TUWyzjmSPfEeL9UBD}HNMMa-5oXD73 z5Ddc(p$*EE6}B!FODvf{zFYwCi_hoLbys@CYp3cFUZ66h81wX-f!iF~v;HQNM_Rn^ zdXty3(6L-Cp*rL>Z@uqrmd`SSWb2?PiAJA|;$`u6q3Xh>a)B-0M&EX;E7X$D0p2mE zdupQ93a%sVz5R9``_L}VZJYgbvulupqky*0b5IR-zq5;S&hjQX1A5n8JsuaDZ7A*< z92CboA}J~WxukYt(Wr(43mU!vwi;T#(Siz?< zGKBD%k}u6FvmfQK#*b49C{74X-QjrWtIJz^Z#V(q11GfZzla6E>9@*4+FYTnRpS=N zH)8g(7v0yZ&Ihg-s3R(e)^hl4Y1^1WFQ~@(_aDb z=d&IVP8M{u3LAf`nARrF1A4z3189UsykTgktdH||LB5SKrmL-#e$UzWs<%EjW+w5w zR`Y^cw6fj^3Y1U8=dn}btw)?Onca)!no1d{>I)2m*Ku3MQ&kSWSscFtY-Ub`uXdK- zgGtO16azO+uO_TjohBX%KS~2En1B#oWarSBz~HZ^))b1@R>@*eq->UW+uo9{%j8~Q ziSm2VLje0$f?(go0QL>|*|jSJqTsEn^MOae#^Dd(bQG~Y2oyw9z-}z*&-Qn#-4!}* zQh)=S0|LpZBhU+H(fms-9Ku=HF2Oqb^xzoJ5wSVU9{-Ghi<~6iP}3@x5HxogI1boe z8yFZf2Bisw*_WcKHwLxdthe=hGN4KSJso*n_{6{3&g4|AHS-CsX5JrI@G2$Q>ZuZ4 zBU9_Wrl5cSCFdajN65J3=L0_@?{fppADz}*uIb(jPJ?^Y!M4IwI7v|l@eG37eY-M4 z8XGOVcexctGn~Z%C?Y4djW+i=Fo8${Pa@#-_4s^} zEm2v-jgyY8H9yWfT457c{=+zoN$Cy1H>3!4N96c@5H{P0l;5cbRTtTTvtMpU2tkg8 z>oyE>x+cR^%=&M?WMJBCE$ z)Q@m3r;jGU*(z-4u7b**z*USj53pvxQY^gVl9C5b{3ejm7*rI+y!n#erOQUEC?XuK z70?%q`oT*JR<38A+Q_)TXQ@&--$D^T0ffYU$u_PTKyQ7U`c4YJH7Gm!6hJGKdf8{7*&;#u6{o}5 zeB)71pR4TBlH;X@Uw|$RcODP0^w}BDI>nOB+)DzIj?6zvC$t}B*6X@tveG#s+`1wp zfA-~67MTd|;Mp%>g{ZR0emkeJvGKcBK|)6>?zlf(=zF9iZvW;FszTvKr`$^6;b;de zgqYv#0*E41_y2?WDWklY29-q>FLV~H2Xt;S?{9v;7zk6FdP3$_U?s!!O|TM>B@gY} zbzgrxryA-$?>k#1;iOBNJia)7+`sWU|(53NM0+En?Y~Ae@pH-cqNEm3QMe-;TLjUgP(tYYYZ9RCV1+LNMCvcx2S_ z-gMTef}N#!d>2F@5u~FS84Z;^suQ9tCdt#Kk(Tzy`6M&Znyx zfLhmx=Mgdpvt$$Zx~>8tV5I>VD68lJuy7rL%!LX!+Yo}$1udDo>F+TBAa%aPwIXkBU{Vz)~G0Obv+e3rL(mBKN02s98&lUrN# z@?)rJ{zL*9Gw-+iQD(pKoKHseCnBSG3{Y5D$A{J7ySKSd09Ak0zx?fx%28H?{MaF2 z2E)5tF&zNVmr~D^3Efhd-h~eowVumU7He;^=ib9^SUg=^k=G}QZ9R6@8>%vc=!pQj zMb!zJ6EJ`Cx*X-Gk9tQ#S6Zjo{&XST>?kRhLNac0MGBl?&_5^WPssl96Xm|#XN0>u}hUK~iY>Cx$-w7)MqTIAiQSdfprTPfH*SJI&P#GoZV z1OB^1qrV-;>~L)Zg*F$pyb`@Qcix2bwbgzm+&$^|IC5V`FZY?pwf~B!QbOZe8SqW% zJy^DW?;PN^<#93T#rlmuUos-B2SFu49nCARS4H_hi@%M51 zEp#98hEZKEe_q2q16^HR&q!DGu;_??8tvYEfN!?P^5O?kyxa@M5Qe{vK7C4t>F*8bPVi$x#|_9!4Ix3HkjRWAS8mxJ)|<;y&dLO{ z=NrCr`RWe1o+M9`+tG^lh`wQ9uIweX_zo}>ZoG=6&s82Y8f;!BGJ!pQQhGgKFER!h z&#K_lt51k_<2wynnc46_W6`2S=z>yAd075L@8^UGd*MpOM1=HIbQcLlCg#&fI7%@D z8FBp}P51>k7skHaDXTE_9rPK@6M!CeoL8#6LvDJEA zpv8{0`|2O9^tnJIxzF;y*n6v}s=9|?SYQJi5CJI#B&ADI1?leY?(R^!mF^IfkZv|0 z-3S6w(k&rKclVjw=lQ?yIp@3n#yJ;fjD5Koo4M9pbItinxWi0TWlT_0+h8lb8J+T) zpUIu;N-h_#(_BLG5E)rjkz5Jbacu}S4aa8>jVdTSS$-9-_71GZk zXSW@CMWq5|lkPaZrxG6mK+(?Rv%T?3$5fmHA~-^PNFZSOlUx{&4PN2IX*0>h0~G8^ zA6h|FvTC6sMGnh7*i)nJPRD)D7Tx0Lj{|G)7+8a)IJxX>7UYLR7eZB2Tdf(R?wx{) z0^RnKQ1{rV8ikl*HE`$b8tErWGz#+N5>i^7Du9lE3;+o8&1EG%fYGQ8KgjXct4|k9 zwqKBN7(UlRhzmiSp(F1|F8qMbK0T;_ViX{87MK_+-RmCqxg;Ks63g~5@UqCbQdpdU zb>^k}abQ!R_32w_L)3XU+EW{S9d|MLxBenmB`=ZXFPMWM$C**V?TBxeusSeS5`NSU zzaRaRiBgwBU{ybxX7N5;Z!q>aIRvK{3daqRVdSI$>xH&!Ue$pL-MJfMMdEf10{-e$ zHL#E4fG4Vos;DSv8XBlG!HU)7Td?A*{a6ru-B~*si$?n1o9BkjN(-G16!@yv$WCu;S0mE)D z1$Q+%Sd0F^y>( ztpmT1c62Nos?yJ7p((iZQul!IO5yDtzEMI^M#JT^RS z@1Y227iR!+mLsm9pazg#(D~inz=2yH?~50^^9>0wkB*!ee(T4&@;PgBG}wK!0H5FQ z9yS^88Gvwa#iF=Eor55o%Hw*ex$>k&MIqe;RrdQho@?8A;;Hve(Sq8znp|RO$4WGH zBv+N1RRnYBBGS<9<(|%PI%HnQU0x4)^=D*Y!Q0*vWUcH^nnxI-4^Tszgy|5v@1oOO z=v){|Y6$;9fcD;~7^mKMT`q|yNkU6c_{0}Gn1)}`nq|G4*_azxzk3kzN|(E|!?uc< z>?r~(CH66d8?O+M8aetc-u?0astMj(XDko1X^j=YRrg`F=HFeA22vz#(#TKs{kCV` z6NUM+^nSnX*&sVyEGcN%d4Rx*tNAWy=$&uYWnzLKK~a_{PoZQteL&4)b4}rxbQwk@yPgz)D#ldOw)tsbw_g=0&OR2`-InRuF1}OQQI(uhoc#Htuwq zSvXE$4*6}`6dTeZ4OAm;S3=?GRoj`R$%R+v{lt}W)!NU#2PKOeUls-)lmJdz{6*%7 z6yzRo0FvuxZ2{+LeBbVIeY3D>A+;(C#V7BszyCSSF=xu-@{0cGrq!-q0fogk*&%!o zP|%m0KH~Ze{;-%4>B?^-Xfybxu>+#BWXz~b@AvV78Jv=})yGaQRudGI&vs@8y^K#? z!Jgba9V1du8s~s1U@(Q1jPGJ8D1QweMUd#dFV@oUsqV;23sKGmJt6AX2EbbM(v{egz1f})afjt@C6HljB4KZl(1<8yLLUd z0Xe86pDr#bUWY?(D7NfU1V*GOIx9qtvYx#q7|qs`BJ*&c7%2T%SfWuLkyt|Pz!Dz{ zrn5vZw_>p>edBKJ+<<_*?8r)Ygw+(w+p^dC7j*E=XBfD*P9j0f!j)=;c&kvo>UEf= z_K^772;It2;gI9F9m?m|GJR}RxYLPCID15)4^7wPb!UX6Bim6tDQ71iB4V4~Z zF!>u#8*aqHO1W*CI3jce12q`}Hh$Ll)iXdCDB)>^-n~p=!kg9=-!S7>fUW?h!OeIX9SZ5 zx#=osoI?RSG5TNAVgtw%Ppp+ANbQr}q+t2IS~&gO|Km^ykYBbOwH$g}YF_l=L% z1!V=ao3;C2mp-00^dT3UCU(*IS-kMU_EWp^wQWk1?J%+mWjaA^LXt5xOxb~tl<#c^ zO!Zq5#pg(%g-Jz2Am(d6mH#Md9#k&v@@Gw&#?+DSB@-ZQYP zs51C|GH2`dS*mD!cT7rDZOUAnUwEk~m)GV`efAt@-c=qF+A%6%GU)I}bE4KALJ)lF zxl4OQfB-sSpkxeR5$)$OJqvS zRAhAcq z@|TarzaweVFIR`Jxe_=~y|5mqv;Il$abDA(!m6_WtL5^1Zf=Z-BPYfKk(fi$!;l;x z`BHGd#6L*Bpf>pnx20!hyfne`N6SCb8(HF{l;_ zf^@e0-#sy70Z6EkzvT%16rW+e5GR70Yy$tH7{5vP#X^qPxK%$4eJ&{YKFFp}SE!z$ zzcV>n+Qw-IIwh9swInDUhDgTq)x~~L-bIK`?(<4Z4C}pMMF@-b%Wu=lY_aE!(yN** z6_{FMvDT~3*4jV(E?P|zfn1jX0`Jxr)1TG!_?no$%&9nmwI?&+NxV&F6{_h^$_npB z9}zo5bld6_)2?2JmQ6d6FHzHsBL%&iV9}Ykt@6De@lRnp4wgfhaxd3O`hia`nTOFc z5~WkO@pJR|>v`AHv^J-L-)yS`8DRM0Nk5+W*a;Hns7#l+r z!JkXQlaK{EOkKW2&vfnEf18t0d32Al^((<*vv+2-?RArl%C(Q-6zw)BBEWV`Y7cw| zM+1PI+9Y1%O>e&3Crhw7j?O6ZzC0Q)Qlb43FLoc$3}^>AU}77};M*>&i2Mai&HUf~ z!#f=OKI^jR>ne;Qj~qr{q3e!rpDfV~*WdH0vt7A>I-|!kbW30SDPI)I^lcN*$R}*7 z%_W%V|KwJIGi}MIz=Sicas4)nC@+F&wRCtcA*vx@!uLn7Z!nd<`yI}G%WDg3gw?G) zeY+z2koaPrtk1EoAt+H9q*>MKf@dgoMGAu@$ru+=7u$(qU)O%3*|?PPf3-u}n$7ZT zud${oMfAS>jgpq*tv+#F^)UMa?DK4|g~$NT=NM|!a0dENg!OW+OV1d?x>s(ajto>lh(uM}9t-+IM zjHP%qupy=&m7<0P0=(_y#g6Mwt`22Q7=$G6XA07lGU|*_eX3qvQi~38F=bTny<^2E zT;)jAZE#P&YT=!zm71AD|4H@s<#X@5oi4NhpOXx_sc*Xf$pR1`&(p8*?>C~ypVy(v zb{NtT61b^l%_=MPe{&CqWNP^I+nf^aUL5Mox==P(t^uhw^hr@*5>9Ds@Z)AXkhB1^?Pm*T?$wX|5f1`au(uRaQmO$xF8fPQrk0^wIBG}t=_NUjSCFw zrIO4#wVZuyLq2zx>s!q1W^j&b_wQVhVh)JvPl(t=z{rzBiMk`{U9#*>W;;lc|*Z*Z5%kn$*~$^26Q2;-bV_w{r`grgRFLbN%I# zQ{{Ym6hlgV)Lx0fpym+S!7t94fj6BChCtCY(5Od25)iW8x$%X63QgA!(1y!-(%MqX zlLzb9Ix3{glt>7byXSj&h&XE0buf2%qC@{nUSyk1TI02)soS1HsidltX}%~q_RX$% z^oXN^Z+jXJMu`@scTueuMlJao_#7F;hS4Gu{p`4!VGuG7bi{J(=^j$Afv$DH(|om_ zUj-RRWd>&?`-R5wQZ0_0Or1_zD-c_YP>$%xyfNQU?UCuw3PR9HT_gJOZo((rwjttP%=6&JptN}IvG_LsNq{_@f4IvacTo>$`wAK?x=$Tc2z5RMm&qVD$w8!| za3+WJdWN4&6+(uhZHu4Xw`k~4wWIOa9AwYh|LARnWGX|wjfCpe0&4KoRYI-9lI==6 zK0rZ>?v%`$)oy4T?oEr}F9P-50$whTvf{RDM;;1Zi5DHm-{NmBt4_ZHUs28sYPLYb zQ3vQebS^z-fKMPwv2bj5%)-ZL{~UWyev15ABhM!7rw>2U^TyvHJwUudLe#m!j+JHn?Wuj!iT z?cZR1|3nJhSLGy}fQ+Dt3&(r8*^f>M6{e#m=}X)#l`zDxX`P_ue2jQ~;{)QiqR_>s zI(oU~<-NBMI*&!Zhdn6NqQsU)AI**O`TC)hs0$CGCXK(0et0F4ZaVR*6CX~0A-Yx} zzD2I5k_@=t_Y=(`DV>b1l$i``?^(U>cRvbshl!VT0z+3&|5Ho^4QS~z$vEt3V5L%= zD(8>DOg8%-`BcQZkttRuR<~rSXA_`j>TdZ(Ao8ss?e81i9#`{e(xXuXA#;RSm6H1Z z*(xzPC(*L^{n#)TXy-8^blbtpKh-#L>18+*vSh;P**CpN-_pCRB*>*OZ)~4n0n&OM zKq=jA6ocOXT4>)Ofp`I3?^jg~aoVn#QP#n>+~e0NWq|`oy@C&f!W))NEKuw5+D9X8QR1Mu(~>_|YV}3n3?vXT z7Xb$VN-_{f=718Xfi8Tj1~?c$zMP@h;B0nGa$`FD`H-15^@pq~-1z&Cz3CS=0cAs1 z{qeNbRZ~^&9B@(u=1HUbz9~~@^RLe(iA(3NDe+Q*Yqb=sD6zNP8pfk?F~5D^rg&~TErx+1VLVC-m?Ue+ zWt>&M?|kjzlbDm4ko#S_WfcrYhSl5yp=aiYLM;XE)I?4d`_)l$g5&-i6Dg+!yQs3Z zKc~hF26Ao-hQ2%@zb7~^SsOOHj)I-|(lE95%3LpFFERwiJXgSZ{`y5MQx>iawK8aR zIu9^=r)vgL4uNaMlX7XOsZ$AXHTB564}?tUF}lux-zFDu0Uu>_)HQ-sDSmfEz|TJL ztf1VyKYTb&(U8MfH)D^}BM^|ftD zG5cUYDVJ#Yym_$yleDr>BdXs?4I4i=W8$<{wj&Bz28sL0B_zor9|WlBVLB?QkGQ9` zW4#hSsG{@nT2?1_^0Yg1zLK&%SW=~=hRI*Axkm~z!C9_axli2UkF*{HKWm~<$gnk> zsJ2jG(4ViH`%$;(D|3Cen^;5= zi+>D7;DydhF@mm?hntdbSI|@LC$`#{BoJ)2TciVhizJAcHJ@XI%@;s_#&_YYQ(X>- zN*j*&0YYjM@C#^Z2?VTq4g-1=?$9y4u?#%*%|~}?2orV0ukGW^A5wB~%K9{BTJ4IV zJThHTL?)&nhdm6$M~8fu68et3gos86p{a70j2UgCdud1N!y+q)1h z4ZErE!=8J*NL@>t97uiWH>hc@`6utuUG0AOL)2c@hm|^wDRyN&k|0JFcE@|5@4{$i z<5%^_`8K65g7a|+|8Q%<`bH}2`qQ~*RL2iY6W(bhu)HqDKLxBj{ap%kmDlgWvpoF| z3Dd$_@b+AU^l8`(FW z)d2b~j+dO8jjr@|iy6&)X75v}KVX4?S=4Z_21;RI5(v{W(uZQVMA6wNk5k0{f}C{_ zxNQcQzkP!Bg~g)(M1fymaMh6J)T)fvpa`OASMZp7gUnk%pDM=MODh_H)U&+err5EQ z`b?+4kHg5zb~*)WD|;7b>r$r?7us@Tnu|sF?`9v4cJir>M!zYe5}SRolO1A<0sRvw z)8XMa%UG|`>(xSg<3;H3$UCfa5&g!V!ts;;bugaI8H&w|R9lO;rieBl(6`zDIw2}I z1HOJXOeq7o7$A-pmSsB=e{)v6cf|!vj3x!;k?gPI_))<;WrNRCW=`hdyj?LPrv&zk zoTu8^?>wSohHxZp5a(2PXsE;R#b0N2r~i462OS9XqgzcK8pO<0(1Z$H>=BB5@LQ^& ze_OFNcJj!iM8$)B{H$=RTv>h$6y6vb?97fnEbZiISD0wD3gq&uoNx}0B7uEDf-pWL z?%va3kKO&g6MtnffcPy}4TMBgojGxCa53ev7hwW=R8!IYO6F*0Wc;P32I_&a-4 zILOl677e}QF%xBlmU0Z75}9!R7(arA&#McU+_Bi{Y`X_-{P2y%Qp-<|=kZWYnJ+U{ ztgR%aqJV9oAph$OwcQ;mG~v~Xeb>9pvA)^o7 zu@yQ*?R1w(DI0RS5%*crb7#8J^|o=C65G*AAwD6a)la9$Cv2~s4*4Yzw>wA3~ z7&!SFL1g)=av^7t|X%guYG1apVIo4(&A+>G2jpS>O;*O*j zS_wRF`3k2D>&u>w)*`q$Xnw25WU}>HtUM2M^&*k%`QWekuQ!Bd zolb4oDN>#S2zN!V4X@J7;SZLwq-Kdl^BSux@E|Nzm+oaJv1-Tz8H4kl z@mC>70$og1CFW8`4Z$rodUe@Yv!x?7FRF)39iuS>1SXo%-=vtZr$L9&XsAJ)$wGq* z?ck>#M)t>8{P`q*{RAYo_z}z|6dk?v&YfU0yl7c%H^;4AYn!SxRC*5w&NKer5I`B< zH6N4To_``+Xw9>`|1925Kp?lt8Aaee(rK@aZ6y}W#c`MF`~JSfZBw@?PLZ5mApTfn zrje?pl)y>`xYS5;Vz2>C44{2Z~t9K!icz0$cF zDON?(vWz#3LbJ567ZaoMs-l?Sm*Z2EgKYmnF>>o!77?7)OigkaocZ7e?VQQ+A0ZW@XW-ZI@{lOf+ zr^*g#zH|u@KB9Yx*V_*1D_lAY6JEPD%LfXdaGHF*ZXsi-KGE=1#G$(^o zE0i2~3>AIj$n!$-39n_xGa++pLEciH8}|#mj&%)f*^!tDVN51$SsFjuvd!w%mbH;I z`Tp6~EJ;k1Ox;MS@UQMU(dpk;YugIR_}&IA@h{iHkSFbeIUMfGu{C2S?rsxuSiW^c zd@eWeJ`9j!WR63@fN*^L+!!lL)%MXw zGtrFLM*aPw&nvy$;YLb@IZ`#kNIMDnkxUvNi`s9m9Dfxp>DL#0iht>#Z$d?RN($|Y z4kjy{a!$oj#BmI1C!kaG2aVrZzi3ULPHNi98`3&CIgOX;yzErM_ck)_q2K96j$pxP z!k+d)0egclE75ztIQ3kb5JxGeqadcaMkmp5K3jpZAAl7J^qnf)ttSa>zwe4xn~=V& zmDoK#Gv%l&c~~3HsYX=mc$+faS@V&+O+7&EtUAvIO=lD(fi%i`bboFf%Uyenb+I*5 zKl3;tzlWe~`f;tH{^F3qBnm98mFwPO*5xMhR8{cVbKgXm?@A%MZ-IN}D;d8}Rdnr? zk=%Y;zrxehm@PQ#jw{rzI$Q_E?TVH--vF?;52;Vv0TtVDt-4vV3mp*U3Yt<>k4eb^wvDuCuQfP_*3B=oPv1hn%aRKP1_w>kc;kZpq} zy#LGRfP&fs9$+46;Sc(!*7mP^=KuXEXxjb%`7$*}v;%9ZF0nTNX>|Xo!$lA$pM}p2 z?(EHJGO(-l{;SZ&8~F68%A()8kVUUWTuP%nwV>K;P&njhjct3KML(bTr9;}OC1H5i z8dp=Z<0iUZi|@D6^&fHRN9#kIC5x0i=^srqA|?WfhXJ3gZoz93$(Y=V#g3AFgJ(|} zO9SBs*{rJNy03wv^V1ZY!r0e`I+Zv?y++=-e@%e4H;`}M{f&BdyJ{f-JVe@%d4 z&lmF?R?&9nIZk>VLa6`Z%6Se^=d2bHWWmJa#CVPTSwLXrn0yo-Hmn7*hGb8_aG)6p z6zuL5iZ*o1C_S$NX->10{5@ZCJ&Uqc8@lYw6ELr1M&qgp2O4W)Us^n}Rwr{YP_VPiMErXz;aN^!eEyd# zCq;h=Ir?PY^2*Uf zf)C=*H_Ut>Ek|^<1`!x%Ai={j9oC70yNy9M>jQ|OE6<5Z!;~jiAl4+f86ndYk{#;L z2ss;(Aj@MiMx*)&l-7f3Tse(y+bG+CXr-9!wszw}f3p+iz<3&8mI{f?a=&Qm#@hbm z;zz03dBFU$M#$}V^NoDF@(uv7IOcM|x~v1KweF)lnGHH8a;XRM22YE-Ve!kuv#25< zloFq@uB>>TJo!mgUVrN)(ag6h@XSG#W>;3)kt}+0CaVemShZniZRQ zE53)Rg9(fuN@q!z5s@^I=)d(0J!-Ix8NLMMPvYR1#2J)|5xUYn!T zz?+KS(N=8O5%~TWT7cbHew0y1H}X4-#X1Kvc&%?%3XeO*i>w#-Mpfp*Mg&iAana|5 z!KD#26|^KT=8|t&7Gd622AL{P7;gB^yqZD1o&ro`>H3baAF-F-`Vmx2^=`fei9xJS*=qQ`GIJsV{eLC)n)cVqIsxc6D~% z7drAuMirK$9e_GcOzN%00G{NKPwr!=i?@%rMq%r!Q^AhOOLHM)S2}ImwkKg(18-he z6TjoBG?xIeQaj%qk;KWRq4na1xVX6R_ROzd=k_Lrw^yeedI+B%PXl;)tX!`t(l4VJA|>0`~@?? zCAv2pw*y{5p@OhGbHZ5PV;qO>EHtZtVU zTN^(ouhW=RHv7;AyVPNl193zg@R)GtlyE+R8bBC9Xx_qy}#ozi*x7T$`R6Tz@EmLmP()*0R@^hhhjQ$ zaZp>MIE;62gTq6dz)REQK*e-b9R8{bf$=`u$I&Mg#}AS(DV)O$+~}v>ZXUKAOdwXb zNuoQ1I`z705(g`s_fuLjB;Eix!FuO>Uk~O)>+{vJW|@jf&n6%43@f|fQYEZiH&sXV z&LHm{2uNu%%pStO8zRM?bka0f^sSF@Li@9V5XVOO(L@3mcLJlLfCug?@a7WRiH=nY zfUMJtzwBWLR?Pq@3{DqZkFWYay&`%av6R zQ-duWAycXl9SCF?iLtt|%sOmpQWXvwC)kUuwuD;?^epsQrPQ#3(w*%k0csg1shbq-V z7^Ci;M#+6ug3`Q38xbY|!Y$DszglYfnf(1drIG-@4Yp1BMB9la^Qc=A*H9UL?!JMM zWafzCr37{RhBtm*`0eSgZx#5h$<8k@r?X%OQ=3!kz#qi z)<-n7N@9(m62o3Vz>!7m*b4cY%}cQ+hi-7`;cZZs3o03K38HxWGNh_(UlE49@BSA`Bjx|X<%$qmwx=xWlddUKQ;SR zT8kr{fTyA!y*IB=5Ji}+=+&`$fo@M4$)UqYG^RX|v1z~V$juB}$yK+QCa9!63GKv5cjGGS{ zb?QL<8C5?x9E+-$EMy6uHdX(!xWR2f)3Fd%UZJ(x1xJmsw06oDGV$4oOHsBs&+Czj+hWfGVzh^NtIZD8v)}Vz$;LtNiC>B&I9Pe8?-Lf^91jJZEIRl; zoalO0kbmf0g}jr#Ci9aKYaX}Ophn1=+f(s+nVl+DAAaU%UDd0HFGs3iIeMN(MboPpu|i&*%-Lecx_z&=_4A^eWXu9#>;@Zx6%9w|y0OV!{;ZuK`bNm`JUD z3KHg?;r;Woj0l^je{!?EZnxdXA($n6B5@~ zl@=rs2y|lgdHWcYefn-{U&U}bd)?5t?aY=~HG3y79q@Ns*CJi)k-k~$=QrFX^Kijf z@3$))TXDdC>3P&gOYh~L*~Y#F>KJo9j{kfCd3Cwya3O0TYb^_Clp96`Le|G}QCtrs zXq@VPA@O^{)cXb>j#3g*7mQR51^O&l5ixW1&?QeT@24@_sK?#cWG>$q(+t(MsbozO zJuq8%Kn1I*$fw!DN-+{#c*ZzSP|6zirbrSA)oIH)tDH`A%;Hk~(@ll+i*F6Xg;vd< z>q#{4QAEt1C`!H5e+5&~cty6hS|F)qwKv~jZq0fU3&NItu4zzb@=7&Y!*R%s0o22f z47j1csT|ow2yC}k4G4d*@Xi9r?q+OvC6rECyKX0-XO__tyAl6|eS1U$>w2ZrgFo*; z>R99>p)0{Va_5&!IV($KTyl7ls%>wVU5I!(X8+lFhD84I<8z#soWb8wx8`B~idGx< zAaGoe$n0+X!k`vAFiSYhjVi>k|InJJ44xR&+rweoRF{9K{L&KEB1l&`N9cYV80?}1 z%O8`DXcGY{_3;A%7V>|9ZY;O`Ukf+F?e!Q0C%ZI(M>RH6boBHyl>!tL0e^<4Qlis1 zt&C~1d)zi&0v`t*QQ)?!P;?Jq0*i`e)xa%McnQBnc2Qh~C}E?&HSE}`9?mBVVAbGW z(yt|F)}MoCssXmr@&mkWYDRc*+cS)k;{d-d%j#bk+A37ePBBy)U!Ssg`=R zs8>?)4z|QSQT!>^H5Dc5ZnjwhhRDt9&qZvU!r$+?P>{{%j^;A^%hM+pR1w5ce&0=} z1cOJ`+FfjG8)N$k+;y7~tgSz1gCHpkYdVu7^0RcnSSdbNYo=e|3Q)uka4~9FEsE(X zQsw=dvoBb*Fc=^04GE6cZmp>(Vw10r;hwxEW+k32K5xs{7us_&K6HpB+Ly3u{Lsgu z@w6vs_ZB|SC*v-+;Oo?luv1c6A(p9APi%w$xiWqr1}M?K&n3yGj~=ZXWMTr{i@(@zW5pmu?w3n z|Hmz+%}>L)618yLKwpJjY0i~j=0}e!k@qKF?rT|fI>MR=6AD7ya(Wxsg% zzd_lp{AO@VgVSHX#yEL}MQSH!8VgmoAc7YgpvnD$hBB&|PM!}4i zdabSlC{?>A>sSxPW!fkLfYRoKm_9uD2DI=Husr`82b7D9s8S%GcXR2(Tes{B0v>X# z#`5#J%PvV%AN-Z@$NzsM{11SSKM7Hz10*E(GLStDPzCTX_XPHLc~r2TG{6zQf4l+y zb5Qd4$p1&egD&pRh9GakDR+Of1~V>0WBr}20!a{%kr3V}3gHPsRuvJQ3l9(&!q0tK zGMcU$N=gEIew3p_dws%mvxOkklysCrkI*z;Jr^WLi$#L8dNLNt54zG0JRjp2>$~?M z-6#fSRa*vf@%O52rv#AFF$u+Ofvz+ZDgiVaa~e7X1ndX!PXVsKzuOhm`u2n7nBgjI zN7n#^n*0GG{IleWhz*k`6DqsMwjqkVdH(TZY8C_{_yGR-EdKy;a+9j?l+0KzC@vF% z%YmEd{{RaA_>Z9pw)6NvYVJfztzH}@7#f=gKK|#&upN02pqd3SS(ARDT$tj%k7WmB z6%qgb*aJj)+6M^RCphC*Se5x5y$XS0sc6#w{Fq?-CWPEDoj*|fo??>o$)(f_HVz@Q zzd!Z>`YQdw|LMW4Kb~&(sJ2UwiHfQzv*UaSA5bd|7>!Lff-RQu;6pMn&Xf297=tQB zZZp#ley`{%=i#RXB0o}c($qwvysuJ8c>Ix5pwsH@VLe`m6A~QUYat~g zlM@*kDZ{S;A}8p0c+vorBf(`enOm$@qAV}}DE*aFAgKP6Zo9v`rk2sg*Q?vs)qBVN)GF%6?7JVL#(6C*QvObWW?&Vez{n(wC#m%-NCNnROOK zn})K}r*EX&hu-b8@_X%cm@FpRUAmxfi{8j>%(I85O+@5w@YEDGUsQd){mFKzCB+jf zePdQkSAwIRIx9MnQ$jqM*SI{fYH=}qOt^8-r}Fjw9Z%VOyzC8iFRsam`+ALBk&@`E zi3+v!A%kW~)G>Ce{Sn-+D^q$b2D#zZ70Myl*3A6ZyF@Qz?RMXIfA;<5_0gS#pQiO9 z%t4QoNI<7VJVj}nk+mQ{MdGK}NapW?DpB5^%}Qk zp1rYNJq@n#Bipc}!UQ+ou*APi@e3lz6jv%yFMD|S11mN$Q4~=8A^bAk;VY=+E*9b8 z;g8#LBHJ2R$kWO`|nRUk}RFI>^v(M%Z@Oj8OCDX z9N*2CR;;Fwwdm$82w)WJ3RG?AFz}0Hmd~i>z9SiFU_P~-`~0q|>qkB7SnHguOgCY1 zHj})!)9>LnHQxE}9GN~+^j0YuUmMOFORNs$rU={^8~s*N{7bcw`JAhwi-5&mVm4eV|}^=52r%!Is=2eEzk?iD79<_lt%A`62`W8}Qt zT-{>rA_1&Qb5dil3XI5jAEHKdub)UAl6e+Ua_pb}JGu!#5<@?#Z1) zB8%wWkr0%tX!bT5=l)hVdb7rO^1$KTHEwh5lV3rMI=(mBa%UkAmsKZ>^vGN3{xEWF zk+3}9;GB$2&C9Oc&Nb@emy@p6#fHpZ+Koe1TZMD8N-@*sEbAAo!d{<(H+cJTt#;3R zSlrb9yw8u?@bg+MtxA^2cy`x6kQ5SrbR;ZzJom_cTbcVRft8Ny_eoxH-*KgJ@>SAZ zUE_F&zgtH@WDwdkrJ+O=k=Ye;7RQlz`=395Mu8=io{K99h`zZ>|uML8l`Y3c;>{wfxR!~!YH_pz+^_rtCs?#d{?gN@ux83-M zt8;O2xqnQp5C%KiQtP+fpYG`th9A5&H}TuK=Kn}LcI8(A4H&4Ht|Q}--u6}alKA_n z>+@UAL&lqA%5 z@p1_bDYT!T(u!HIxoP1|cS+`d?C_`-y1ej3N`%Nq$BX{xl8FE1>f-Tff7D6Pip7Tg zu0?1Y9@D}J?`@iMa1}DDyTgXF8>b%atheRp;}{6jy{w#9y+9>K02nS0W^TG{I{^Z( z=ZR$yTHBvRm=RK?AO3J@m7X;4W$UMdjk6f>OZ!|PQhRE*8TM!JlgvvbwX@sv#W9Dr z+x#lCBPf`0?tf>TG=t$~_jYFi%2U7gwz*Omp%RUi_d(Gx#Us-;-F(z~^lB!p`0>0dO*b-*UMB^0hyo%p5aqpTp)Mc26 zKEG*~)+JP5=j->p(RO0(k#=I8 zKK8wBN4B7yy_^Nzi}hBg#b@8$hKHqITt=VSEe7tjutuc4iKj5hIS9IP#f~C@z_qkK*t=s&gngul9W6+8CBK- z@4h#s;QgPSlBn9=IBcplSblWt>Ze_j%Eb#|YGOZ3FCN`ZXnw@fT;6?BGY99}=7CIdo3SE&z zYMh}k1f7uzadB}++$2ecBa~AH%2&7j!bD)CKmIe)tvkOr9JvI?8|O=$6{Q(8H>OEZ z_$%TqI!zTOHbjoMTu1CB z8s`d&6LI#@4aymHkLR|0ImlY3-XROD&B=YeSbw&K=k)QbRL<2C4}w`H#iT>yn!5L{ z8d@Hv8o_tJEgBLxDc^-z`o-5PNXgaoRrlW?j~Ek;?eajU@=!^V!=UVgLg%B}*TAfN15zx(gxgURb zvw0nPV-wMumwASFQ&}f+poKOKx-6vpJaVYGslnD}&zc;<)Hb=Uan#Lq+WqH##UaJ0 zqW+otYr`odMi+y3s-Ht~$=*zl9W?z)_YBM+PV07=_(0%s$XNld(|Xxb%Bgnl-o z4-cOjKWqnq_?ztkNaC$bH1KWIqrcmzIpg<*LU)La8TejG7bFZeeriZ7sSIW$=#uCA zzn!B8e^f}#gr_n8?talcEjH6t@v>JlonhFoT>!V*`v?DG{Q|W%LfhlkmI<{ZPS!^% zCBM{sN=&klODi%zWU^r+Cim=(@RoC6yWFVNys-TAj?YKg*0CeM^K<1#nVXiSw`?&} zAB>wbH)rDPtutP3_f19N^5>~fY7LC?Q<&Q%dEjz~BmXv8s3_3H!4#U=&aBA8Y&!OK zReO3Je{^vW7vx)Qp;N=bB(Qbc#ypkAGQ z}FVa=1~)YH>I~pD)K!O>_KLk7{gCJOjj~zg3lxo4O%VGndk|> zW;BE*{eu)S#^1fzBou*ie*Mcu{x#OPX5`qV5E6RB1uASN9U66CQrFw}&q~{OcL=-E zQdz(W?4m08t*Z9Hs$h;(2F2CRwLw&~bR=OmEsw#8qgLnS!b!&uvI#4lXlz)9(WyIa zxlFeovn;1GlK6I}j%ZSaaag~fL z?zco;xV0qNJ?1ZSV3kRvSe_q_!KohAJ6=TJ_~gGqsVrvs@%mje+gwST&(hQt6U)MG zY^Z5FZ$jM9$=&WD{T=D7(iZ|+K3|^i&vt(jq6_j@d+x|22O*&~^ayyu`b!yMG$A3u zYN9xBDkIOzvDt?pl#7E6yju_5!dkOG8IT>5c|Rf_{_dh_rFfGPGCmaT{IV=eXt7{4WsNw9{NxW{2vDqHgfF-= zaI3Z2(d7TA?n~UE{KCJ(5FsQpwk(zGdz9?^R)jFdnxZiFoiJIlOlYyDvhTYPM$EUO z45IA&zVBizS$=0){NC$*|ANlnOlE=T2tJNun&#_J7OL@q#s!L+IEV` z8ahz#D8wQU>saKoG!dGr&XpV1jk+%=btQaU*wdsk}Df&TcEIMJbDM9;z z>vv$nIG&{vl0_1V@*Iuxtp8=9!pwPh`rkZa54?~PfY+6B&$9TwxFd{&YLX4W`w-+%+E(j(Z6Nl}{0N#WS$-)mMtSE7U_xR+Bja2m|mbK2N$@thZ8Dd(8SzThV z(fjp29)<1;X|3*z8^2oC{<_^S2gNXK6xt?vLk>;$vagOEASDjy^t+rC);r+h$GE2t|&@dEC zff}kuw#7)|S7Z`M_V&BS&dBV@6g-K)>w!+~(_dd%Zj@~x#hm>Mp%sVTJ!**ZS}Xdu zs)M%dgo9K6#U1^fXVG)Vxeb?H@RXeT+;iwVqehAE`)sBj%xG}Tjr4{nV6|j+OXKKV zLQ%!=@{HHMGha!NAefjdNG?I!@1l#{4 zVT2Sa09WAFftPAgdyRYHftPp_2GlyS-p8QNCRg)}tM}PA6t=$P?+6GISMwazr3!Y$ zxMhV*CLxf`eT#vWtHJuIbe@f|a;-S=N>&?Xre9f`7sW>U!zS-?-j2;mm5kb>yzmRp zXCR%JUoX^)M)=^B#&o)M1m>-$1}s*ur3hKsJcb?DcJTST@)iUuU@0I~s2O8@LgtIt z(4^&AG)y?BySp0|LfL#)0T><9-?RI1IGD55xw0}-ych2Vjx1&e6f5%vW@fCOD}z1R z3rym+*Kb%O8;GiO!d#yh{U6!)zWXW z7>t9U>=V9JUV)6qONO(o&PiAnZl0g7iHtE?Cy)qRV+dMs^KYb0#i% z&D0wf4KAaacsn{58>)xT3PaK7oz5XCG%r4SJ$tFmX5YF@_G9}5@5Ji3)4_h~Cv?85 z&FGm9g?+4BlD4cCM7Ux0eSruq5AWkNhBEJA*VC%%>MR}a-Db1~-#e#1SO0kPlr{Cu zHi)0yn=KRL;B+H~B zX0xXf@w|iOfsBAHD=bP-f5f{_f5%F(rF1zS6V-FpbxqzSaU!-|ypZOW8?|(kV{PNU zB_@FV!=;PN^Iq<4@j{rM4?8n{iDl;Xt|ZRmX>B;qoS5}Kf@vu_u-aQ8ZEU(Ni3n}c zYUgn=xIGhgfzyieQivNjeVHou$&)Agpm4&x!80s8oaMF8Tv1U`uwgb66H}$N>VNOQ z<>m1#_7;6Yh%GO7JmdKD$aL`b7+!GNcjQ5w@%}p=n~C1F zHzqkIhC5{OC{N+OpToVT+I=na41Q9%o7iQNv8jX3~NWe08%Hw$`)Ym^r<{^drU%z z`#EnMHpTi&f$jFiY2VR2g(fdU{&^`6`i|QcICx&UaPcNZ&(b>=oAfWGodd9L9DF?b z9462ef-1u?6c>CI!y6y2FR|Nblqm5>(hEfRG6ea+Egre<)X6y9u&5X9e~IwuW`WL@ zMn*s$bw{V#z4u9g&0bELY+KyE-tNq20Zp&)ksMr{ix{(5Z+maO78s!CE6d90T-y5m z?7>~oW{1!Wv2HjDroSoANFEo50!Ae3&ByJgOQ*_hXUPcrJbs<(JS8Q={E^E(uXZCG zvl{F5Mj7SZZv8&A^>YsSq@awWtV^61<#QiJayebW3i%?qEEj-y(EEQ6Q_ zxBZM_a@)W92|O)5?`Y2X2x-FMCS5O!e3H0QMn2PiBSS@cC{%Yh<`Zk!e?K2gej{f+ zZ}=Xnie{`$kLUZ^^gv)9eaUR*6X|+mpM`()V6~&e7HX_|(`a2_`7Xz8eSo}haWSg& zDHkQ5CIQyx4@z>xA>zGiHYqqBe=Aum3`D7NE3OACM3O6D6UZ%H%&9<(iUw%xKiEkB zEmRmkCERA2&!urFtJ1!yt*;{})Y z9jH1jk0=p&|G7(4Z^?jna*qhC+aJ&fL$OY*B{79FZIs9N-}4$fw~{Cdrkni`%h}r& z^8Y)yq!IiF#X3bEhxq+e4>_&0zgtb}{e_}VLC$cUA~NM+o_hm;v(cpVFMrXpQ^cbH zO51*G(rH0N#8Rmo67%@qopzrAh>GSeSsgEVze4P(Rhqwu7soga7~&{xIoDqSyH9b| ziR9k}+S}j)QPbK`iZXUTfg3^c7p)_$1A$!fr`JzlHEdy-9ZYB%IzK z$PfIceGNId_&bq3npq;_*)v*APC>zFF)=YA&C4<}W)|K9Hi>$Kf?hzF9ryC(rBYcy zFHN976*8-FY4O5ok&^dksMo3A@h)I7N?d%>oBj+r_NaR>fXxtYHu;MO zo_d_d`TxKrx^Mr$C8|n{H#~U4!onC#=7wwCD?vA5-uvhxxSEa<)=#d}Q|Xdj@0(O6 z*p}%Hlvsx?v+w1TcNCmRkb2OElhA%TDl(GuZGh)BUC1)1BZ?p`!@%cCho=P1(yEwu{Xhl z)ju4rgV`xBs;x0AIG!v7iWV4f0Ll&eBrPu^2SJ3osk!;wugVJFi&p%G1uCF)T4K;u z7cfwTgLab-&X<~F5X*{e(n8?p(G}va^5n4kz=9x$ulb}) z{smbfltiWwq>2i}HH&D(qkMs%s8zg7hQ1X{Kn_vsmL1qCmiPpcdpn;9rrT z6@Vb=%8Y2{9Ee&utFG%mMqIA8>$);nQ;uvTeuApnpJuSYcf=g4uLz-EGK}sn2=3qD zN?*ra|6e({N(hE5^%iS`$b2?9B5OXYk8l8K)M9GL&S%sL>R_rNM;=4m3*YjbHZy85 zvt8<%sXl$D>_h$uA0!lY2|}Q=7tEwtM>;%wn5TWy1X>FE`c;A@MV+F`NdepG8uJI1 zoviZmSRDG>TY2q}#`;v9*|%FIblqhCglJuwNS(a@qxDC(&=6HL^gB4b9h?4IA1+&)MxY2-^kOo|!pFzU42r^J9&h&az*+;ABhT>A`t0VEpmv zh)?z=O$jq2H6UXIiMVPjUpI~+ffViBJEt!cT1R;;xWsr^txv^lUi)f zlMxVj!Z*h{gq73E^CqiyLKp($wepnI3?^ij1{fj|_mbh{@WYprCUvSSjD9kBQG5NL zd|jmIP}JcyNKqu^nSZzFB*bMHMDSr3WPHjdX#B^qM1Z@h_J;YDSlY5tYXAEWA?@>W z(LT_Gm9NQ{wq`q=yGpk1*(+oODACPxVcPkYD5i$ z=6TS}K5QXp|H6!_xK~>S?@*54|MhY+Ns%C(Bo7o&lGOlg!obKV;kmE_1=zl7W@C{{ zJ=CRLuR`M}p=;^F}Zdb|Pc3&i-n&#;9rmqu5nd&}>s`vEd9b1ZVSKDjxXWlsMI)n7?L zp`0lo*(ktgBdDsPLhDSEl8|7#_gN58nP%!#+jKqg)hn&kprhL7!f1*%uyZ}Iul&W*eQ_}{0twwBa8SD=0XTa9s4ZDs|8q`mu7Q)2 z5P@-xSrVyXSZE}%=pKCUKQ<}1&)G#qHUvT5*pb%dIGfod=`@0_Le@8IB5w zwE(&YFa-J?sQh+-?f)ZYHplw?(6F|?$i>Cwt6z1e?=g^Up9fL22zyw`mp&QQ#%#x* z1w{D9z^(7~#SeSJSR|2Y#umP+Hm;C=!cz7aDBy$#ny0Cmr(L~$B@Ei3a`|lqEY%RgZ3rfZgca|d&t$NjU`hA0g*^gi7hPWA<`THBWp$&%~^09Cl4oXPt~p*+|Z6TJ{!LNA*AIa|uV>Z3=J&q=Q{p?rXSzu_&Xz(CK%xsWZ%Iz{>@%@@j#q>`q zh{g#1fNU44ik!&w>V9IWzv6!V+csHEy8*kn*9|ERTADn)tEL1t76Lg<4d<7@fYsW$ zr!wbG9uZH6LRG~UkC_79%D&lW8T7{b-n|)Wf^`9ny}9u%PfmP{eqE4|6WAO`&>myA zTdAo4{{gQvC^}JlC2}|T*eOQ(@4qTAfjk@2D7jMvmrZ1Y=VY+3b10PH`RJcI0K0T< z>%4dJ9BUw-$FD=+VJQklJ(#Ze<;2Q9(g0(Ii;#?*hal6`Pwkxk_x9IMgEXI@+xRY7 z4y!{5^ZS3vMzrKSz^6n_?yR(PS_QPy7oSWY!VNBrvnE<^pCPV>_q))Yh|?$F-QGZA zqZWlANIegiv;TBoS|u%*uiz!#wySA$Tvtnb)w&sQdkF@hx$l#vnCuoOJ>0x&d`EzBT2s3*W*=T z(X4t^eDQg1O=l{mhg0Wx#ifm+ z7j$wJwtNdJ991|uIbUcX5X?6B@1IZ60W3VcGBU$8fq>u9H!>bsrOYj6*9KCGq+~_!!f8Oj(g1pRZv(L}x|bF>=(@m5 zvz>`B{0Z4p+!&6v?-(f`VAw*IraXP%XE(|>_(C7scAajT!W^43mt$bxt2Z$9A^F#Q zaq1Yw=4ht>pBG~UK{Av9*1R;pmIu6rcutF2dQDBuxTK_qJ*nCW>Uhk zneSx|s~+x;k3vxr;uGfr$e_f%ujsV?7@*)-pewz)^YnzovsPox&46!Jdu3?N>3rIr_|E2 zy6VxM+v4}ka78GwBn>H~XydsE*Yf$YnJ{@TLX^|dBLLTiOLq*9(c64}HIe6Z&RILs z_C?iBhUXIbip9(oTf6z<9vZuuS0YIbj0%sW>=k?-j(#k3x8AV6OGn==SP(IP#*p9m z#ejiSt%s3{$?aL-D+(!tL}{b;)_bl5QtXE=n6O0_yVr%ZYl)B6+zMK3suqelM{Jn-B7>Yu&^(^`0%FIE z{f1|dLdTnZ=3A+u(P|8ql>Oic-USNbqVZDYfO5ufHu-@W?jRZ1OK!(uN`gK*P$q!p zJ=>FK;4$|_K!!vC00F4tB|xAl`3XwG0Q`vSaREsELU^nJ$k6hn>~b9|_wchGbTg2G zRXUiZTFeg(Y`(Tga$nVD=7AJo0wibIm@o;gf0Dm&{#_Fmu~TE;n540^{kj2ot`$w$ zyLWzuqh^HPfQEw-s|#xoNKs?tR3Je@tmGf3!OG0*JkkNJt=74*fSot5+bJk1KT#Dm zJs=_OCDsb0qilZQ2mO3CKsEHcHBrIxn{;peLqv}aJ~1Gulg08;u1+oM_Vu#G&&H-N z>^`lA+);hhQU?+cGB3y-?{?38epkLKY3IQnl?T0o7O!x#8}x4MtPc4S+IiXjJe`hX z#-d(gAxjsj=qGzFD|IhBb?+*>E2U$CkcBR#B!tQP-dpn%B^Rdi4XoXtq_YdT2N1IR&BJnpo>Han`252&s5@!)K%L~|GMZa&;HWLIfE<3 ztESrnhRc+*xT!AQQPaKQNk-h;r}CZcw@yGY5Mto za7H8z7i2QW3LV)=-!l1$UXb&S=)=cOH&*LHOLz8qFixyhRucvxPcu??*m8m*!w}1B zi_z5eGAc`3J5Y;{DN3w>#s@&MH&y>FDB~=9C5ExpS p6brH)Ct1=Rtbq~cv>T2+CVA;{5hHAq`|K3>(p1$^DN(Wt{vQa7xxWAa literal 0 HcmV?d00001 diff --git a/infinigen/tools/terrain/palette/palette.py b/infinigen/tools/terrain/palette/palette.py new file mode 100644 index 000000000..a87532f6a --- /dev/null +++ b/infinigen/tools/terrain/palette/palette.py @@ -0,0 +1,117 @@ +# Copyright (c) Princeton University. +# This source code is licensed under the BSD 3-Clause license found in the LICENSE file in the root directory of this source tree. + +# Authors: Zeyu Ma, Lingjie Mei + + +from google_images_search import GoogleImagesSearch +from sklearn.mixture import GaussianMixture +import argparse +import numpy as np +import os +import cv2 +import matplotlib.pyplot as plt +import colorsys +from pathlib import Path + + +def make_palette(keyword, num_images, num_colors, overwrite=False): + # define search params + # option for commonly used search param are shown below for easy reference. + # For param marked with '##': + # - Multiselect is currently not feasible. Choose ONE option only + # - This param can also be omitted from _search_params if you do not wish to define any value + _search_params = { + 'q': keyword, + 'num': num_images, + 'fileType': 'jpg|png', + } + + # this will search and download: + folder = f'{os.path.split(os.path.abspath(__file__))[0]}/images/{keyword}' + if os.path.exists(folder) and not overwrite: + print("folder existing, skip") + else: + # set your environment variables: GCS_DEVELOPER_KEY, GCS_CX + gis = GoogleImagesSearch(os.environ["GCS_DEVELOPER_KEY"], os.environ["GCS_CX"]) + gis.search(search_params=_search_params, path_to_dir=folder) + + colors = np.zeros((0, 3)) + for image_name in os.listdir(folder): + if image_name.endswith("svg"): continue + image = cv2.imread(f"{folder}/{image_name}") + image = cv2.resize(image, (128, 128)) + image = image[:, :, :3] + colors = np.concatenate((colors, image.reshape((-1, 3)))) + colors = colors[:, ::-1] / 255 + + for i in range(len(colors)): + colors[i] = colorsys.rgb_to_hsv(*colors[i]) + + model = GaussianMixture(num_colors, random_state=0).fit(colors) + + weights = model.weights_.copy() + index = np.argsort(weights)[::-1] + weights = weights[index] + colors_hsv = model.means_.copy()[index] + cov = model.covariances_.copy()[index] + colors_rgb = colors_hsv.copy() + for i in range(num_colors): + colors_rgb[i] = colorsys.hsv_to_rgb(*colors_rgb[i]) + cov[i] = np.linalg.cholesky(cov[i] + 1e-5 * np.eye(3)) + + S = 20 + diagrams = np.zeros((2, S, num_colors, S, 3)) + x, y = np.meshgrid(np.linspace(-1, 1, S), np.linspace(-1, 1, S), indexing="ij") + for i in range(num_colors): + diagrams[0, :, i, :, 0] = colors_rgb[i, 0] + diagrams[0, :, i, :, 1] = colors_rgb[i, 1] + diagrams[0, :, i, :, 2] = colors_rgb[i, 2] + diagrams[1, :, i, :, 0] = colors_hsv[i, 0] + cov[i, 0, 0] * x + cov[i, 0, 1] * y + diagrams[1, :, i, :, 1] = colors_hsv[i, 1] + cov[i, 1, 0] * x + cov[i, 1, 1] * y + diagrams[1, :, i, :, 2] = colors_hsv[i, 2] + cov[i, 2, 0] * x + cov[i, 2, 1] * y + for j in range(S): + for k in range(S): + diagrams[1, j, i, k] = colorsys.hsv_to_rgb(*diagrams[1, j, i, k]) + + diagrams = np.clip(diagrams * 256, a_min=0, a_max=255).astype(np.int32) + diagrams = diagrams.reshape((2 * S, num_colors * S, 3)) + + Path(f'{os.path.split(os.path.abspath(__file__))[0]}/images').mkdir(parents=True, exist_ok=True) + Path(f'{os.path.split(os.path.abspath(__file__))[0]}/json').mkdir(parents=True, exist_ok=True) + + plt.figure(figsize=(20, 5)) + plt.imshow(diagrams) + plt.savefig(f'{os.path.split(os.path.abspath(__file__))[0]}/images/{keyword}.png') + + colors_rgb = np.clip(colors_rgb * 256, a_min=0, a_max=255).astype(np.int32) + with open(f"{os.path.split(os.path.abspath(__file__))[0]}/json/{keyword}.json", "w") as f: + f.write("{\n") + f.write(' "color": {\n') + for i, color in enumerate(colors_rgb): + f.write(f' "{i}": "#{color[0]:02X}{color[1]:02X}{color[2]:02X}",\n') + f.write(" },\n") + f.write(' "hsv": [\n') + for color_hsv in colors_hsv: + f.write(f' [{color_hsv[0]}, {color_hsv[1]}, {color_hsv[2]}],\n') + f.write(" ],\n") + f.write(' "std": [\n') + for std in cov: + covs = ','.join([str(x) for x in std.reshape(-1)]) + f.write(f' [{covs}],\n') + f.write(" ],\n") + f.write(' "prob": [\n') + for i in range(num_colors): + f.write(f' {weights[i]},\n') + f.write(" ]\n") + f.write("}\n") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('-k', '--keyword', type=str) + parser.add_argument('-i', '--num_images', default=10) + parser.add_argument('-c', '--num_colors', default=10) + parser.add_argument('-o', '--overwrite', action='store_true') + args = parser.parse_args() + make_palette(args.keyword, args.num_images, args.num_colors, args.overwrite) diff --git a/infinigen/tools/terrain/palette/readme.md b/infinigen/tools/terrain/palette/readme.md new file mode 100644 index 000000000..b8c2738e5 --- /dev/null +++ b/infinigen/tools/terrain/palette/readme.md @@ -0,0 +1,47 @@ +# How to use + +This palette generating tool is enabled using `GoogleImagesSearch` (currently using Zeyu's API key). Also you need `json5`. + +## Step 1 + +``` +cd infinigen/tools/terrain/palette/ +# you can change "mountain rock" to other key words +python palette.py -k "mountain rock" +``` + +This downloads 10 images from Google by default: +![](demo1.png) + +and runs Mixed Gaussian Model (MGM) on HSV space to get an initial palette: +![](demo2.png) + +You can see the above palette in folder `images`. By default it has 10 centers, and the first row is the color of all centers, and the second row is the range of color when you vary it according to MGM with range (-std, std) (V dimension is ommited for 2D display) + +Some colors are background colors and do not belong to the keyword you search. + +## Step 2 + +Under folder `json`, there is a `mountain rock.json`. By installing Add-on `Flutter Color` and `JSON5 syntax` in VSCode, you can see the color icon. + +![](demo3.png) + +After manually comemnt out them, you have: + +![](demo4.png) + +Then you move the ready palatte to location: `infinigen/examples/configs/palette` + +## Step 3 + +When you want some color to sample from it, use the `palette` keyword in parameter parsing, e.g.: + +``` +assets.materials.water.shader.color = ("palette", "water") +assets.materials.ocean.shader.color = ("palette", "water") +assets.materials.mountain.shader.color = ("palette", "mountain rock") +assets.materials.sand.shader.color = ("palette", "desert") +assets.materials.sandstone.shader.color = ("palette", "sandstone") +``` + +Note that Blender uses lienar RGB while web content uses sRGB, so a conversion is done in the parsing function `random_general` \ No newline at end of file diff --git a/infinigen/tools/terrain/params_parser.py b/infinigen/tools/terrain/params_parser.py new file mode 100644 index 000000000..682986181 --- /dev/null +++ b/infinigen/tools/terrain/params_parser.py @@ -0,0 +1,49 @@ +# Copyright (c) Princeton University. +# This source code is licensed under the BSD 3-Clause license found in the LICENSE file in the root directory of this source tree. + +# Authors: Zeyu Ma + + +import argparse + +parser = argparse.ArgumentParser() +parser.add_argument('-f', '--file_path', type=str) +args = parser.parse_args() + +output = "" +current_type = "" +current_vars = [] + +code = "" + +def get_code(current_type, variables): + code = "" + for i, v in enumerate(variables): + code += f" {current_type} {v} = {current_type[0]}_params[{i}];\n" + return code + +with open(args.file_path, "r") as f: + lines = f.readlines() + i = 0 + while i < len(lines): + line = lines[i] + if line.lstrip().startswith("/* params"): + while True: + i += 1 + if lines[i].rstrip().endswith(":"): + if current_type != "": + code += get_code(current_type, current_vars) + if lines[i].lstrip().startswith("int"): + current_type = "int" + current_vars = [] + elif lines[i].lstrip().startswith("float"): + current_type = "float" + current_vars = [] + elif lines[i].rstrip().endswith("*/"): + code += get_code(current_type, current_vars) + break + else: + current_vars.extend([x.lstrip().rstrip() for x in lines[i].lstrip().rstrip().rstrip(',').split(",") if x.lstrip().rstrip() != ""]) + i += 1 + +print(code) diff --git a/install.sh b/install.sh index 3a4a174e5..6ffca5dba 100755 --- a/install.sh +++ b/install.sh @@ -34,39 +34,25 @@ cd - # Build terrain rm -rf *.egg-info rm -rf __pycache__ -rm -rf ./worldgen/terrain/build +rm -rf ./infinigen/terrain/build -cd ./worldgen/terrain +cd ./infinigen/terrain bash install_terrain.sh python setup.py build_ext --inplace --force cd - -# Compile process_mesh (i.e. OpenGL-based ground truth) -<<<<<<< HEAD -cd ./process_mesh -/usr/bin/cmake -S . -Bbuild -DCMAKE_C_COMPILER=/usr/bin/gcc -DCMAKE_BUILD_TYPE=Release -/usr/bin/cmake --build build --target all -./build/process_mesh -in x -out x --height 100 --width 10 -if [ $? -eq 174 ]; then - echo "OpenGL/EGL ground truth is working." -else - echo "WARNING: OpenGL/EGL is not supported on this machine. If you are running from a cluster head-node, this is likely not an issue." -fi -cd - -<<<<<<< HEAD - # Build NURBS -cd ./worldgen/assets/creatures/geometry/cpp_utils +cd ./infinigen/assets/creatures/geometry/cpp_utils rm -f *.so rm -rf build "../../../../../${BLENDER_PYTHON}" "${NURBS_SCRIPT}" build_ext --inplace cd - if [ "$1" = "opengl" ]; then - bash ./worldgen/tools/install/compile_opengl.sh + bash ./infinigen/tools/install/compile_opengl.sh fi # Build Flip Fluids addon if [ "$1" = "flip_fluids" ] || [ "$2" = "flip_fluids" ]; then - bash ./worldgen/tools/install/compile_flip_fluids.sh + bash ./infinigen/tools/install/compile_flip_fluids.sh fi \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 000000000..596a92288 --- /dev/null +++ b/setup.py @@ -0,0 +1,51 @@ +from pathlib import Path +import subprocess + +from setuptools import setup, Extension + +import numpy +from Cython.Build import cythonize + +cwd = Path(__file__).parent + +def get_submodule_folders(): + # Inspired by https://github.com/pytorch/pytorch/blob/main/setup.py + with (cwd/'.gitmodules').open() as f: + return [ + cwd/line.split("=", 1)[1].strip() + for line in f.readlines() + if line.strip().startswith("path") + ] + +def ensure_submodules(): + # Inspired by https://github.com/pytorch/pytorch/blob/main/setup.py + + folders = get_submodule_folders() + + isempty = lambda p: not any(p.iterdir()) + if any(not p.exists() or isempty(p) for p in folders): + subprocess.check_call( + ["git", "submodule", "update", "--init", "--recursive"], cwd=cwd + ) + +ensure_submodules() # not actually needed for this version of setup.py, but will be in future + +cython_extensions = [ + Extension( + name="bnurbs", + sources=["infinigen/assets/creatures/util/geometry/cpp_utils/bnurbs.pyx"], + include_dirs=[numpy.get_include()] + ), + Extension( + name="infinigen.terrain.marching_cubes", + sources=["infinigen/terrain/marching_cubes/_marching_cubes_lewiner_cy.pyx"], + include_dirs=[numpy.get_include()] + ), +] + +setup( + ext_modules=[ + *cythonize(cython_extensions) + ] + # other opts come from setup.cfg +) \ No newline at end of file

C2l7 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