Stage 1: Rise and Shine
Part 1
For part 1 of stage 1, my modeling approach was relatively simple: I used the Arc.ByCenterPointRadiusAngle node to create arc-shaped wall surface using number sliders as inputs for the radius, start angle, and end angle — in the screenshots, my radius is set to 25 and my start angle is 0 with an end angle of 180. I extruded the curve in the z-direction using a number slider to signify the wall height, which in the screenshot is set to 25.
When panelizing the wall surface, in order to keep the panels square I used a number slider to signify the panel dimensions (both width and length) and then divided the height and length of the arc surface by that number to use as the inputs for number of panels in the u and v directions, respectively. I used the lunchbox Panel.PanelQuad node to place the adaptive panels.
I chose to read an image file of the milky way I took from the NASA website. I had to reverse the list of sampled colors from the image in order for them to map correctly onto the surface.
Part 2
For part 1 stage 2, I wanted to play with a color gradient and see how changing the panel heights based on the brightness would affect a curved surface. To create the serpentine wall surface, I used a code block to come up with a range of numbers starting at 0 and ending at a changeable end point with a changeable step value using two number sliders, then I fed these points in as the x-values in the Point.ByCoordinates node. I used another code block to set the y-values of the points as the Sin of the x-values, using number sliders to include changeable parameters for the wave amplitude and number of waves. I connected these points into a nurbs curve then extruded it in the z-direction using a number slider as a changeable input for the wall height.
To create roughly 4x8 panels, I divided the length of the controlling curve by 8 and the height of the wall by 4, then used the Math.Floor to round down to the nearest integer to use as the u and v inputs for the lunchbox Panel.PanelQuad node. Same as in stage 1, I used the output points to place the adaptive panels. Then, I read an image of a color gradient with high brightness contrast and sampled the colors, then mapped the sampled colors onto the panels to make sure the image was oriented correctly. Then, I extracted the brightness values from the list of colors and remapped the range of values to a minimum of 4 and a maximum of 36, then set those new values as the height parameter for the panels.
Stage 2: Gonna Need Shades
For stage 2, I created a simple, resizable two-story structure with separate number sliders as inputs for the following: length of the lower level, depth/width of the lower level, height of the lower level, offset distance between the footprints of the lower level and the upper level, and height of the upper level. In the screenshots above, the base rectangle is 20x20, the upper level is offset by -5, and both levels have a height of 10. I found it easiest to work with smaller numbers when creating the structure so I could keep things running quickly.
Since I used the Surface.ByPatch and Surface.PerimeterCurves nodes to break my two levels into four separate wall surfaces, I created two lists, one with the wall surfaces from both levels, and another with the wall curves/lines from both levels so that I can extract the length of each individual wall. That way, I could use a code block to divide the length of each wall segment by a value specifying the panel width (from a number slider) to use as the input for number of panels in the u direction in the Panel.PanelQuad lunchbox node.
I flattened the output list of points from Panel.PanelQuad and fed that list into the custom QuadPoints_Rotate node with the desiredRotation set to 1 so that when I placed the adaptive panels with rotating shades the shade would be placed on the side.
I used the custom Panels.ComputeSunDirectnessOutwardNormals node (which contains the custom PanelNormals.AllPointUpward and PanelNormals.AllPointOutward custom nodes) to compute the strength of sun directness to the panels using the current sun settings, and I used the watch functions within the node to make sure it was running correctly. I remapped the output of the unscaled dot products to a range of 0 to 1, which produced the same list as the output of the scaledDirectnessValues from the custom node.
I used the scaled list as the input values to produce a color range from red to yellow to white, then remapped these colors onto the panels, with white signifying the highest directness values and red signifying the lowest. I also remapped the list of unscaled dot products to a range of 0 to 89, which I set as the shade rotation parameter for the panels. Finally, I set the shade height to be the same as the panel height.