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