From 6870cf6f50bbce21f39e2fcd8c05a3dfa7f57a32 Mon Sep 17 00:00:00 2001 From: nachoz12341 <40530732+nachoz12341@users.noreply.github.com> Date: Mon, 16 Sep 2024 12:14:32 -0500 Subject: [PATCH 1/4] Initial smooth lighting support --- voxel.agc | 745 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 510 insertions(+), 235 deletions(-) diff --git a/voxel.agc b/voxel.agc index 9057050..504eead 100644 --- a/voxel.agc +++ b/voxel.agc @@ -1,7 +1,7 @@ //~#import_plugin OpenSimplexNoise as Noise //~#include "threadnoise.agc" -#constant FaceUp 0 +#constant FaceUp 0 #constant FaceRight 1 #constant FaceFront 2 #constant FaceBack 3 @@ -944,8 +944,7 @@ endfunction //~endfunction 0 function Voxel_JoinFace(CurrentBlockType, NeighbourBlockType) - if CurrentBlockType = 0 or NeighbourBlockType = 0 then exitfunction 0 - if Voxel_Blocks.Attributes[CurrentBlockType-1].JoinFace = 0 then exitfunction 0 + if CurrentBlockType = 0 or NeighbourBlockType = 0 then exitfunction 0 //~ if Voxel_Blocks.Attributes[CurrentBlockType-1].JoinFace //~ exitfunction (CurrentBlockType = NeighbourBlockType) //~ endif @@ -1153,174 +1152,312 @@ function Voxel_GenerateSlabFaces(Object ref as MeshData,World ref as WorldData,L CurrentBlockType=Voxel_GetBlockType(World,GlobalX,LocalY,GlobalZ) NeighbourBlockType=Voxel_GetBlockType(World,GlobalX,LocalY+1,GlobalZ) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ ))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ ))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX, LocalY+1,GlobalZ+1))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX, LocalY+1,GlobalZ-1))=0) + SkyLightValue=Voxel_GetSunLight(World,GlobalX,LocalY+1,GlobalZ) + + skyX0=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ ) + skyX1=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ ) + skyZ0=Voxel_GetSunLight(World,GlobalX, LocalY+1,GlobalZ-1) + skyZ1=Voxel_GetSunLight(World,GlobalX, LocalY+1,GlobalZ+1) - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ+1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ+1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ-1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ-1))=0) + sky00=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ-1) + sky01=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ+1) + sky10=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ-1) + sky11=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ+1) - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) + skyA00=SkyLightValue+skyX0+skyZ0+sky00 + skyA01=SkyLightValue+skyX0+skyZ1+sky01 + skyA10=SkyLightValue+skyX1+skyZ0+sky10 + skyA11=SkyLightValue+skyX1+skyZ1+sky11 + + BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY+1,GlobalZ) + + blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) + blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) + blockZ0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) - Flipped=0 - if A00+A10>A01+A11 then Flipped=1 + block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ-1) + block01=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ+1) + block10=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ-1) + block11=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ+1) - LightValue=Core_Max(Voxel_GetBlockLight(World,GlobalX,LocalY+1,GlobalZ),Voxel_GetSunLight(World,GlobalX,LocalY+1,GlobalZ))/15.0*255 - A00=LightValue-A00 - A01=LightValue-A01 - A10=LightValue-A10 - A11=LightValue-A11 + blockA00=BlockLightValue+blockX0+blockZ0+block00 + blockA01=BlockLightValue+blockX0+blockZ1+block01 + blockA10=BlockLightValue+blockX1+blockZ0+block10 + blockA11=BlockLightValue+blockX1+blockZ1+block11 + + A00=Core_Max(skyA00,blockA00) + A01=Core_Max(skyA01,blockA01) + A10=Core_Max(skyA10,blockA10) + A11=Core_Max(skyA11,blockA11) + + Flipped=0 + if A00+A11>A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceUp],LocalX,LocalY,LocalZ,FaceUp,A00,A01,A10,A11,Flipped,0,-8,0,1,1,1,1,1) endif NeighbourBlockType=Voxel_GetBlockType(World,GlobalX,LocalY-1,GlobalZ) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ ))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ ))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX, LocalY-1,GlobalZ+1))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX, LocalY-1,GlobalZ-1))=0) + SkyLightValue=Voxel_GetSunLight(World,GlobalX,LocalY-1,GlobalZ) + + skyX0=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ ) + skyX1=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ ) + skyZ0=Voxel_GetSunLight(World,GlobalX, LocalY-1,GlobalZ-1) + skyZ1=Voxel_GetSunLight(World,GlobalX, LocalY-1,GlobalZ+1) - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ+1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ+1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ-1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ-1))=0) + sky00=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ-1) + sky01=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ+1) + sky10=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ-1) + sky11=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ+1) - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) + skyA00=SkyLightValue+skyX0+skyZ0+sky00 + skyA01=SkyLightValue+skyX0+skyZ1+sky01 + skyA10=SkyLightValue+skyX1+skyZ0+sky10 + skyA11=SkyLightValue+skyX1+skyZ1+sky11 + + BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY-1,GlobalZ) + + blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) + blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) + blockZ0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) - Flipped=1 - if A00+A10A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceDown],LocalX,LocalY,LocalZ,FaceDown,A00,A01,A10,A11,Flipped,0,0,0,1,1,1,1,1) endif NeighbourBlockType=Voxel_GetBlockType(World,GlobalX,LocalY,GlobalZ+1) - if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY ,GlobalZ+1))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY ,GlobalZ+1))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX ,LocalY+1,GlobalZ+1))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX ,LocalY-1,GlobalZ+1))=0) - - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ+1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ+1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ+1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ+1))=0) - - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) - + if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) + SkyLightValue=Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ+1) + + skyX0=Voxel_GetSunLight(World,GlobalX-1,LocalY ,GlobalZ+1) + skyX1=Voxel_GetSunLight(World,GlobalX+1,LocalY ,GlobalZ+1) + skyY0=Voxel_GetSunLight(World,GlobalX, LocalY-1,GlobalZ+1) + skyY1=Voxel_GetSunLight(World,GlobalX, LocalY+1,GlobalZ+1) + + sky00=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ+1) + sky01=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ+1) + sky10=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ+1) + sky11=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ+1) + + skyA00=SkyLightValue+skyX0+skyY0+sky00 + skyA01=SkyLightValue+skyX0+skyY1+sky01 + skyA10=SkyLightValue+skyX1+skyY0+sky10 + skyA11=SkyLightValue+skyX1+skyY1+sky11 + + BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ+1) + + blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ+1) + blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ+1) + blockY0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) + blockY1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) + + block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ+1) + block01=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ+1) + block10=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ+1) + block11=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ+1) + + blockA00=BlockLightValue+blockX0+blockY0+block00 + blockA01=BlockLightValue+blockX0+blockY1+block01 + blockA10=BlockLightValue+blockX1+blockY0+block10 + blockA11=BlockLightValue+blockX1+blockY1+block11 + + A00=Core_Max(skyA00,blockA00) + A01=Core_Max(skyA01,blockA01) + A10=Core_Max(skyA10,blockA10) + A11=Core_Max(skyA11,blockA11) + Flipped=0 - if A00+A10>A01+A11 then Flipped=1 - - LightValue=Core_Max(Voxel_GetBlockLight(World,GlobalX,LocalY,GlobalZ+1),Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ+1))/15.0*255 - A00=LightValue-A00 - A01=LightValue-A01 - A10=LightValue-A10 - A11=LightValue-A11 + if A00+A11>A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceFront],LocalX,LocalY,LocalZ,FaceFront,A00,A01,A10,A11,Flipped,0,0,0,1,0.5,1,1,0.5) endif NeighbourBlockType=Voxel_GetBlockType(World,GlobalX,LocalY,GlobalZ-1) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY ,GlobalZ-1))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY ,GlobalZ-1))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX ,LocalY+1,GlobalZ-1))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX ,LocalY-1,GlobalZ-1))=0) + SkyLightValue=Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ-1) + + skyX0=Voxel_GetSunLight(World,GlobalX-1,LocalY ,GlobalZ-1) + skyX1=Voxel_GetSunLight(World,GlobalX+1,LocalY ,GlobalZ-1) + skyY0=Voxel_GetSunLight(World,GlobalX, LocalY-1,GlobalZ-1) + skyY1=Voxel_GetSunLight(World,GlobalX, LocalY+1,GlobalZ-1) - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ-1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ-1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ-1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ-1))=0) + sky00=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ-1) + sky01=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ-1) + sky10=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ-1) + sky11=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ-1) - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) + skyA00=SkyLightValue+skyX0+skyY0+sky00 + skyA01=SkyLightValue+skyX0+skyY1+sky01 + skyA10=SkyLightValue+skyX1+skyY0+sky10 + skyA11=SkyLightValue+skyX1+skyY1+sky11 + + BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ-1) + + blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ-1) + blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ-1) + blockY0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) + blockY1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) - Flipped=1 - if A00+A10A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceBack],LocalX,LocalY,LocalZ,FaceBack,A00,A01,A10,A11,Flipped,0,0,0,1,0.5,1,1,0.5) endif NeighbourBlockType=Voxel_GetBlockType(World,GlobalX+1,LocalY,GlobalZ) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY ,GlobalZ+1))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY ,GlobalZ-1))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ ))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ ))=0) + SkyLightValue=Voxel_GetSunLight(World,GlobalX+1,LocalY,GlobalZ) + + skyY0=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ ) + skyY1=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ ) + skyZ0=Voxel_GetSunLight(World,GlobalX+1,LocalY ,GlobalZ-1) + skyZ1=Voxel_GetSunLight(World,GlobalX+1,LocalY ,GlobalZ+1) - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ+1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ-1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ+1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ-1))=0) + sky00=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ-1) + sky01=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ+1) + sky10=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ-1) + sky11=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ+1) - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) + skyA00=SkyLightValue+skyY0+skyZ0+sky00 + skyA01=SkyLightValue+skyY0+skyZ1+sky01 + skyA10=SkyLightValue+skyY1+skyZ0+sky10 + skyA11=SkyLightValue+skyY1+skyZ1+sky11 + + BlockLightValue=Voxel_GetSunLight(World,GlobalX+1,LocalY,GlobalZ) + + blockY0=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) + blockY1=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) + blockZ0=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ-1) - Flipped=1 - if A00+A10A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceRight],LocalX,LocalY,LocalZ,FaceRight,A00,A01,A10,A11,Flipped,0,0,0,1,0.5,1,1,0.5) endif NeighbourBlockType=Voxel_GetBlockType(World,GlobalX-1,LocalY,GlobalZ) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY ,GlobalZ-1))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY ,GlobalZ+1))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ ))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ ))=0) + SkyLightValue=Voxel_GetSunLight(World,GlobalX-1,LocalY,GlobalZ) + + skyY0=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ ) + skyY1=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ ) + skyZ0=Voxel_GetSunLight(World,GlobalX-1,LocalY ,GlobalZ-1) + skyZ1=Voxel_GetSunLight(World,GlobalX-1,LocalY ,GlobalZ+1) - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ-1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ+1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ-1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ+1))=0) + sky00=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ-1) + sky01=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ+1) + sky10=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ-1) + sky11=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ+1) - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) + skyA00=SkyLightValue+skyY0+skyZ0+sky00 + skyA01=SkyLightValue+skyY0+skyZ1+sky01 + skyA10=SkyLightValue+skyY1+skyZ0+sky10 + skyA11=SkyLightValue+skyY1+skyZ1+sky11 + + BlockLightValue=Voxel_GetSunLight(World,GlobalX-1,LocalY,GlobalZ) + + blockY0=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) + blockY1=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) + blockZ0=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ-1) - Flipped=1 - if A00+A10A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceLeft],LocalX,LocalY,LocalZ,FaceLeft,A00,A01,A10,A11,Flipped,0,0,0,1,0.5,1,1,0.5) endif @@ -1525,174 +1662,312 @@ function Voxel_GenerateCubeFaces(Object ref as MeshData,World ref as WorldData,L CurrentBlockType=Voxel_GetBlockType(World,GlobalX,LocalY,GlobalZ) NeighbourBlockType=Voxel_GetBlockType(World,GlobalX,LocalY+1,GlobalZ) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ ))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ ))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX, LocalY+1,GlobalZ+1))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX, LocalY+1,GlobalZ-1))=0) + SkyLightValue=Voxel_GetSunLight(World,GlobalX,LocalY+1,GlobalZ) + + skyX0=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ ) + skyX1=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ ) + skyZ0=Voxel_GetSunLight(World,GlobalX, LocalY+1,GlobalZ-1) + skyZ1=Voxel_GetSunLight(World,GlobalX, LocalY+1,GlobalZ+1) - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ+1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ+1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ-1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ-1))=0) + sky00=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ-1) + sky01=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ+1) + sky10=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ-1) + sky11=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ+1) - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) + skyA00=SkyLightValue+skyX0+skyZ0+sky00 + skyA01=SkyLightValue+skyX0+skyZ1+sky01 + skyA10=SkyLightValue+skyX1+skyZ0+sky10 + skyA11=SkyLightValue+skyX1+skyZ1+sky11 + + BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY+1,GlobalZ) + + blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) + blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) + blockZ0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) - Flipped=0 - if A00+A10>A01+A11 then Flipped=1 + block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ-1) + block01=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ+1) + block10=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ-1) + block11=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ+1) - LightValue=Core_Max(Voxel_GetBlockLight(World,GlobalX,LocalY+1,GlobalZ),Voxel_GetSunLight(World,GlobalX,LocalY+1,GlobalZ))/15.0*255 - A00=LightValue-A00 - A01=LightValue-A01 - A10=LightValue-A10 - A11=LightValue-A11 + blockA00=BlockLightValue+blockX0+blockZ0+block00 + blockA01=BlockLightValue+blockX0+blockZ1+block01 + blockA10=BlockLightValue+blockX1+blockZ0+block10 + blockA11=BlockLightValue+blockX1+blockZ1+block11 + + A00=Core_Max(skyA00,blockA00) + A01=Core_Max(skyA01,blockA01) + A10=Core_Max(skyA10,blockA10) + A11=Core_Max(skyA11,blockA11) + + Flipped=0 + if A00+A11>A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceUp],LocalX,LocalY,LocalZ,FaceUp,A00,A01,A10,A11,Flipped,0,0,0,1,1,1,1,1) endif NeighbourBlockType=Voxel_GetBlockType(World,GlobalX,LocalY-1,GlobalZ) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ ))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ ))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX, LocalY-1,GlobalZ+1))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX, LocalY-1,GlobalZ-1))=0) + SkyLightValue=Voxel_GetSunLight(World,GlobalX,LocalY-1,GlobalZ) + + skyX0=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ ) + skyX1=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ ) + skyZ0=Voxel_GetSunLight(World,GlobalX, LocalY-1,GlobalZ-1) + skyZ1=Voxel_GetSunLight(World,GlobalX, LocalY-1,GlobalZ+1) - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ+1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ+1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ-1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ-1))=0) + sky00=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ-1) + sky01=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ+1) + sky10=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ-1) + sky11=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ+1) - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) + skyA00=SkyLightValue+skyX0+skyZ0+sky00 + skyA01=SkyLightValue+skyX0+skyZ1+sky01 + skyA10=SkyLightValue+skyX1+skyZ0+sky10 + skyA11=SkyLightValue+skyX1+skyZ1+sky11 + + BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY-1,GlobalZ) + + blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) + blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) + blockZ0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) - Flipped=1 - if A00+A10A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceDown],LocalX,LocalY,LocalZ,FaceDown,A00,A01,A10,A11,Flipped,0,0,0,1,1,1,1,1) endif NeighbourBlockType=Voxel_GetBlockType(World,GlobalX,LocalY,GlobalZ+1) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY ,GlobalZ+1))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY ,GlobalZ+1))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX ,LocalY+1,GlobalZ+1))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX ,LocalY-1,GlobalZ+1))=0) + SkyLightValue=Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ+1) + + skyX0=Voxel_GetSunLight(World,GlobalX-1,LocalY ,GlobalZ+1) + skyX1=Voxel_GetSunLight(World,GlobalX+1,LocalY ,GlobalZ+1) + skyY0=Voxel_GetSunLight(World,GlobalX, LocalY-1,GlobalZ+1) + skyY1=Voxel_GetSunLight(World,GlobalX, LocalY+1,GlobalZ+1) - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ+1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ+1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ+1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ+1))=0) + sky00=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ+1) + sky01=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ+1) + sky10=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ+1) + sky11=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ+1) - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) + skyA00=SkyLightValue+skyX0+skyY0+sky00 + skyA01=SkyLightValue+skyX0+skyY1+sky01 + skyA10=SkyLightValue+skyX1+skyY0+sky10 + skyA11=SkyLightValue+skyX1+skyY1+sky11 + + BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ+1) + + blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ+1) + blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ+1) + blockY0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) + blockY1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) - Flipped=0 - if A00+A10>A01+A11 then Flipped=1 + block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ+1) + block01=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ+1) + block10=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ+1) + block11=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ+1) - LightValue=Core_Max(Voxel_GetBlockLight(World,GlobalX,LocalY,GlobalZ+1),Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ+1))/15.0*255 - A00=LightValue-A00 - A01=LightValue-A01 - A10=LightValue-A10 - A11=LightValue-A11 + blockA00=BlockLightValue+blockX0+blockY0+block00 + blockA01=BlockLightValue+blockX0+blockY1+block01 + blockA10=BlockLightValue+blockX1+blockY0+block10 + blockA11=BlockLightValue+blockX1+blockY1+block11 + + A00=Core_Max(skyA00,blockA00) + A01=Core_Max(skyA01,blockA01) + A10=Core_Max(skyA10,blockA10) + A11=Core_Max(skyA11,blockA11) + + Flipped=0 + if A00+A11>A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceFront],LocalX,LocalY,LocalZ,FaceFront,A00,A01,A10,A11,Flipped,0,0,0,1,1,1,1,1) endif NeighbourBlockType=Voxel_GetBlockType(World,GlobalX,LocalY,GlobalZ-1) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY ,GlobalZ-1))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY ,GlobalZ-1))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX ,LocalY+1,GlobalZ-1))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX ,LocalY-1,GlobalZ-1))=0) + SkyLightValue=Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ-1) + + skyX0=Voxel_GetSunLight(World,GlobalX-1,LocalY ,GlobalZ-1) + skyX1=Voxel_GetSunLight(World,GlobalX+1,LocalY ,GlobalZ-1) + skyY0=Voxel_GetSunLight(World,GlobalX, LocalY-1,GlobalZ-1) + skyY1=Voxel_GetSunLight(World,GlobalX, LocalY+1,GlobalZ-1) - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ-1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ-1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ-1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ-1))=0) + sky00=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ-1) + sky01=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ-1) + sky10=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ-1) + sky11=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ-1) - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) + skyA00=SkyLightValue+skyX0+skyY0+sky00 + skyA01=SkyLightValue+skyX0+skyY1+sky01 + skyA10=SkyLightValue+skyX1+skyY0+sky10 + skyA11=SkyLightValue+skyX1+skyY1+sky11 + + BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ-1) + + blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ-1) + blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ-1) + blockY0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) + blockY1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) - Flipped=1 - if A00+A10A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceBack],LocalX,LocalY,LocalZ,FaceBack,A00,A01,A10,A11,Flipped,0,0,0,1,1,1,1,1) endif NeighbourBlockType=Voxel_GetBlockType(World,GlobalX+1,LocalY,GlobalZ) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY ,GlobalZ+1))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY ,GlobalZ-1))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ ))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ ))=0) + SkyLightValue=Voxel_GetSunLight(World,GlobalX+1,LocalY,GlobalZ) + + skyY0=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ ) + skyY1=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ ) + skyZ0=Voxel_GetSunLight(World,GlobalX+1,LocalY ,GlobalZ-1) + skyZ1=Voxel_GetSunLight(World,GlobalX+1,LocalY ,GlobalZ+1) - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ+1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ-1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ+1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ-1))=0) + sky00=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ-1) + sky01=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ+1) + sky10=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ-1) + sky11=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ+1) - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) + skyA00=SkyLightValue+skyY0+skyZ0+sky00 + skyA01=SkyLightValue+skyY0+skyZ1+sky01 + skyA10=SkyLightValue+skyY1+skyZ0+sky10 + skyA11=SkyLightValue+skyY1+skyZ1+sky11 + + BlockLightValue=Voxel_GetSunLight(World,GlobalX+1,LocalY,GlobalZ) + + blockY0=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) + blockY1=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) + blockZ0=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ-1) - Flipped=1 - if A00+A10A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceLeft],LocalX,LocalY,LocalZ,FaceRight,A00,A01,A10,A11,Flipped,0,0,0,1,1,1,1,1) endif NeighbourBlockType=Voxel_GetBlockType(World,GlobalX-1,LocalY,GlobalZ) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY ,GlobalZ-1))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY ,GlobalZ+1))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ ))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ ))=0) + SkyLightValue=Voxel_GetSunLight(World,GlobalX-1,LocalY,GlobalZ) + + skyY0=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ ) + skyY1=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ ) + skyZ0=Voxel_GetSunLight(World,GlobalX-1,LocalY ,GlobalZ-1) + skyZ1=Voxel_GetSunLight(World,GlobalX-1,LocalY ,GlobalZ+1) - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ-1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ+1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ-1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ+1))=0) + sky00=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ-1) + sky01=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ+1) + sky10=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ-1) + sky11=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ+1) - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) + skyA00=SkyLightValue+skyY0+skyZ0+sky00 + skyA01=SkyLightValue+skyY0+skyZ1+sky01 + skyA10=SkyLightValue+skyY1+skyZ0+sky10 + skyA11=SkyLightValue+skyY1+skyZ1+sky11 + + BlockLightValue=Voxel_GetSunLight(World,GlobalX-1,LocalY,GlobalZ) + + blockY0=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) + blockY1=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) + blockZ0=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ-1) - Flipped=1 - if A00+A10A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceRight],LocalX,LocalY,LocalZ,FaceLeft,A00,A01,A10,A11,Flipped,0,0,0,1,1,1,1,1) endif From 76bdba2a438adae0abc0e1775aaf37f398d207f8 Mon Sep 17 00:00:00 2001 From: nachoz12341 <40530732+nachoz12341@users.noreply.github.com> Date: Mon, 16 Sep 2024 14:02:36 -0500 Subject: [PATCH 2/4] Fix rendering for smooth lighting and make sure other models support it --- voxel.agc | 438 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 288 insertions(+), 150 deletions(-) diff --git a/voxel.agc b/voxel.agc index 504eead..ba7c560 100644 --- a/voxel.agc +++ b/voxel.agc @@ -1476,174 +1476,312 @@ function Voxel_GenerateCactusFaces(Object ref as MeshData,World ref as WorldData CurrentBlockType=Voxel_GetBlockType(World,GlobalX,LocalY,GlobalZ) NeighbourBlockType=Voxel_GetBlockType(World,GlobalX,LocalY+1,GlobalZ) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ ))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ ))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX, LocalY+1,GlobalZ+1))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX, LocalY+1,GlobalZ-1))=0) + SkyLightValue=Voxel_GetSunLight(World,GlobalX,LocalY+1,GlobalZ) + + skyX0=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ ) + skyX1=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ ) + skyZ0=Voxel_GetSunLight(World,GlobalX, LocalY+1,GlobalZ-1) + skyZ1=Voxel_GetSunLight(World,GlobalX, LocalY+1,GlobalZ+1) - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ+1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ+1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ-1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ-1))=0) + sky00=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ-1) + sky01=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ+1) + sky10=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ-1) + sky11=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ+1) - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) + skyA00=SkyLightValue+skyX0+skyZ0+sky00 + skyA01=SkyLightValue+skyX0+skyZ1+sky01 + skyA10=SkyLightValue+skyX1+skyZ0+sky10 + skyA11=SkyLightValue+skyX1+skyZ1+sky11 + + BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY+1,GlobalZ) + + blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) + blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) + blockZ0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) - Flipped=0 - if A00+A10>A01+A11 then Flipped=1 + block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ-1) + block01=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ+1) + block10=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ-1) + block11=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ+1) - LightValue=Core_Max(Voxel_GetBlockLight(World,GlobalX,LocalY+1,GlobalZ),Voxel_GetSunLight(World,GlobalX,LocalY+1,GlobalZ))/15.0*255 - A00=LightValue-A00 - A01=LightValue-A01 - A10=LightValue-A10 - A11=LightValue-A11 + blockA00=BlockLightValue+blockX0+blockZ0+block00 + blockA01=BlockLightValue+blockX0+blockZ1+block01 + blockA10=BlockLightValue+blockX1+blockZ0+block10 + blockA11=BlockLightValue+blockX1+blockZ1+block11 + + A00=Core_Max(skyA00,blockA00) + A01=Core_Max(skyA01,blockA01) + A10=Core_Max(skyA10,blockA10) + A11=Core_Max(skyA11,blockA11) + + Flipped=0 + if A00+A11>A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceUp],LocalX,LocalY,LocalZ,FaceUp,A00,A01,A10,A11,Flipped,0,0,0,1,1,1,1,1) endif NeighbourBlockType=Voxel_GetBlockType(World,GlobalX,LocalY-1,GlobalZ) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ ))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ ))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX, LocalY-1,GlobalZ+1))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX, LocalY-1,GlobalZ-1))=0) - - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ+1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ+1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ-1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ-1))=0) - - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) - - Flipped=1 - if A00+A10A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceDown],LocalX,LocalY,LocalZ,FaceDown,A00,A01,A10,A11,Flipped,0,0,0,1,1,1,1,1) endif NeighbourBlockType=Voxel_GetBlockType(World,GlobalX,LocalY,GlobalZ+1) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY ,GlobalZ+1))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY ,GlobalZ+1))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX ,LocalY+1,GlobalZ+1))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX ,LocalY-1,GlobalZ+1))=0) + SkyLightValue=Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ+1) + + skyX0=Voxel_GetSunLight(World,GlobalX-1,LocalY ,GlobalZ+1) + skyX1=Voxel_GetSunLight(World,GlobalX+1,LocalY ,GlobalZ+1) + skyY0=Voxel_GetSunLight(World,GlobalX, LocalY-1,GlobalZ+1) + skyY1=Voxel_GetSunLight(World,GlobalX, LocalY+1,GlobalZ+1) - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ+1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ+1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ+1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ+1))=0) + sky00=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ+1) + sky01=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ+1) + sky10=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ+1) + sky11=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ+1) - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) + skyA00=SkyLightValue+skyX0+skyY0+sky00 + skyA01=SkyLightValue+skyX0+skyY1+sky01 + skyA10=SkyLightValue+skyX1+skyY0+sky10 + skyA11=SkyLightValue+skyX1+skyY1+sky11 + + BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ+1) + + blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ+1) + blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ+1) + blockY0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) + blockY1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) - Flipped=0 - if A00+A10>A01+A11 then Flipped=1 + block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ+1) + block01=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ+1) + block10=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ+1) + block11=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ+1) - LightValue=Core_Max(Voxel_GetBlockLight(World,GlobalX,LocalY,GlobalZ+1),Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ+1))/15.0*255 - A00=LightValue-A00 - A01=LightValue-A01 - A10=LightValue-A10 - A11=LightValue-A11 + blockA00=BlockLightValue+blockX0+blockY0+block00 + blockA01=BlockLightValue+blockX0+blockY1+block01 + blockA10=BlockLightValue+blockX1+blockY0+block10 + blockA11=BlockLightValue+blockX1+blockY1+block11 + + A00=Core_Max(skyA00,blockA00) + A01=Core_Max(skyA01,blockA01) + A10=Core_Max(skyA10,blockA10) + A11=Core_Max(skyA11,blockA11) + + Flipped=0 + if A00+A11>A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceFront],LocalX,LocalY,LocalZ,FaceFront,A00,A01,A10,A11,Flipped,0,0,-1,1,1,1,1,1) endif NeighbourBlockType=Voxel_GetBlockType(World,GlobalX,LocalY,GlobalZ-1) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY ,GlobalZ-1))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY ,GlobalZ-1))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX ,LocalY+1,GlobalZ-1))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX ,LocalY-1,GlobalZ-1))=0) - - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ-1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ-1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ-1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ-1))=0) - - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) - - Flipped=1 - if A00+A10A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceBack],LocalX,LocalY,LocalZ,FaceBack,A00,A01,A10,A11,Flipped,0,0,1,1,1,1,1,1) endif NeighbourBlockType=Voxel_GetBlockType(World,GlobalX+1,LocalY,GlobalZ) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY ,GlobalZ+1))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY ,GlobalZ-1))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ ))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ ))=0) - - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ+1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY+1,GlobalZ-1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ+1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX+1,LocalY-1,GlobalZ-1))=0) - - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) - - Flipped=1 - if A00+A10A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceRight],LocalX,LocalY,LocalZ,FaceRight,A00,A01,A10,A11,Flipped,-1,0,0,1,1,1,1,1) endif NeighbourBlockType=Voxel_GetBlockType(World,GlobalX-1,LocalY,GlobalZ) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - side00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY ,GlobalZ-1))=0) - side01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY ,GlobalZ+1))=0) - side10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ ))=0) - side11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ ))=0) - - corner00=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ-1))=0) - corner01=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY+1,GlobalZ+1))=0) - corner10=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ-1))=0) - corner11=(Voxel_IsOpaqueBlock(Voxel_GetBlockType(World,GlobalX-1,LocalY-1,GlobalZ+1))=0) - - A00=Voxel_GetVertexAO(side10,side00,corner00) - A01=Voxel_GetVertexAO(side10,side01,corner01) - A10=Voxel_GetVertexAO(side11,side01,corner11) - A11=Voxel_GetVertexAO(side11,side00,corner10) - - Flipped=1 - if A00+A10A01+A10 then Flipped=1 + + A00=(A00/4)/15.0*255 + A01=(A01/4)/15.0*255 + A10=(A10/4)/15.0*255 + A11=(A11/4)/15.0*255 Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceLeft],LocalX,LocalY,LocalZ,FaceLeft,A00,A01,A10,A11,Flipped,1,0,0,1,1,1,1,1) endif @@ -2012,10 +2150,10 @@ function Voxel_AddFaceToObject(Object ref as MeshData,Subimage ref as SubimageDa Voxel_SetObjectFaceUV(Voxel_TempVertex[2],Left#,Bottom#) Voxel_SetObjectFaceUV(Voxel_TempVertex[3],Right#,Bottom#) - Voxel_SetObjectFaceColor(Voxel_TempVertex[0],A00,A00,A00,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[0],A11,A11,A11,255) Voxel_SetObjectFaceColor(Voxel_TempVertex[1],A01,A01,A01,255) - Voxel_SetObjectFaceColor(Voxel_TempVertex[2],A10,A10,A10,255) - Voxel_SetObjectFaceColor(Voxel_TempVertex[3],A11,A11,A11,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[2],A00,A00,A00,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[3],A10,A10,A10,255) //~ Voxel_SetObjectFaceTangent(Voxel_TempVertex[0],1,0,0) //~ Voxel_SetObjectFaceTangent(Voxel_TempVertex[1],1,0,0) @@ -2047,10 +2185,10 @@ function Voxel_AddFaceToObject(Object ref as MeshData,Subimage ref as SubimageDa Voxel_SetObjectFaceUV(Voxel_TempVertex[2],Left#,Bottom#) Voxel_SetObjectFaceUV(Voxel_TempVertex[3],Right#,Bottom#) - Voxel_SetObjectFaceColor(Voxel_TempVertex[0],A00,A00,A00,255) - Voxel_SetObjectFaceColor(Voxel_TempVertex[1],A01,A01,A01,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[0],A01,A01,A01,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[1],A11,A11,A11,255) Voxel_SetObjectFaceColor(Voxel_TempVertex[2],A10,A10,A10,255) - Voxel_SetObjectFaceColor(Voxel_TempVertex[3],A11,A11,A11,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[3],A00,A00,A00,255) //~ Voxel_SetObjectFaceTangent(Voxel_TempVertex[0],1,0,0) //~ Voxel_SetObjectFaceTangent(Voxel_TempVertex[1],1,0,0) @@ -2082,10 +2220,10 @@ function Voxel_AddFaceToObject(Object ref as MeshData,Subimage ref as SubimageDa Voxel_SetObjectFaceUV(Voxel_TempVertex[2],Left#,Bottom#) Voxel_SetObjectFaceUV(Voxel_TempVertex[3],Right#,Bottom#) - Voxel_SetObjectFaceColor(Voxel_TempVertex[0],A00,A00,A00,255) - Voxel_SetObjectFaceColor(Voxel_TempVertex[1],A01,A01,A01,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[0],A01,A01,A01,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[1],A11,A11,A11,255) Voxel_SetObjectFaceColor(Voxel_TempVertex[2],A10,A10,A10,255) - Voxel_SetObjectFaceColor(Voxel_TempVertex[3],A11,A11,A11,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[3],A00,A00,A00,255) //~ Voxel_SetObjectFaceTangent(Voxel_TempVertex[0],-1,0,0) //~ Voxel_SetObjectFaceTangent(Voxel_TempVertex[1],-1,0,0) @@ -2117,10 +2255,10 @@ function Voxel_AddFaceToObject(Object ref as MeshData,Subimage ref as SubimageDa Voxel_SetObjectFaceUV(Voxel_TempVertex[2],Left#,Bottom#) Voxel_SetObjectFaceUV(Voxel_TempVertex[3],Right#,Bottom#) - Voxel_SetObjectFaceColor(Voxel_TempVertex[0],A00,A00,A00,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[0],A11,A11,A11,255) Voxel_SetObjectFaceColor(Voxel_TempVertex[1],A01,A01,A01,255) - Voxel_SetObjectFaceColor(Voxel_TempVertex[2],A10,A10,A10,255) - Voxel_SetObjectFaceColor(Voxel_TempVertex[3],A11,A11,A11,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[2],A00,A00,A00,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[3],A10,A10,A10,255) //~ Voxel_SetObjectFaceTangent(Voxel_TempVertex[0],1,0,0) //~ Voxel_SetObjectFaceTangent(Voxel_TempVertex[1],1,0,0) @@ -2152,10 +2290,10 @@ function Voxel_AddFaceToObject(Object ref as MeshData,Subimage ref as SubimageDa Voxel_SetObjectFaceUV(Voxel_TempVertex[2],Left#,Bottom#) Voxel_SetObjectFaceUV(Voxel_TempVertex[3],Right#,Bottom#) - Voxel_SetObjectFaceColor(Voxel_TempVertex[0],A00,A00,A00,255) - Voxel_SetObjectFaceColor(Voxel_TempVertex[1],A01,A01,A01,255) - Voxel_SetObjectFaceColor(Voxel_TempVertex[2],A10,A10,A10,255) - Voxel_SetObjectFaceColor(Voxel_TempVertex[3],A11,A11,A11,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[0],A11,A11,A11,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[1],A10,A10,A10,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[2],A00,A00,A00,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[3],A01,A01,A01,255) //~ Voxel_SetObjectFaceTangent(Voxel_TempVertex[0],0,0,1) //~ Voxel_SetObjectFaceTangent(Voxel_TempVertex[1],0,0,1) @@ -2187,10 +2325,10 @@ function Voxel_AddFaceToObject(Object ref as MeshData,Subimage ref as SubimageDa Voxel_SetObjectFaceUV(Voxel_TempVertex[2],Left#,Bottom#) Voxel_SetObjectFaceUV(Voxel_TempVertex[3],Right#,Bottom#) - Voxel_SetObjectFaceColor(Voxel_TempVertex[0],A00,A00,A00,255) - Voxel_SetObjectFaceColor(Voxel_TempVertex[1],A01,A01,A01,255) - Voxel_SetObjectFaceColor(Voxel_TempVertex[2],A10,A10,A10,255) - Voxel_SetObjectFaceColor(Voxel_TempVertex[3],A11,A11,A11,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[0],A10,A10,A10,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[1],A11,A11,A11,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[2],A01,A01,A01,255) + Voxel_SetObjectFaceColor(Voxel_TempVertex[3],A00,A00,A00,255) //~ Voxel_SetObjectFaceTangent(Voxel_TempVertex[0],0,0,-1) //~ Voxel_SetObjectFaceTangent(Voxel_TempVertex[1],0,0,-1) From d582bd847f18ceae97bf8e34e768c1865ecca664 Mon Sep 17 00:00:00 2001 From: nachoz12341 <40530732+nachoz12341@users.noreply.github.com> Date: Mon, 16 Sep 2024 15:12:14 -0500 Subject: [PATCH 3/4] Bug fix smooth lighting --- voxel.agc | 236 +++++++++++++++++++++++++++--------------------------- 1 file changed, 117 insertions(+), 119 deletions(-) diff --git a/voxel.agc b/voxel.agc index ba7c560..3006a7b 100644 --- a/voxel.agc +++ b/voxel.agc @@ -1169,7 +1169,7 @@ function Voxel_GenerateSlabFaces(Object ref as MeshData,World ref as WorldData,L skyA10=SkyLightValue+skyX1+skyZ0+sky10 skyA11=SkyLightValue+skyX1+skyZ1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY+1,GlobalZ) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX,LocalY+1,GlobalZ) blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) @@ -1221,17 +1221,17 @@ function Voxel_GenerateSlabFaces(Object ref as MeshData,World ref as WorldData,L skyA10=SkyLightValue+skyX1+skyZ0+sky10 skyA11=SkyLightValue+skyX1+skyZ1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY-1,GlobalZ) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX,LocalY-1,GlobalZ) - blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) - blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) - blockZ0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) - blockZ1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) + blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ ) + blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ ) + blockZ0=Voxel_GetBlockLight(World,GlobalX, LocalY-1,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX, LocalY-1,GlobalZ+1) - block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ-1) - block01=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ+1) - block10=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ-1) - block11=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ+1) + block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ-1) + block01=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ+1) + block10=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ-1) + block11=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ+1) blockA00=BlockLightValue+blockX0+blockZ0+block00 blockA01=BlockLightValue+blockX0+blockZ1+block01 @@ -1255,7 +1255,7 @@ function Voxel_GenerateSlabFaces(Object ref as MeshData,World ref as WorldData,L endif NeighbourBlockType=Voxel_GetBlockType(World,GlobalX,LocalY,GlobalZ+1) - if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) + if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) SkyLightValue=Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ+1) skyX0=Voxel_GetSunLight(World,GlobalX-1,LocalY ,GlobalZ+1) @@ -1273,11 +1273,11 @@ function Voxel_GenerateSlabFaces(Object ref as MeshData,World ref as WorldData,L skyA10=SkyLightValue+skyX1+skyY0+sky10 skyA11=SkyLightValue+skyX1+skyY1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ+1) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX,LocalY,GlobalZ+1) blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ+1) blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ+1) - blockY0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) + blockY0=Voxel_GetBlockLight(World,GlobalX, LocalY-1,GlobalZ+1) blockY1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ+1) @@ -1325,11 +1325,11 @@ function Voxel_GenerateSlabFaces(Object ref as MeshData,World ref as WorldData,L skyA10=SkyLightValue+skyX1+skyY0+sky10 skyA11=SkyLightValue+skyX1+skyY1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ-1) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX,LocalY,GlobalZ-1) blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ-1) blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ-1) - blockY0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) + blockY0=Voxel_GetBlockLight(World,GlobalX, LocalY-1,GlobalZ-1) blockY1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ-1) @@ -1377,22 +1377,22 @@ function Voxel_GenerateSlabFaces(Object ref as MeshData,World ref as WorldData,L skyA10=SkyLightValue+skyY1+skyZ0+sky10 skyA11=SkyLightValue+skyY1+skyZ1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX+1,LocalY,GlobalZ) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX+1,LocalY,GlobalZ) - blockY0=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) + blockY0=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ ) blockY1=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) blockZ0=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ-1) - blockZ1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ+1) block00=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ-1) block01=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ+1) block10=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ-1) block11=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ+1) - blockA00=BlockLightValue+blockX0+blockY0+block00 - blockA01=BlockLightValue+blockX0+blockY1+block01 - blockA10=BlockLightValue+blockX1+blockY0+block10 - blockA11=BlockLightValue+blockX1+blockY1+block11 + blockA00=BlockLightValue+blockY0+blockZ0+block00 + blockA01=BlockLightValue+blockY0+blockZ1+block01 + blockA10=BlockLightValue+blockY1+blockZ0+block10 + blockA11=BlockLightValue+blockY1+blockZ1+block11 A00=Core_Max(skyA00,blockA00) A01=Core_Max(skyA01,blockA01) @@ -1429,22 +1429,22 @@ function Voxel_GenerateSlabFaces(Object ref as MeshData,World ref as WorldData,L skyA10=SkyLightValue+skyY1+skyZ0+sky10 skyA11=SkyLightValue+skyY1+skyZ1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX-1,LocalY,GlobalZ) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX-1,LocalY,GlobalZ) - blockY0=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) + blockY0=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ ) blockY1=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) blockZ0=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ-1) - blockZ1=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ+1) block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ-1) block01=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ+1) block10=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ-1) block11=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ+1) - blockA00=BlockLightValue+blockX0+blockY0+block00 - blockA01=BlockLightValue+blockX0+blockY1+block01 - blockA10=BlockLightValue+blockX1+blockY0+block10 - blockA11=BlockLightValue+blockX1+blockY1+block11 + blockA00=BlockLightValue+blockY0+blockZ0+block00 + blockA01=BlockLightValue+blockY0+blockZ1+block01 + blockA10=BlockLightValue+blockY1+blockZ0+block10 + blockA11=BlockLightValue+blockY1+blockZ1+block11 A00=Core_Max(skyA00,blockA00) A01=Core_Max(skyA01,blockA01) @@ -1458,7 +1458,6 @@ function Voxel_GenerateSlabFaces(Object ref as MeshData,World ref as WorldData,L A01=(A01/4)/15.0*255 A10=(A10/4)/15.0*255 A11=(A11/4)/15.0*255 - Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceLeft],LocalX,LocalY,LocalZ,FaceLeft,A00,A01,A10,A11,Flipped,0,0,0,1,0.5,1,1,0.5) endif endfunction @@ -1493,7 +1492,7 @@ function Voxel_GenerateCactusFaces(Object ref as MeshData,World ref as WorldData skyA10=SkyLightValue+skyX1+skyZ0+sky10 skyA11=SkyLightValue+skyX1+skyZ1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY+1,GlobalZ) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX,LocalY+1,GlobalZ) blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) @@ -1522,7 +1521,6 @@ function Voxel_GenerateCactusFaces(Object ref as MeshData,World ref as WorldData A01=(A01/4)/15.0*255 A10=(A10/4)/15.0*255 A11=(A11/4)/15.0*255 - Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceUp],LocalX,LocalY,LocalZ,FaceUp,A00,A01,A10,A11,Flipped,0,0,0,1,1,1,1,1) endif @@ -1545,17 +1543,17 @@ function Voxel_GenerateCactusFaces(Object ref as MeshData,World ref as WorldData skyA10=SkyLightValue+skyX1+skyZ0+sky10 skyA11=SkyLightValue+skyX1+skyZ1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY-1,GlobalZ) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX,LocalY-1,GlobalZ) - blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) - blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) - blockZ0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) - blockZ1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) + blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ ) + blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ ) + blockZ0=Voxel_GetBlockLight(World,GlobalX, LocalY-1,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX, LocalY-1,GlobalZ+1) - block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ-1) - block01=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ+1) - block10=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ-1) - block11=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ+1) + block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ-1) + block01=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ+1) + block10=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ-1) + block11=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ+1) blockA00=BlockLightValue+blockX0+blockZ0+block00 blockA01=BlockLightValue+blockX0+blockZ1+block01 @@ -1597,11 +1595,11 @@ function Voxel_GenerateCactusFaces(Object ref as MeshData,World ref as WorldData skyA10=SkyLightValue+skyX1+skyY0+sky10 skyA11=SkyLightValue+skyX1+skyY1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ+1) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX,LocalY,GlobalZ+1) blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ+1) blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ+1) - blockY0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) + blockY0=Voxel_GetBlockLight(World,GlobalX, LocalY-1,GlobalZ+1) blockY1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ+1) @@ -1649,11 +1647,11 @@ function Voxel_GenerateCactusFaces(Object ref as MeshData,World ref as WorldData skyA10=SkyLightValue+skyX1+skyY0+sky10 skyA11=SkyLightValue+skyX1+skyY1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ-1) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX,LocalY,GlobalZ-1) blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ-1) blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ-1) - blockY0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) + blockY0=Voxel_GetBlockLight(World,GlobalX, LocalY-1,GlobalZ-1) blockY1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ-1) @@ -1684,39 +1682,39 @@ function Voxel_GenerateCactusFaces(Object ref as MeshData,World ref as WorldData NeighbourBlockType=Voxel_GetBlockType(World,GlobalX+1,LocalY,GlobalZ) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - SkyLightValue=Voxel_GetSunLight(World,GlobalX-1,LocalY,GlobalZ) + SkyLightValue=Voxel_GetSunLight(World,GlobalX+1,LocalY,GlobalZ) - skyY0=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ ) - skyY1=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ ) - skyZ0=Voxel_GetSunLight(World,GlobalX-1,LocalY ,GlobalZ-1) - skyZ1=Voxel_GetSunLight(World,GlobalX-1,LocalY ,GlobalZ+1) + skyY0=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ ) + skyY1=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ ) + skyZ0=Voxel_GetSunLight(World,GlobalX+1,LocalY ,GlobalZ-1) + skyZ1=Voxel_GetSunLight(World,GlobalX+1,LocalY ,GlobalZ+1) - sky00=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ-1) - sky01=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ+1) - sky10=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ-1) - sky11=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ+1) + sky00=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ-1) + sky01=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ+1) + sky10=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ-1) + sky11=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ+1) skyA00=SkyLightValue+skyY0+skyZ0+sky00 skyA01=SkyLightValue+skyY0+skyZ1+sky01 skyA10=SkyLightValue+skyY1+skyZ0+sky10 skyA11=SkyLightValue+skyY1+skyZ1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX-1,LocalY,GlobalZ) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX+1,LocalY,GlobalZ) - blockY0=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) - blockY1=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) - blockZ0=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ-1) - blockZ1=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ-1) + blockY0=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ ) + blockY1=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) + blockZ0=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ+1) - block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ-1) - block01=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ+1) - block10=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ-1) - block11=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ+1) + block00=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ-1) + block01=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ+1) + block10=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ-1) + block11=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ+1) - blockA00=BlockLightValue+blockX0+blockY0+block00 - blockA01=BlockLightValue+blockX0+blockY1+block01 - blockA10=BlockLightValue+blockX1+blockY0+block10 - blockA11=BlockLightValue+blockX1+blockY1+block11 + blockA00=BlockLightValue+blockY0+blockZ0+block00 + blockA01=BlockLightValue+blockY0+blockZ1+block01 + blockA10=BlockLightValue+blockY1+blockZ0+block10 + blockA11=BlockLightValue+blockY1+blockZ1+block11 A00=Core_Max(skyA00,blockA00) A01=Core_Max(skyA01,blockA01) @@ -1736,39 +1734,39 @@ function Voxel_GenerateCactusFaces(Object ref as MeshData,World ref as WorldData NeighbourBlockType=Voxel_GetBlockType(World,GlobalX-1,LocalY,GlobalZ) if not(Voxel_IsOpaqueBlock(NeighbourBlockType) or Voxel_JoinFace(CurrentBlockType,NeighbourBlockType)) - SkyLightValue=Voxel_GetSunLight(World,GlobalX+1,LocalY,GlobalZ) + SkyLightValue=Voxel_GetSunLight(World,GlobalX-1,LocalY,GlobalZ) - skyY0=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ ) - skyY1=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ ) - skyZ0=Voxel_GetSunLight(World,GlobalX+1,LocalY ,GlobalZ-1) - skyZ1=Voxel_GetSunLight(World,GlobalX+1,LocalY ,GlobalZ+1) + skyY0=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ ) + skyY1=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ ) + skyZ0=Voxel_GetSunLight(World,GlobalX-1,LocalY ,GlobalZ-1) + skyZ1=Voxel_GetSunLight(World,GlobalX-1,LocalY ,GlobalZ+1) - sky00=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ-1) - sky01=Voxel_GetSunLight(World,GlobalX+1,LocalY-1,GlobalZ+1) - sky10=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ-1) - sky11=Voxel_GetSunLight(World,GlobalX+1,LocalY+1,GlobalZ+1) + sky00=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ-1) + sky01=Voxel_GetSunLight(World,GlobalX-1,LocalY-1,GlobalZ+1) + sky10=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ-1) + sky11=Voxel_GetSunLight(World,GlobalX-1,LocalY+1,GlobalZ+1) skyA00=SkyLightValue+skyY0+skyZ0+sky00 skyA01=SkyLightValue+skyY0+skyZ1+sky01 skyA10=SkyLightValue+skyY1+skyZ0+sky10 skyA11=SkyLightValue+skyY1+skyZ1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX+1,LocalY,GlobalZ) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX-1,LocalY,GlobalZ) - blockY0=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) - blockY1=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) - blockZ0=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ-1) - blockZ1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ-1) + blockY0=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ ) + blockY1=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) + blockZ0=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ+1) - block00=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ-1) - block01=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ+1) - block10=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ-1) - block11=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ+1) + block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ-1) + block01=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ+1) + block10=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ-1) + block11=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ+1) - blockA00=BlockLightValue+blockX0+blockY0+block00 - blockA01=BlockLightValue+blockX0+blockY1+block01 - blockA10=BlockLightValue+blockX1+blockY0+block10 - blockA11=BlockLightValue+blockX1+blockY1+block11 + blockA00=BlockLightValue+blockY0+blockZ0+block00 + blockA01=BlockLightValue+blockY0+blockZ1+block01 + blockA10=BlockLightValue+blockY1+blockZ0+block10 + blockA11=BlockLightValue+blockY1+blockZ1+block11 A00=Core_Max(skyA00,blockA00) A01=Core_Max(skyA01,blockA01) @@ -1817,7 +1815,7 @@ function Voxel_GenerateCubeFaces(Object ref as MeshData,World ref as WorldData,L skyA10=SkyLightValue+skyX1+skyZ0+sky10 skyA11=SkyLightValue+skyX1+skyZ1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY+1,GlobalZ) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX,LocalY+1,GlobalZ) blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) @@ -1869,17 +1867,17 @@ function Voxel_GenerateCubeFaces(Object ref as MeshData,World ref as WorldData,L skyA10=SkyLightValue+skyX1+skyZ0+sky10 skyA11=SkyLightValue+skyX1+skyZ1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY-1,GlobalZ) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX,LocalY-1,GlobalZ) - blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) - blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) - blockZ0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) - blockZ1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) + blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ ) + blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ ) + blockZ0=Voxel_GetBlockLight(World,GlobalX, LocalY-1,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX, LocalY-1,GlobalZ+1) - block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ-1) - block01=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ+1) - block10=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ-1) - block11=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ+1) + block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ-1) + block01=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ+1) + block10=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ-1) + block11=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ+1) blockA00=BlockLightValue+blockX0+blockZ0+block00 blockA01=BlockLightValue+blockX0+blockZ1+block01 @@ -1921,11 +1919,11 @@ function Voxel_GenerateCubeFaces(Object ref as MeshData,World ref as WorldData,L skyA10=SkyLightValue+skyX1+skyY0+sky10 skyA11=SkyLightValue+skyX1+skyY1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ+1) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX,LocalY,GlobalZ+1) blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ+1) blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ+1) - blockY0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) + blockY0=Voxel_GetBlockLight(World,GlobalX, LocalY-1,GlobalZ+1) blockY1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ+1) block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ+1) @@ -1973,11 +1971,11 @@ function Voxel_GenerateCubeFaces(Object ref as MeshData,World ref as WorldData,L skyA10=SkyLightValue+skyX1+skyY0+sky10 skyA11=SkyLightValue+skyX1+skyY1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX,LocalY,GlobalZ-1) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX,LocalY,GlobalZ-1) blockX0=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ-1) blockX1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ-1) - blockY0=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) + blockY0=Voxel_GetBlockLight(World,GlobalX, LocalY-1,GlobalZ-1) blockY1=Voxel_GetBlockLight(World,GlobalX, LocalY+1,GlobalZ-1) block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ-1) @@ -2025,22 +2023,22 @@ function Voxel_GenerateCubeFaces(Object ref as MeshData,World ref as WorldData,L skyA10=SkyLightValue+skyY1+skyZ0+sky10 skyA11=SkyLightValue+skyY1+skyZ1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX+1,LocalY,GlobalZ) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX+1,LocalY,GlobalZ) - blockY0=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) + blockY0=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ ) blockY1=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ ) blockZ0=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ-1) - blockZ1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX+1,LocalY ,GlobalZ+1) block00=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ-1) block01=Voxel_GetBlockLight(World,GlobalX+1,LocalY-1,GlobalZ+1) block10=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ-1) block11=Voxel_GetBlockLight(World,GlobalX+1,LocalY+1,GlobalZ+1) - blockA00=BlockLightValue+blockX0+blockY0+block00 - blockA01=BlockLightValue+blockX0+blockY1+block01 - blockA10=BlockLightValue+blockX1+blockY0+block10 - blockA11=BlockLightValue+blockX1+blockY1+block11 + blockA00=BlockLightValue+blockY0+blockZ0+block00 + blockA01=BlockLightValue+blockY0+blockZ1+block01 + blockA10=BlockLightValue+blockY1+blockZ0+block10 + blockA11=BlockLightValue+blockY1+blockZ1+block11 A00=Core_Max(skyA00,blockA00) A01=Core_Max(skyA01,blockA01) @@ -2055,7 +2053,7 @@ function Voxel_GenerateCubeFaces(Object ref as MeshData,World ref as WorldData,L A10=(A10/4)/15.0*255 A11=(A11/4)/15.0*255 - Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceLeft],LocalX,LocalY,LocalZ,FaceRight,A00,A01,A10,A11,Flipped,0,0,0,1,1,1,1,1) + Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceRight],LocalX,LocalY,LocalZ,FaceRight,A00,A01,A10,A11,Flipped,0,0,0,1,1,1,1,1) endif NeighbourBlockType=Voxel_GetBlockType(World,GlobalX-1,LocalY,GlobalZ) @@ -2077,22 +2075,22 @@ function Voxel_GenerateCubeFaces(Object ref as MeshData,World ref as WorldData,L skyA10=SkyLightValue+skyY1+skyZ0+sky10 skyA11=SkyLightValue+skyY1+skyZ1+sky11 - BlockLightValue=Voxel_GetSunLight(World,GlobalX-1,LocalY,GlobalZ) + BlockLightValue=Voxel_GetBlockLight(World,GlobalX-1,LocalY,GlobalZ) - blockY0=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) + blockY0=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ ) blockY1=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ ) blockZ0=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ-1) - blockZ1=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ-1) + blockZ1=Voxel_GetBlockLight(World,GlobalX-1,LocalY ,GlobalZ+1) block00=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ-1) block01=Voxel_GetBlockLight(World,GlobalX-1,LocalY-1,GlobalZ+1) block10=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ-1) block11=Voxel_GetBlockLight(World,GlobalX-1,LocalY+1,GlobalZ+1) - blockA00=BlockLightValue+blockX0+blockY0+block00 - blockA01=BlockLightValue+blockX0+blockY1+block01 - blockA10=BlockLightValue+blockX1+blockY0+block10 - blockA11=BlockLightValue+blockX1+blockY1+block11 + blockA00=BlockLightValue+blockY0+blockZ0+block00 + blockA01=BlockLightValue+blockY0+blockZ1+block01 + blockA10=BlockLightValue+blockY1+blockZ0+block10 + blockA11=BlockLightValue+blockY1+blockZ1+block11 A00=Core_Max(skyA00,blockA00) A01=Core_Max(skyA01,blockA01) @@ -2107,7 +2105,7 @@ function Voxel_GenerateCubeFaces(Object ref as MeshData,World ref as WorldData,L A10=(A10/4)/15.0*255 A11=(A11/4)/15.0*255 - Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceRight],LocalX,LocalY,LocalZ,FaceLeft,A00,A01,A10,A11,Flipped,0,0,0,1,1,1,1,1) + Voxel_AddFaceToObject(Object,Voxel_TempSubimages[FaceLeft],LocalX,LocalY,LocalZ,FaceLeft,A00,A01,A10,A11,Flipped,0,0,0,1,1,1,1,1) endif endfunction From 68572b1cad01413c50eb89074f61eb70a36b33b7 Mon Sep 17 00:00:00 2001 From: jan610 Date: Mon, 16 Sep 2024 22:25:28 +0200 Subject: [PATCH 4/4] small UpdateBlockShadow fix --- voxel.agc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/voxel.agc b/voxel.agc index 3006a7b..db6bb72 100644 --- a/voxel.agc +++ b/voxel.agc @@ -617,13 +617,13 @@ function Voxel_UpdateBlockLight(World ref as WorldData,ChunkX,ChunkZ,LocalX,Loca NeighbourChunkZ=trunc(NeighbourZ/Voxel_ChunkSize) if Voxel_IsTransparentBlock(World.Chunk[NeighbourChunkX,NeighbourChunkZ].BlockType[NeighbourLocalX,NeighbourY,NeighbourLocalZ])=1 - CurrentBlockLight=Voxel_GetBlockLight(World,GlobalX,GlobalY,GlobalZ) - if CurrentBlockLight>World.Chunk[NeighbourChunkX,NeighbourChunkZ].BlockLight[NeighbourLocalX,NeighbourY,NeighbourLocalZ]+1 + CurrentBlockLight=Voxel_GetBlockLight(World,GlobalX,GlobalY,GlobalZ)-1 + if CurrentBlockLight>World.Chunk[NeighbourChunkX,NeighbourChunkZ].BlockLight[NeighbourLocalX,NeighbourY,NeighbourLocalZ] FrontierTemp.X=NeighbourX FrontierTemp.Y=NeighbourY FrontierTemp.Z=NeighbourZ Frontier.insert(FrontierTemp) - World.Chunk[NeighbourChunkX,NeighbourChunkZ].BlockLight[NeighbourLocalX,NeighbourY,NeighbourLocalZ]=CurrentBlockLight-1 + World.Chunk[NeighbourChunkX,NeighbourChunkZ].BlockLight[NeighbourLocalX,NeighbourY,NeighbourLocalZ]=CurrentBlockLight Voxel_AddChunktoLoadList(NeighbourChunkX,NeighbourChunkZ) endif @@ -683,7 +683,7 @@ function Voxel_UpdateBlockShadow(World ref as WorldData,ChunkX,ChunkZ,LocalX,Loc TempSpreadLight.X=NeighbourX TempSpreadLight.Y=NeighbourY TempSpreadLight.Z=NeighbourZ - TempSpreadLight.Light=NeighbourBlockLight + TempSpreadLight.Light=NeighbourBlockLight-2 Voxel_SpreadLight.insert(TempSpreadLight) endif endif