About 10% of the time the bottom floor texture doesn't repeat to the second floor. Is there a way to ensure the same texture is used for all floors? See image below. I also noticed my roof texture doesn't follow the edge where the roofline meets the facade. I'm using v 2020.0
Thank you
You will have to share your CGA code if you want a good answer.
Thanks, Brian. Here is the code.
/**
* File: Res_Rule.cga
* Created: 14 Oct 2020 19:16:56 GMT
* Author: bhammer
*/
version "2020.0"
@Range (min=0, max=3, stepsize=1)
attr LOD = 0
@Range (min=3, max=6.25, stepsize=.25)
attr BldgHeight = 4
const RandomFacadeTextureRES = fileRandom("/San_Saba/assets/Facades/Residential/Window/*")
const RandomFacadeTextureRES_NoWindow = fileRandom("/San_Saba/assets/Facades/Residential/NoWindow/*")
const RandomWindowTextureRES = fileRandom("/San_Saba/assets/Windows/Residential/*")
const RandomRoofTextureHIP_RES = fileRandom("/San_Saba/assets/Roofs/Residential/Hip/*")
const RandomDoorTexture = fileRandom("/San_Saba/assets/Doors/*")
BasementTex = "assets/Facades/Basement/Facade_Basement.jpg"
Lot -->
extrude (BldgHeight)
Mass
Mass -->
Residential
Residential -->
case LOD == 0 :
comp(f)
{all: Res}
case LOD == 1 :
comp(f)
{top : ResTop |
side : ResSide |
bottom : Basement
}
case LOD > 1 :
comp(f)
{top : ResTop |
left : ResLeft |
right : ResRight |
front : ResFront |
back : ResBack |
bottom : Basement
}
else :
comp(f)
{all : Res}
Res -->
color("#FF6767")
ResTop -->
ResRoofHip
ResRoofHip -->
case LOD > 2 :
roofHip(15,.5)
setupProjection(0, scope.xz, 8, 8, 0, 0, 0)
texture(RandomRoofTextureHIP_RES)
projectUV(0)
else :
roofHip(15)
setupProjection(0, scope.xz, 8, 8, 0, 0, 0)
texture(RandomRoofTextureHIP_RES)
projectUV(0)
ResSide -->
case LOD == 1 :
ResWallWindow
case LOD >= 2 :
case geometry.height < 4.25 :
split(y)
{ 2.5 : ResFloor |
~3 : ResWallNoWindow
}
else :
split(y)
{ 2.5 : ResFloor |
{~3 : ResFloor}*
}
else :
ResWallWindow
ResWallWindow -->
setupProjection(0, scope.xy, 3, 3, .5, 0, 0)
texture(RandomFacadeTextureRES)
projectUV(0)
ResFloor -->
// case LOD == 1 : ResWallWindow
case LOD > 2 :
split(x)
{ 1 : ResWallNoWindow
| { ~2.3 : ResWindowTile }*
| 1 : ResWallNoWindow
}
else: ResWallWindow
ResWallNoWindow -->
case LOD == 3 :
s('1,'1,0.4)
t(0,0,-0.4)
primitiveCube()
setupProjection(0, scope.xy, 3, 3, .5, 0, 0)
texture(RandomFacadeTextureRES_NoWindow)
projectUV(0)
else :
setupProjection(0, scope.xy, 3, 3, .5, 0, 0)
texture(RandomFacadeTextureRES_NoWindow)
projectUV(0)
ResWindowTile -->
split(x)
{ ~1 : ResWallNoWindow
| 1 : split(y)
{ ~1 : ResWallNoWindow |
1.55 : ResWindow |
~1 : ResWallNoWindow
}
| ~1 : ResWallNoWindow
}
ResWindow -->
case LOD == 3 :
s('1,'1,.15)
t(0,0,-.1)
i("builtin:cube")
setupProjection(0,scope.xy,scope.sx,scope.sy)
texture(RandomWindowTextureRES)
projectUV(0)
else :
s('1,'1,-1.0)
t(0,0,0)
setupProjection(0,scope.xy,scope.sx,scope.sy)
texture(RandomWindowTextureRES)
projectUV(0)
ResLeft -->
case geometry.height < 4.25 :
split(y)
{ 2.5 : ResFloor |
~3 : ResWallNoWindow
}
else :
split(y)
{ 2.5 : ResFloor |
{~3 : ResFloor}*
}
ResRight -->
case geometry.height < 4.25 :
split(y)
{ 2.5 : ResFloor |
~3 : ResWallNoWindow
}
else :
split(y)
{ 2.5 : ResFloor |
{~3 : ResFloor}*
}
ResFront -->
case LOD > 1 :
case geometry.height < 4.25 :
split(y)
{ 2.5 : ResGrndFloor |
{~3 : ResWallNoWindow}* }
else :
split(y)
{ 2.5 : ResGrndFloor |
{~3 : ResFloor}* }
else : ResGrndFloor
ResBack -->
case LOD > 1 :
case geometry.height < 5 :
split(y)
{ 2.5 : ResFloor |
~3 : ResWallNoWindow
}
else :
split(y)
{ 2.5 : ResFloor |
{~3 : ResFloor}*
}
else : ResWallWindow
ResGrndFloor -->
case LOD == 1 :
split(x){
~1 : ResWallWindow |
1 : ResEntTile |
~1 : ResWallWindow
}
case LOD == 2 :
split(x){
~1 : ResWallWindow |
1 : ResEntTile |
~1 : ResWallWindow
}
case LOD > 2 :
split(x){
~1 : ResWindowGrndFloorTile |
1 : ResEntTile |
~1 : ResWindowGrndFloorTile
}
else :
split(x)
{1:ResEntTile}
ResEntTile -->
split(x){
~1 : ResWallNoWindow
| 1 : ResDoor
| ~1 : ResWallNoWindow
}
ResWindowGrndFloorTile -->
split(x){
~1 : ResWallNoWindow
| 1 :
split(y)
{ ~1 : ResWallNoWindow |
1.55 : ResWindow |
~1 : ResWallNoWindow
}
| ~1 : ResWallNoWindow
}*
ResDoor -->
case LOD == 3 :
s('1,'1,0.1)
t(0,0,-.2)
texture(RandomDoorTexture)
primitiveCube()
else :
s('1,'1,-1.0)
t(0,0,0)
setupProjection(0,scope.xy,scope.sx,scope.sy)
texture(RandomDoorTexture)
projectUV(0)
Basement -->
extrude(3)
comp(f)
{side:
BasementFacade |
bottom: NIL |
top: NIL
}
BasementFacade -->
setupProjection(0, scope.xy, 10, 15, 1, 0, 0)
texture(BasementTex)
projectUV(0)
For the texture switch issues, I think you have the texture switch for windows set at different Y heights for different faces. Make sure they are all the same Y heights. That's my hunch. Or maybe you are refering to your LOD2. I think you are referencing the wrong texture on that.
For the roof, I think you might be looking at the 0.5 overhang on LOD2 for the RoofPlane? Set that to 0. That's my guess at your issue.
Let me know if that helps.
Hi Brian,
Thank you for looking over the code. The problem seems to occur at LOD2, when I switch to LOD3 the textures are all correct.
I checked the Y heights and made sure they were all the same. Still having the same issue.
-Ben
From what I read, I think you want the texture on the first floor to be the same as the texture on the second floor. When LOD=2, this is not always the case. Here is why.
For example, when BldgHeight=4 (default value) and LOD=2, the first floor is textured in the rule ResWallWindow with the texture RandomFacadeTextureRES, and the second floor is textured in the rule ResWallNoWindow with the texture RandomFacadeTextureRES_NoWindow. The first and second floors, therefore, have different textures in this case.
Tip: You can use the Model Hierarchy (Window -> Model Hierarchy -> Inspect Model) to see which piece of code generates a certain part of the model. Click on a part of the model in the viewport, and its corresponding node will be highlighted in the Model Hierarchy. Double click on that node to go to its corresponding rule in the cga code.
This screenshot of your rule applied to a footprint shows what I mean by first (pink) and second (blue) floors. The lowest floor is the underground (basement) part of your rule.
With regards to the roof problem you mentioned, I'm not sure what you want to happen with the roof.