Generating a chunk using EditableMesh

I’m wanting to utilize EditableMeshes to render a chunk instead of doing individual parts, to hopefully save on performance. Atm, I have it setup to basically do what I originally had, but using EditableMesh instead of a part. I’m trying now to figure out how I can “unrender” hidden sides, so basically it’d only be render the top faces of these blocks. But also needs to render in/out as blocks get placed/etc.

local BLOCK_SIZE = 4

local Cube = require(script.Cube)

for x = 1, 16 do
	for z = 1, 16 do
		local NewCube = Cube.new()

		local MeshPart, EditableMesh = NewCube:CreateCube(
			Vector3.new(x * BLOCK_SIZE, 0, z * BLOCK_SIZE),
			Vector3.new(BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE)
		)
		MeshPart.Parent = workspace
	end
end

Cube class

local Cube = {}
Cube.__index = Cube

local AssetService = game:GetService("AssetService")

local function AddSharpQuad(editableMesh, vid0, vid1, vid2, vid3)
	-- Add a new normal for this face
	local nid = editableMesh:AddNormal()

	-- Create two triangles to form the quad
	local fid1 = editableMesh:AddTriangle(vid0, vid1, vid2)
	editableMesh:SetFaceNormals(fid1, { nid, nid, nid })

	local fid2 = editableMesh:AddTriangle(vid0, vid2, vid3)
	editableMesh:SetFaceNormals(fid2, { nid, nid, nid })
end

function Cube.new()
	local self = setmetatable({}, Cube)
		
	return self
end

function Cube:CreateCube(position, size)
	position = position or Vector3.new(0, 0, 0)
	size = size or Vector3.new(1, 1, 1)

	-- Create empty EditableMesh
	local EditableMesh = AssetService:CreateEditableMesh()

	-- Add vertices for a unit cube
	local v1 = EditableMesh:AddVertex(Vector3.new(0, 0, 0))
	local v2 = EditableMesh:AddVertex(Vector3.new(1, 0, 0))
	local v3 = EditableMesh:AddVertex(Vector3.new(0, 1, 0))
	local v4 = EditableMesh:AddVertex(Vector3.new(1, 1, 0))
	local v5 = EditableMesh:AddVertex(Vector3.new(0, 0, 1))
	local v6 = EditableMesh:AddVertex(Vector3.new(1, 0, 1))
	local v7 = EditableMesh:AddVertex(Vector3.new(0, 1, 1))
	local v8 = EditableMesh:AddVertex(Vector3.new(1, 1, 1))

	-- Add the six faces of the cube
	AddSharpQuad(EditableMesh, v5, v6, v8, v7) -- front
	AddSharpQuad(EditableMesh, v1, v3, v4, v2) -- back
	AddSharpQuad(EditableMesh, v1, v5, v7, v3) -- left
	AddSharpQuad(EditableMesh, v2, v4, v8, v6) -- right
	AddSharpQuad(EditableMesh, v1, v2, v6, v5) -- bottom
	AddSharpQuad(EditableMesh, v3, v7, v8, v4) -- top

	-- Clean up unused normals
	EditableMesh:RemoveUnused()

	-- Create the preview MeshPart
	local PreviewMesh = AssetService:CreateMeshPartAsync(Content.fromObject(EditableMesh))
	PreviewMesh.Anchored = true
	PreviewMesh.Position = position
	PreviewMesh.Size = size

	return PreviewMesh, EditableMesh
end

return Cube