Attention | Topic was automatically imported from the old Question2Answer platform. | |
Asked By | Shaolin_Funk | |
Old Version | Published before Godot 3 was released. |
I’m still working on getting procedural meshes right and I’ve hit another snag. It’s a little hard to describe, so I’ll show you a video first. The cube on the left is one I’ve created in code, the one on the right is an instance of TestCube for comparison.
The flickering only occurs on two faces of the cube, the ones that are perpendicular to the Z axis. The other 4 faces render correctly. It only happens when the mesh includes normal data, whether I add the normals manually using SurfaceTool.add_normal()
or if I automatically generate them with SurfaceTool.generate_normals()
. If I omit normals entirely there is no flickering. Code listing follows.
func make_cube(): #mesh
var uv_array = []
var faces = []
var normals = []
var st = SurfaceTool.new()
var mat = FixedMaterial.new()
var tex = ImageTexture.new()
var nm = ImageTexture.new()
tex.load("res://textures/grass.png")
nm.load("res://textures/grass-nm.png")
mat.set_texture(mat.PARAM_DIFFUSE, tex)
mat.set_texture(mat.PARAM_NORMAL, nm)
#same uv mapping for each face
uv_array.push_back(Vector2(0,0))
uv_array.push_back(Vector2(1,1))
uv_array.push_back(Vector2(0,1))
uv_array.push_back(Vector2(0,0))
uv_array.push_back(Vector2(1,0))
uv_array.push_back(Vector2(1,1))
#face 0
normals.push_back(Vector3(0,0,-1))
faces.push_back([])
faces[0].push_back(Vector3(-1,-1,-1))
faces[0].push_back(Vector3(1,1,-1))
faces[0].push_back(Vector3(-1,1,-1))
faces[0].push_back(Vector3(-1,-1,-1))
faces[0].push_back(Vector3(1,-1,-1))
faces[0].push_back(Vector3(1,1,-1))
#face 1
normals.push_back(Vector3(-1,0,0))
faces.push_back([])
faces[1].push_back(Vector3(1,-1,-1))
faces[1].push_back(Vector3(1,1,1))
faces[1].push_back(Vector3(1,1,-1))
faces[1].push_back(Vector3(1,-1,-1))
faces[1].push_back(Vector3(1,-1,1))
faces[1].push_back(Vector3(1,1,1))
#face 2
normals.push_back(Vector3(0,0,1))
faces.push_back([])
faces[2].push_back(Vector3(1,-1,1))
faces[2].push_back(Vector3(-1,1,1))
faces[2].push_back(Vector3(1,1,1))
faces[2].push_back(Vector3(1,-1,1))
faces[2].push_back(Vector3(-1,-1,1))
faces[2].push_back(Vector3(-1,1,1))
#face 3
normals.push_back(Vector3(1,0,0))
faces.push_back([])
faces[3].push_back(Vector3(-1,-1,1))
faces[3].push_back(Vector3(-1,1,-1))
faces[3].push_back(Vector3(-1,1,1))
faces[3].push_back(Vector3(-1,-1,1))
faces[3].push_back(Vector3(-1,-1,-1))
faces[3].push_back(Vector3(-1,1,-1))
#top
normals.push_back(Vector3(0,1,0))
faces.push_back([])
faces[4].push_back(Vector3(-1,1,-1))
faces[4].push_back(Vector3(1,1,1))
faces[4].push_back(Vector3(-1,1,1))
faces[4].push_back(Vector3(-1,1,-1))
faces[4].push_back(Vector3(1,1,-1))
faces[4].push_back(Vector3(1,1,1))
#bottom
normals.push_back(Vector3(0,-1,0))
faces.push_back([])
faces[5].push_back(Vector3(-1,-1,-1))
faces[5].push_back(Vector3(1,-1,1))
faces[5].push_back(Vector3(1,-1,-1))
faces[5].push_back(Vector3(-1,-1,-1))
faces[5].push_back(Vector3(-1,-1,1))
faces[5].push_back(Vector3(1,-1,1))
st.begin(Mesh.PRIMITIVE_TRIANGLES)
st.set_material(mat)
for f in range(6):
for v in range(6):
st.add_uv(uv_array[v])
st.add_normal(normals[f])
st.add_vertex(faces[f][v] * radius)
#st.generate_normals()
return st.commit()