Files
Blender-World-Generator/GenerateMitImage.py
2023-05-08 12:58:55 -04:00

104 lines
4.2 KiB
Python

#Imports.
import bpy;
import bmesh;
import random;
# Variables:
# Size of each cube.
size = 1;
# Setting the x, y, and z positions.
x = y = z = size / 2;
# Setting the number of cubes in each coordinate.
xNum = 1;
yNum = 1;
zNum = 1;
# Setting the initial value for the number of cubes in each recursive call.
cubeCount = 0;
# Setting the maximum amount of cubes that is needed to be created.
numOfCubes = xNum * yNum * zNum;
# print(numOfCubes);
#Function to clean the scene. This removes all of the objects, collections, materials, particles, textures, images, curves, meshes, actions, nodes, and worlds from the scene.
def cleanScene():
# Changes the mode to object mode if it is in Edit mode.
if (bpy.context.active_object and bpy.context.active_object.mode == "EDIT"):
bpy.ops.object.editmode_toggle();
# Checks for hidden stuff and unhides them.
for obj in bpy.data.objects:
obj.hide_set(False);
obj.hide_select = False;
obj.hide_viewport = False;
# Selects all the objects and then deletes.
bpy.ops.object.select_all(action = "SELECT");
bpy.ops.object.delete();
# Function to spawn the "ground" by creating several cubes using a nested for loop.
def spawnGround():
# Iterate over each grid "cell" we want a cube at.
for x in range(xNum):
for y in range(yNum):
for z in range(zNum):
# Set the location.
location = (x, y, z);
# Add the cubes.
bpy.ops.mesh.primitive_cube_add(size = size, location = location, scale = (size, size, size));
# Set the newly created cube as the active object.
activeObject = bpy.context.active_object;
# Object View Layer variable.
activeObjectViewLayer = bpy.context.view_layer.objects.active;
# Add a new material slot.
# bpy.ops.object.material_slot_add();
# Creating a new material and assigning it to the active cube.
material = bpy.data.materials.new("Material");
material.use_nodes = True;
BSDF = material.node_tree.nodes["Principled BSDF"];
materialNodes = material.node_tree.nodes;
materialLinks = material.node_tree.links;
# Selecting each face and then assigning the material to that face.
for i in range(6):
# Checks if the object is currently in edit mode, and if not, sets it into edit mode.
if (bpy.context.active_object.mode == "OBJECT"):
bpy.ops.object.editmode_toggle();
bm = bmesh.from_edit_mesh(activeObject.data);
# Make sure the bmesh is up-to-date with the mesh data.
bm.faces.ensure_lookup_table();
# Set selecting the faces to be true.
bm.faces[i].select = True;
# Show the updates in the viewport.
bmesh.update_edit_mesh(activeObject.data);
print('Face ', i, ' grabbed');
# Deselect the faces.
bm.faces[i].select = False;
print('Face ', i, ' released');
# Add the material.
activeObject.data.materials.append(material);
# Change the texture of the cube.
textureImage = material.node_tree.nodes.new('ShaderNodeTexImage');
textureImage.image = bpy.data.images.load("C:\\Users\\satna\\OneDrive\\Desktop\\Programming\\Python\\Blender\\Blender-World-Generator\\DirtBlock.png");
material.node_tree.links.new(BSDF.inputs['Base Color'], textureImage.outputs['Color']);
# Assign the texture to the object.
if activeObjectViewLayer.data.materials:
activeObjectViewLayer.data.materials[0] = material;
else:
activeObjectViewLayer.data.materials.append(material);
# Calling the functions:
cleanScene();
spawnGround();