From e1a1471058f6e77a58670fb8aa9a15a658b21c8a Mon Sep 17 00:00:00 2001 From: Ananth Venkatesh Date: Sat, 15 Feb 2025 01:18:58 -0500 Subject: [PATCH] feat: add entries page --- assets/img/jentry.png | Bin 0 -> 45614 bytes elm.json | 1 + src/Main.elm | 712 +++++++++++++++++++++++++++++++++++++++++- 3 files changed, 710 insertions(+), 3 deletions(-) create mode 100644 assets/img/jentry.png diff --git a/assets/img/jentry.png b/assets/img/jentry.png new file mode 100644 index 0000000000000000000000000000000000000000..a00c8ae87074dbe784eb86547d3eefa1df981b87 GIT binary patch literal 45614 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 Float -> Float @@ -118,6 +149,67 @@ canonicalize angle = modulo 360 angle +frac : Float -> Float +frac x = + x - toFloat (floor x) + + +mainColors : List ( Float, Float, Float ) +mainColors = + [ ( 173, 111, 101 ), ( 200, 0, 100 ), ( 100, 0, 200 ), ( 100, 200, 0 ), ( 200, 100, 0 ), ( 173, 111, 101 ) ] + + +blend : Float -> ( Float, Float, Float ) -> ( Float, Float, Float ) -> Color.Color +blend p ( r1, g1, b1 ) ( r2, g2, b2 ) = + let + blendFlux : Float -> Float -> Float -> Int + blendFlux t a b = + round (sqrt ((1 - t) * (a ^ 2) + t * (b ^ 2))) + in + Color.rgb255 (blendFlux p r1 r2) (blendFlux p g1 g2) (blendFlux p b1 b2) + + +blender : Float -> Color.Color +blender t = + let + n : Int + n = + length mainColors + + p : Float + p = + frac (t * toFloat n) + + c1 : Maybe ( Float, Float, Float ) + c1 = + getAt (floor (t * toFloat n)) mainColors + + c2 : Maybe ( Float, Float, Float ) + c2 = + getAt (ceiling (t * toFloat n)) mainColors + in + case c2 of + Nothing -> + case c1 of + Nothing -> + -- no colors to blend + Color.rgb255 173 111 101 + + Just ( r, g, b ) -> + -- missing color to blend + Color.rgb255 (round r) (round g) (round b) + + Just color2 -> + case c1 of + Nothing -> + -- missing main color to blend + Color.rgb255 173 111 101 + + Just color1 -> + -- blend both colors + blend p color1 color2 + + update : Msg -> Model -> ( Model, Cmd Msg ) update msg model = let @@ -170,6 +262,8 @@ update msg model = | angle = canonicalize (model.angle + 2 * (2 + sin (toFloat (Time.posixToMillis time) / 1000))) , radius = 7.5 + 1 / 8 * model.radius + 5 * 13 / 11 * sin (toFloat (Time.posixToMillis time + 250) / 1000) , elevation = 9 + 1 / 4 * model.elevation + 5 * cos (toFloat (Time.posixToMillis time) / 1000) + , mainColor = blender (frac (toFloat (Time.posixToMillis time) / 3500)) + , show = modBy 4000 (Time.posixToMillis time) > 2000 } Copy label text -> @@ -181,6 +275,9 @@ update msg model = Scroll loc -> ( model, scrollTo loc ) + ScrollToEntry entry -> + ( { model | entry = entry }, scrollTo entry ) + keyDecoder : Decode.Decoder String keyDecoder = @@ -234,6 +331,22 @@ linkBtn disp addr = newTabLink btnStyle { url = addr, label = text (String.toUpper disp) } +linkBtnInt : String -> String -> Element msg +linkBtnInt disp addr = + link btnStyle { url = addr, label = text (String.toUpper disp) } + + +entryLink : String -> String -> Element Msg +entryLink disp addr = + button + [ Font.underline + , Font.bold + ] + { onPress = Just (ScrollToEntry addr) + , label = text disp + } + + btn : String -> Msg -> Element Msg btn disp act = button btnStyle { onPress = Just act, label = text (String.toUpper disp) } @@ -370,7 +483,10 @@ itemize multikeys entry = sitemap : Dict String (Model -> List (Html Msg)) sitemap = - Dict.fromList (itemize ([ "/", "/index.html" ] ++ getPaths "src" ++ getPaths "index" ++ getPaths "home") pageHome) + Dict.fromList + (itemize ([ "/", "/index.html" ] ++ getPaths "src" ++ getPaths "index" ++ getPaths "home") pageHome + ++ itemize (getPaths "entries") pageEntries + ) loadUrl : Model -> List (Html Msg) @@ -608,6 +724,407 @@ pageHome model = ] +pageEntries : Model -> List (Html Msg) +pageEntries model = + [ Element.layout + [ width fill + ] + (column [ width fill ] + [ column + [ width fill + , height fill + , spacing (vh2pt model -100) + , id "zero" + ] + [ el + [ width fill + , height (vh2px model 100) + , Background.color black + ] + Element.none + , animatedEl crossfadeIn + [ width fill + , height (vh2px model 100) + , Background.gradient { angle = 360 - 45, steps = [ rgb255 100 125 50, rgb255 125 50 100 ] } + ] + Element.none + , animatedEl crossfadeOut + [ width fill + , height (vh2px model 100) + , Background.gradient { angle = 360 - 45, steps = [ rgb255 100 50 175, rgb255 100 175 50 ] } + ] + Element.none + , el + ([ alignLeft + , alignTop + , width (vw2px model 50) + , height (vh2px model 100) + , paddingEach + { top = vh2pt model 20 - 96 + , bottom = 0 + , left = vw2pt model 10 + , right = 0 + } + ] + ++ heading + ) + (column + [ spacing 35 + ] + [ menu model + , text "Meet the entries" + , paragraph bodyText + [ entryLink "A entry" "A" + , text ", " + , entryLink "Bentry" "B" + , text " (Office of the President), " + , entryLink "Centry" "C" + , text " (the C is silent), " + , entryLink "Dentry" "D" + , text ", " + , entryLink "E entry" "E" + , text ", " + , entryLink "Fentry" "F" + , text ", " + , entryLink "Gentry" "G" + , text " (hard G), " + , entryLink "Hentry" "H" + , text ", 𝑖 entry (imaginary)," + , image [ height (px 24), padding 10 ] { description = "flag of j entry", src = "../assets/img/jentry.png" } + , entryLink "Jentry" "J" + ] + , column [ spacing 15 ] + [ row + [ spacing 15 + ] + [ linkBtnInt "← Back" "/" + , btn "Explore ↓" (ScrollToEntry "J") + ] + ] + ] + ) + , el + [ alignRight + , alignTop + , width (vw2px model 60) + , height (vh2px model 100) + , paddingEach + { top = vh2pt model 25 + , bottom = vh2pt model 25 + , left = 0 + , right = 0 + } + ] + (if model.entry == "zero" then + view3DColors model + + else + Element.none + ) + ] + , column + (page model ++ [ id "J", Background.color (rgb255 76 76 254) ]) + [ column (pageText model) + [ row [ spacing 10 ] + [ btn "↑" (ScrollToEntry "zero") + , btn "↓" (ScrollToEntry "A") + ] + , paragraph + subheading + [ text "Welcome to the Jentry." ] + , paragraph (bodyText ++ [ Font.size 32 ]) + [ text "(J Entry) The heart of MacGregor. Historic culture, big lore. Jentry memes. Greatest MacGregor Housecomm representation of any entry. Jamily is forever." + , image [ width (px 48), padding 12 ] { description = "flag of j entry", src = "../assets/img/jentry.png" } + ] + ] + , el + [ alignRight + , alignTop + , width (vw2px model 60) + , height (vh2px model 100) + , paddingEach + { top = vh2pt model 25 + , bottom = vh2pt model 25 + , left = 0 + , right = 0 + } + ] + (if model.entry == "J" then + view3DEntries "J" model + + else + Element.none + ) + ] + , column + (page model ++ [ id "A", Background.color (rgb255 5 93 243) ]) + [ column (pageText model) + [ row [ spacing 10 ] + [ btn "↑" (ScrollToEntry "J") + , btn "↓" (ScrollToEntry "B") + ] + , paragraph + subheading + [ text "Welcome to A Entry." ] + , paragraph (bodyText ++ [ Font.size 32 ]) + [ text "Top floor. Top dog. Lots of dogs, in fact. Historic MacGregor cultural epicenter." + ] + ] + , el + [ alignRight + , alignTop + , width (vw2px model 60) + , height (vh2px model 100) + , paddingEach + { top = vh2pt model 25 + , bottom = vh2pt model 25 + , left = 0 + , right = 0 + } + ] + (if model.entry == "A" then + view3DEntries "A" model + + else + Element.none + ) + ] + , column + (page model ++ [ id "B", Background.color (rgb255 5 180 93) ]) + [ column (pageText model) + [ row [ spacing 10 ] + [ btn "↑" (ScrollToEntry "A") + , btn "↓" (ScrollToEntry "C") + ] + , paragraph + subheading + [ text "Welcome to the Bentry." ] + , paragraph (bodyText ++ [ Font.size 32 ]) + [ text "(B Entry) Office of the President. Sweeping views. Crossroads of the High Rise. B is for burgers?" + ] + ] + , el + [ alignRight + , alignTop + , width (vw2px model 60) + , height (vh2px model 100) + , paddingEach + { top = vh2pt model 25 + , bottom = vh2pt model 25 + , left = 0 + , right = 0 + } + ] + (if model.entry == "B" then + view3DEntries "B" model + + else + Element.none + ) + ] + , column + (page model ++ [ id "C", Background.color (rgb255 5 140 40) ]) + [ column (pageText model) + [ row [ spacing 10 ] + [ btn "↑" (ScrollToEntry "B") + , btn "↓" (ScrollToEntry "D") + ] + , paragraph + subheading + [ text "Welcome to Centry." ] + , paragraph (bodyText ++ [ Font.size 32 ]) + [ text "(C Entry) Ceriously quiet. High enough to see the clouds, but low enough to stay grounded. MacGregor's creative capital core." + ] + ] + , el + [ alignRight + , alignTop + , width (vw2px model 60) + , height (vh2px model 100) + , paddingEach + { top = vh2pt model 25 + , bottom = vh2pt model 25 + , left = 0 + , right = 0 + } + ] + (if model.entry == "C" then + view3DEntries "C" model + + else + Element.none + ) + ] + , column + (page model ++ [ id "D", Background.color (rgb255 240 140 40) ]) + [ column (pageText model) + [ row [ spacing 10 ] + [ btn "↑" (ScrollToEntry "C") + , btn "↓" (ScrollToEntry "E") + ] + , paragraph + subheading + [ text "Welcome to Dentry." ] + , paragraph (bodyText ++ [ Font.size 32 ]) + [ text "(D Entry) Office of the Vice President. Active after dark. Diligently working until dusk. The culture is palpable." + ] + ] + , el + [ alignRight + , alignTop + , width (vw2px model 60) + , height (vh2px model 100) + , paddingEach + { top = vh2pt model 25 + , bottom = vh2pt model 25 + , left = 0 + , right = 0 + } + ] + (if model.entry == "D" then + view3DEntries "D" model + + else + Element.none + ) + ] + , column + (page model ++ [ id "E", Background.color (rgb255 40 20 30) ]) + [ column (pageText model) + [ row [ spacing 10 ] + [ btn "↑" (ScrollToEntry "D") + , btn "↓" (ScrollToEntry "F") + ] + , paragraph + subheading + [ text "Welcome to E entry." ] + , paragraph (bodyText ++ [ Font.size 32 ]) + [ text "Board games over Briggs field. Excellence in everything. End of story." + ] + ] + , el + [ alignRight + , alignTop + , width (vw2px model 60) + , height (vh2px model 100) + , paddingEach + { top = vh2pt model 25 + , bottom = vh2pt model 25 + , left = 0 + , right = 0 + } + ] + (if model.entry == "E" then + view3DEntries "E" model + + else + Element.none + ) + ] + , column + (page model ++ [ id "F", Background.color (rgb255 200 50 75) ]) + [ column (pageText model) + [ row [ spacing 10 ] + [ btn "↑" (ScrollToEntry "E") + , btn "↓" (ScrollToEntry "G") + ] + , paragraph + subheading + [ text "Welcome to the Fentry." ] + , paragraph (bodyText ++ [ Font.size 32 ]) + [ text "(F entry) F is for Food. F is for Feast. F is for First (low rise block). F is Forever." + ] + ] + , el + [ alignRight + , alignTop + , width (vw2px model 60) + , height (vh2px model 100) + , paddingEach + { top = vh2pt model 25 + , bottom = vh2pt model 25 + , left = 0 + , right = 0 + } + ] + (if model.entry == "F" then + view3DEntries "F" model + + else + Element.none + ) + ] + , column + (page model ++ [ id "G", Background.color (rgb255 200 50 150) ]) + [ column (pageText model) + [ row [ spacing 10 ] + [ btn "↑" (ScrollToEntry "F") + , btn "↓" (ScrollToEntry "H") + ] + , paragraph + subheading + [ text "Welcome to the Gentry." ] + , paragraph (bodyText ++ [ Font.size 32 ]) + [ text "(G entry) G is for Greatness. Spans the Charles. Overlooks Fenway. Good things start in Gentry." + ] + ] + , el + [ alignRight + , alignTop + , width (vw2px model 60) + , height (vh2px model 100) + , paddingEach + { top = vh2pt model 25 + , bottom = vh2pt model 25 + , left = 0 + , right = 0 + } + ] + (if model.entry == "G" then + view3DEntries "G" model + + else + Element.none + ) + ] + , column + (page model ++ [ id "H", Background.color (rgb255 200 150 50) ]) + [ column (pageText model) + [ row [ spacing 10 ] + [ btn "↑" (ScrollToEntry "G") + , btn "TOP" (ScrollToEntry "zero") + ] + , paragraph + subheading + [ text "Welcome to the Hentry." ] + , paragraph (bodyText ++ [ Font.size 32 ]) + [ text "(H entry) Lots of chickens. Crossroads of the Low Rise. Largest entry in MacGregor." + ] + ] + , el + [ alignRight + , alignTop + , width (vw2px model 60) + , height (vh2px model 100) + , paddingEach + { top = vh2pt model 25 + , bottom = vh2pt model 25 + , left = 0 + , right = 0 + } + ] + (if model.entry == "H" then + view3DEntries "H" model + + else + Element.none + ) + ] + ] + ) + ] + + notFound : Model -> List (Html Msg) notFound model = [ Element.layout @@ -785,6 +1302,195 @@ view3D model = ) +view3DColors : Model -> Element msg +view3DColors model = + Element.html + (let + entity : Entity Obj.Decode.ObjCoordinates + entity = + case model.mesh of + Nothing -> + Scene3d.mesh (Material.matte model.mainColor) pyramidMesh + + Just mesh -> + Scene3d.mesh (Material.matte model.mainColor) (Mesh.texturedFacets mesh) + + camera : Camera3d.Camera3d Length.Meters coordinates + camera = + Camera3d.perspective + { viewpoint = + Viewpoint3d.lookAt + { focalPoint = Point3d.origin + , eyePoint = + let + theta : Angle.Angle + theta = + Angle.degrees (5 / 2 * model.angle) + in + Point3d.meters (10 * Angle.cos theta) 2 (10 * Angle.sin theta) + , upDirection = Direction3d.xy (Angle.degrees 90) + } + , verticalFieldOfView = Angle.degrees 100 + } + in + Scene3d.sunny + { entities = [ entity ] + , camera = camera + , upDirection = Direction3d.z + , sunlightDirection = Direction3d.yz (Angle.degrees -120) + , background = Scene3d.transparentBackground + , clipDepth = Length.centimeters 1 + , shadows = False + , dimensions = ( Pixels.int (round (vw model 60)), Pixels.int (round (vh model 100)) ) + } + ) + + +view3DEntries : String -> Model -> Element msg +view3DEntries entry model = + Element.html + (let + entity : Entity Obj.Decode.ObjCoordinates + entity = + case model.mesh of + Nothing -> + Scene3d.mesh (Material.matte model.mainColor) pyramidMesh + + Just mesh -> + case model.textures of + Nothing -> + Scene3d.mesh (Material.matte model.mainColor) (Mesh.texturedFacets mesh) + + Just textures -> + if model.show then + Scene3d.mesh (Material.matte model.mainColor) (Mesh.texturedFacets mesh) + + else + Scene3d.mesh textures (Mesh.texturedFacets mesh) + + height : Float + height = + case entry of + "A" -> + 10 + + "B" -> + 7 + + "C" -> + 5 + + "E" -> + 1 + + _ -> + 2 + + perspective : Angle.Angle + perspective = + let + theta : Float + theta = + 180 * frac (model.angle / 180) + + winding : Float + winding = + 360 * frac (model.angle / 360) + + direction : Float + direction = + abs (180 - winding) / (180 - winding) + + interp : Float -> Float -> Angle.Angle + interp a b = + Angle.degrees + (if direction > 0 then + a + (b - a) * theta / 180 + + else + b + (a - b) * theta / 180 + ) + in + case entry of + "J" -> + interp -45 30 + + "E" -> + interp 30 110 + + "F" -> + interp 140 230 + + "G" -> + interp 230 290 + + "H" -> + interp 290 315 + + _ -> + Angle.degrees model.angle + + orbit : Float + orbit = + case entry of + "A" -> + 4 + + "B" -> + 6 + + "C" -> + 6 + + "D" -> + 10 + + "F" -> + 12 + + "G" -> + 10 + + "J" -> + 12 + + "H" -> + 11 + + _ -> + 7 + + camera : Camera3d.Camera3d Length.Meters coordinates + camera = + Camera3d.perspective + { viewpoint = + Viewpoint3d.lookAt + { focalPoint = Point3d.origin + , eyePoint = + let + theta : Angle.Angle + theta = + perspective + in + Point3d.meters (orbit * Angle.cos theta) height (orbit * Angle.sin theta) + , upDirection = Direction3d.xy (Angle.degrees 90) + } + , verticalFieldOfView = Angle.degrees 60 + } + in + Scene3d.sunny + { entities = [ entity ] + , camera = camera + , upDirection = Direction3d.z + , sunlightDirection = Direction3d.yz (Angle.degrees -120) + , background = Scene3d.transparentBackground + , clipDepth = Length.centimeters 1 + , shadows = False + , dimensions = ( Pixels.int (round (vw model 60)), Pixels.int (round (vh model 100)) ) + } + ) + + view3DTower : Model -> Element msg view3DTower model = Element.html