This commit is contained in:
zoe 2023-08-26 03:06:50 +02:00
parent 11f40e5d6b
commit c4927b3120
19 changed files with 1044 additions and 138 deletions

View File

@ -8,6 +8,7 @@ use serde::{Deserialize, Serialize};
use sqlx::FromRow;
mod kind;
mod names;
mod position;
mod size;
@ -59,6 +60,8 @@ pub struct Star {
pub size: size::Size,
pub position: position::Position,
pub kind: kind::Kind,
pub name: String,
pub description: String,
}
#[derive(Serialize, Deserialize, JsonSchema)]
@ -71,10 +74,12 @@ impl Into<Star> for Protostar {
let mut rng = fastrand::Rng::with_seed(self.id.abs() as u64);
let range = 0..u64::MAX;
Star {
core: self,
core: self.clone(),
kind: kind::Kind::random(rng.u64(range.clone())),
size: size::Size::random(rng.u64(range.clone())),
position: position::Position::random(rng.u64(range.clone())),
name: format!("{}-{}", names::random_name(rng.u64(range.clone())), self.id,).into(),
description: format!("a star!").into(),
}
}
}

0
src/stars/description.rs Normal file
View File

View File

@ -5,12 +5,11 @@ use strum::{EnumIter, IntoEnumIterator};
#[derive(Serialize, Deserialize, JsonSchema, EnumIter)]
pub enum Kind {
Nebula,
Planet,
Star,
Nova,
Supernova,
Banana,
Station,
}
impl Kind {

114
src/stars/names.rs Normal file
View File

@ -0,0 +1,114 @@
use fastrand::Rng;
pub fn random_name(seed: u64) -> String {
let mut rand = Rng::with_seed(seed);
let part_1 = rand.choice(name_parts()).unwrap_or("diadem");
let part_2 = rand.choice(name_parts()).unwrap_or("tau");
format!("{}-{}", part_1, part_2).into()
}
fn name_parts() -> Vec<&'static str> {
vec![
"p",
"tau",
"sigma",
"delta",
"draconis",
"cassiopeia",
"adhara",
"hd",
"corvus",
"ursa",
"α",
"γ",
"pegasi",
"crateris",
"aa",
"altair",
"amadioha",
"bellatrix",
"betelgeuse",
"orionis",
"θ",
"δ",
"librae",
"β",
"tauri",
"leonis",
"danfeng",
"diadem",
"puppis",
"WASP",
"dìwö",
"diya",
"dofida",
"electra",
"eltanin",
"fafnir",
"fellis",
"funi",
"haftorang",
"G",
"cephei",
"μ",
"guahayona",
"hoggar",
"hunor",
"horna",
"iklil",
"polaris",
"tevel",
"andromedae",
"xihe",
"xuange",
"yed",
"posterior",
"prior",
"zhang",
"zaurak",
"ζ",
"υ",
"HATS",
"virginis",
"lynx",
"delphinus",
"vela",
"sansuna",
"cassiopeiae",
"leo",
"sharjah",
"shaula",
"sheliak",
"sheratan",
"sirius",
"situla",
"solarius",
"sterrennacht",
"hercules",
"scorpius",
"andromeda",
"sualocin",
"lyra",
"taika",
"χ",
"ι",
"λ",
"π",
"HAT",
"P",
"ω",
"ι",
"pavonis",
"cancri",
"phact",
"piprima",
"australis",
"pollux",
"rana",
"rapeto",
"rigel",
"sirius",
"spica",
"ribbit",
]
}

View File

@ -17,7 +17,7 @@ impl Position {
Self {
right: rand.f64() * 100.0,
bottom: rand.f64() * 100.0,
width: rand.u8(16..112),
width: rand.u8(24..112),
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

View File

@ -17,13 +17,13 @@
"mesh":0,
"name":"Cylinder",
"scale":[
0.20239891111850739,
0.20239891111850739,
0.20239891111850739
0.3151196837425232,
0.3151196837425232,
0.3151196837425232
],
"translation":[
0,
0.01713314652442932,
-0.4174487292766571,
0
]
}
@ -48,9 +48,9 @@
"name":"Dark",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.12822629511356354,
0.006969457026571035,
0.02585199475288391,
0.8140411972999573,
0.02744733728468418,
0.13738077878952026,
1
],
"metallicFactor":0

View File

@ -1,115 +0,0 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v3.5.30",
"version":"2.0"
},
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Icosphere"
}
],
"materials":[
{
"doubleSided":true,
"name":"Material.001",
"pbrMetallicRoughness":{
"metallicFactor":0,
"roughnessFactor":0.5
}
}
],
"meshes":[
{
"name":"Icosphere",
"primitives":[
{
"attributes":{
"POSITION":0,
"TEXCOORD_0":1,
"NORMAL":2
},
"indices":3,
"material":0
}
]
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":92,
"max":[
0.9954347610473633,
1.0196396112442017,
1.0188261270523071
],
"min":[
-0.9746291637420654,
-1,
-0.9999999403953552
],
"type":"VEC3"
},
{
"bufferView":1,
"componentType":5126,
"count":92,
"type":"VEC2"
},
{
"bufferView":2,
"componentType":5126,
"count":92,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5123,
"count":378,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":1104,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":736,
"byteOffset":1104,
"target":34962
},
{
"buffer":0,
"byteLength":1104,
"byteOffset":1840,
"target":34962
},
{
"buffer":0,
"byteLength":756,
"byteOffset":2944,
"target":34963
}
],
"buffers":[
{
"byteLength":3700,
"uri":"data:application/octet-stream;base64,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B86ZPtk9OT9m9+S+RpQGvwyTib6lLAO+OGd0v+F6lD1LyCc/93VAv/s6ED/LEKe+001CP1pkOz+Hpyc/pU5APuwvW79KewO/07xjvU2Ejb5m9+S+7MBZP02Ejb5m9+S+7MBZP9cScj3vycM9IGN+P8sQB740gGe/INLPPssQB740gGe/INLPPnL5P78CvAW/INLPPqW9Ib/vycM9S+pEP6W9Ib/vycM9S+pEPyV1gj3lYSG9gEh/v4Y4Nr+TOuE+9igMP0VHEj/Jdh4/zO4Jv0VHEj/Jdh4/zO4JvyL91j5Qjdc+8tJNP8pUQb7AWxC/8tJNPwAAFgAUAAUAFwAZAAQAFQAdAAMAHAAgAAIAHwAbAAUAGQAjACkAHgBTACkAUwBVAAcAHgAnAAgAIQAqACwAJABMACwATABKAAUAIwAmABgAJQBQABgAUAAJAAcAJwArAAgAKgAtACIALABKACIASgBJAAoALgA0AAsALwA3ADAAOABaADAAWgBXADEAOwBEADEARAA8AA8AMgA2ADsAEgBCADsAQgBEABEANQA+ABEAPgBAADYAMgBFADYARQA/ADsAOQASADsAMQA5ADEADQA5ADoAOAATADkADQBWADkAVgBYADAADAA4ADcAMwAQADcALwAzAC8ACgAzADQANQARADQALgA1AC4ADwA1ACQAMgAPACQALAAyACwADgAyAC0AMQAOAC0AKgAxACoADQAxAA0AKwAGAA0ABgBWACcAMABXACcAVwBbACcADAAwACgALwALACgAJQAvACUACgAvACYALgAKACYAIwAuACMADwAuACwALQAOACwAIgAtACIACAAtACoAKwANACoAIQArACEABwArACcAKQAMACcAHgApAB4AFQBSAB4AUgBTACUAJgAKACUAGAAmABgABQAmACMAJAAPACMAGQAkACQAGQBLACQASwBMABsAHwBNABsATQBHABkAGgBGABkARgBLAB8ACAAiACAAIQAIACAAHAAhABwABwAhAB0AHgAHAB0AFQAeABQAGAAJABQACQBRAB8AIgBJAB8ASQBNABkAFwAaABcAAQAaACUAKABUACUAVABQABQAFgAYABYABQAYAD0APABEAD8AQwBBAD8ARQBDAEUAPQBDAA4AMQA8AA4APAA9ADIADgA9ADIAPQBFAEgASQBKAEgASgBMAEsASABMAEcASQBIAEcATQBJAEsARgBIAE4ACQBQAE4AUABUAFMATwBVAFIATwBTAFEACQBOAFYAVwBZAFkAVwBaAAYAVwBWAAYAWwBXADgAOgBZADgAWQBaACsAJwBbACsAWwAGAA=="
}
]
}

File diff suppressed because one or more lines are too long

164
web/public/models/nova.gltf Normal file
View File

@ -0,0 +1,164 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v3.5.30",
"version":"2.0"
},
"extensionsUsed":[
"KHR_materials_clearcoat",
"KHR_materials_transmission",
"KHR_materials_emissive_strength",
"KHR_materials_specular",
"KHR_materials_ior"
],
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Cone",
"scale":[
0.5690511465072632,
0.5690511465072632,
0.5690511465072632
],
"translation":[
0,
0.02206335961818695,
0
]
}
],
"materials":[
{
"doubleSided":true,
"emissiveFactor":[
1,
0.7336805926539774,
0.2730392248840733
],
"extensions":{
"KHR_materials_clearcoat":{
"clearcoatFactor":1,
"clearcoatRoughnessFactor":0.029999999329447746
},
"KHR_materials_transmission":{
"transmissionFactor":1
},
"KHR_materials_emissive_strength":{
"emissiveStrength":2.998099133671275
},
"KHR_materials_specular":{
"specularColorFactor":[
1,
1,
1
]
},
"KHR_materials_ior":{
"ior":1.4500000476837158
}
},
"name":"Material.001",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.8000000715255737,
0.5938380360603333,
0.34376785159111023,
1
],
"roughnessFactor":0.5
}
}
],
"meshes":[
{
"name":"Cone",
"primitives":[
{
"attributes":{
"POSITION":0,
"TEXCOORD_0":1,
"NORMAL":2
},
"indices":3,
"material":0
}
]
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":28,
"max":[
2.046938896179199,
2.6071395874023438,
1
],
"min":[
-2.046938896179199,
-2.6071395874023438,
-1
],
"type":"VEC3"
},
{
"bufferView":1,
"componentType":5126,
"count":28,
"type":"VEC2"
},
{
"bufferView":2,
"componentType":5126,
"count":28,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5123,
"count":168,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":336,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":224,
"byteOffset":336,
"target":34962
},
{
"buffer":0,
"byteLength":336,
"byteOffset":560,
"target":34962
},
{
"buffer":0,
"byteLength":336,
"byteOffset":896,
"target":34963
}
],
"buffers":[
{
"byteLength":1232,
"uri":"data:application/octet-stream;base64,AAAAAAAAAAAAAIC/17NdPwAAAAAAAAC/AAAAADO8JUAAAACAAAAAAGDbJkAAAACATVsxP22ABT84y8y++AM/P6maBD8AAACAZ3T8PwAAAAD0BxW+DAEDQAAAAAAAAACA17NdvwAAAAAAAAC/TVsxv22ABT84y8y++AM/v6maBD8AAACAZ3T8vwAAAAD0BxW+DAEDwAAAAAAAAACAAAAAAAAAAAAAAIA/17NdPwAAAAAAAAA/TVsxP22ABT84y8w+Z3T8PwAAAAD0BxU+17NdvwAAAAAAAAA/TVsxv22ABT84y8w+Z3T8vwAAAAD0BxU+AAAAADO8JcAAAACAAAAAAGDbJsAAAACATVsxP22ABb84y8y++AM/P6maBL8AAACATVsxv22ABb84y8y++AM/v6maBL8AAACATVsxP22ABb84y8w+TVsxv22ABb84y8w+AACAPlyPAj/Oauo+rkchPwAAgD4AAEA/AACAPgAAQD+WIdU+vGwnP5Yh1T68bCc/liHVPrxsJz+WIdU+vGwnP85q6j6uRyE/liHVPrxsJz+WIdU+vGwnP5Yh1T68bCc/liHVPrxsJz8AAIA+XI8CP85q6j6uRyE/liHVPrxsJz+WIdU+vGwnP85q6j6uRyE/liHVPrxsJz+WIdU+vGwnPwAAgD4AAEA/AACAPgAAQD+WIdU+vGwnP5Yh1T68bCc/liHVPrxsJz+WIdU+vGwnP5Yh1T68bCc/liHVPrxsJz8AAAAAAAAAAAAAgL9eS8g+AAAAAMiYa78AAAAAAACAPwAAAIAAAAAAAACAPwAAAIBxrBs/bHj6PqkTIL9qvDQ/mEw1PwAAAIB/2V0/AAAAgAmK/74AAIA/AAAAAAAAAIBeS8i+AAAAAMiYa79xrBu/bHj6PqkTIL9qvDS/mEw1PwAAAIB/2V2/AAAAgAmK/74AAIC/AAAAAAAAAIAAAAAAAAAAAAAAgD9eS8g+AAAAAMiYaz9xrBs/bHj6PqkTID9/2V0/AAAAgAmK/z5eS8i+AAAAAMiYaz9xrBu/bHj6PqkTID9/2V2/AAAAgAmK/z4AAAAAAACAvwAAAIAAAACAAACAvwAAAIBxrBs/bHj6vqkTIL9qvDQ/mEw1vwAAAIBxrBu/bHj6vqkTIL9qvDS/mEw1vwAAAIBxrBs/bHj6vqkTID9xrBu/bHj6vqkTID8AAAMABAAAAAQAAQAEAAMAAgAEAAIABQAEAAUABwAEAAcABgAEAAYAAQAAAAgACQAAAAkAAwAJAAoAAgAJAAIAAwAJAAsADAAJAAwACgAJAAgACwANAA4ADwANAA8AAwAPAAUAAgAPAAIAAwAPABAABwAPAAcABQAPAA4AEAANAAMAEgANABIAEQASAAMAAgASAAIACgASAAoADAASAAwAEwASABMAEQAAAAEAFgAAABYAFQAWABcAFAAWABQAFQAWAAYABwAWAAcAFwAWAAEABgAAABUAGAAAABgACAAYABUAFAAYABQAGQAYABkADAAYAAwACwAYAAsACAANABUAGgANABoADgAaABUAFAAaABQAFwAaABcABwAaAAcAEAAaABAADgANABEAGwANABsAFQAbABkAFAAbABQAFQAbABMADAAbAAwAGQAbABEAEwA="
}
]
}

View File

@ -0,0 +1,105 @@
{
"asset": {
"generator": "Khronos glTF Blender I/O v3.5.30",
"version": "2.0"
},
"scene": 0,
"scenes": [
{
"name": "Scene",
"nodes": [0]
}
],
"nodes": [
{
"mesh": 0,
"name": "Icosphere"
}
],
"materials": [
{
"doubleSided": true,
"name": "Material.001",
"pbrMetallicRoughness": {
"metallicFactor": 0,
"roughnessFactor": 0.5
}
}
],
"meshes": [
{
"name": "Icosphere",
"primitives": [
{
"attributes": {
"POSITION": 0,
"TEXCOORD_0": 1,
"NORMAL": 2
},
"indices": 3,
"material": 0
}
]
}
],
"accessors": [
{
"bufferView": 0,
"componentType": 5126,
"count": 92,
"max": [0.9954347610473633, 1.0196396112442017, 1.0188261270523071],
"min": [-0.9746291637420654, -1, -0.9999999403953552],
"type": "VEC3"
},
{
"bufferView": 1,
"componentType": 5126,
"count": 92,
"type": "VEC2"
},
{
"bufferView": 2,
"componentType": 5126,
"count": 92,
"type": "VEC3"
},
{
"bufferView": 3,
"componentType": 5123,
"count": 378,
"type": "SCALAR"
}
],
"bufferViews": [
{
"buffer": 0,
"byteLength": 1104,
"byteOffset": 0,
"target": 34962
},
{
"buffer": 0,
"byteLength": 736,
"byteOffset": 1104,
"target": 34962
},
{
"buffer": 0,
"byteLength": 1104,
"byteOffset": 1840,
"target": 34962
},
{
"buffer": 0,
"byteLength": 756,
"byteOffset": 2944,
"target": 34963
}
],
"buffers": [
{
"byteLength": 3700,
"uri": "data:application/octet-stream;base64,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B86ZPtk9OT9m9+S+RpQGvwyTib6lLAO+OGd0v+F6lD1LyCc/93VAv/s6ED/LEKe+001CP1pkOz+Hpyc/pU5APuwvW79KewO/07xjvU2Ejb5m9+S+7MBZP02Ejb5m9+S+7MBZP9cScj3vycM9IGN+P8sQB740gGe/INLPPssQB740gGe/INLPPnL5P78CvAW/INLPPqW9Ib/vycM9S+pEP6W9Ib/vycM9S+pEPyV1gj3lYSG9gEh/v4Y4Nr+TOuE+9igMP0VHEj/Jdh4/zO4Jv0VHEj/Jdh4/zO4JvyL91j5Qjdc+8tJNP8pUQb7AWxC/8tJNPwAAFgAUAAUAFwAZAAQAFQAdAAMAHAAgAAIAHwAbAAUAGQAjACkAHgBTACkAUwBVAAcAHgAnAAgAIQAqACwAJABMACwATABKAAUAIwAmABgAJQBQABgAUAAJAAcAJwArAAgAKgAtACIALABKACIASgBJAAoALgA0AAsALwA3ADAAOABaADAAWgBXADEAOwBEADEARAA8AA8AMgA2ADsAEgBCADsAQgBEABEANQA+ABEAPgBAADYAMgBFADYARQA/ADsAOQASADsAMQA5ADEADQA5ADoAOAATADkADQBWADkAVgBYADAADAA4ADcAMwAQADcALwAzAC8ACgAzADQANQARADQALgA1AC4ADwA1ACQAMgAPACQALAAyACwADgAyAC0AMQAOAC0AKgAxACoADQAxAA0AKwAGAA0ABgBWACcAMABXACcAVwBbACcADAAwACgALwALACgAJQAvACUACgAvACYALgAKACYAIwAuACMADwAuACwALQAOACwAIgAtACIACAAtACoAKwANACoAIQArACEABwArACcAKQAMACcAHgApAB4AFQBSAB4AUgBTACUAJgAKACUAGAAmABgABQAmACMAJAAPACMAGQAkACQAGQBLACQASwBMABsAHwBNABsATQBHABkAGgBGABkARgBLAB8ACAAiACAAIQAIACAAHAAhABwABwAhAB0AHgAHAB0AFQAeABQAGAAJABQACQBRAB8AIgBJAB8ASQBNABkAFwAaABcAAQAaACUAKABUACUAVABQABQAFgAYABYABQAYAD0APABEAD8AQwBBAD8ARQBDAEUAPQBDAA4AMQA8AA4APAA9ADIADgA9ADIAPQBFAEgASQBKAEgASgBMAEsASABMAEcASQBIAEcATQBJAEsARgBIAE4ACQBQAE4AUABUAFMATwBVAFIATwBTAFEACQBOAFYAVwBZAFkAVwBaAAYAVwBWAAYAWwBXADgAOgBZADgAWQBaACsAJwBbACsAWwAGAA=="
}
]
}

131
web/public/models/star.gltf Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,159 @@
{
"asset":{
"generator":"Khronos glTF Blender I/O v3.5.30",
"version":"2.0"
},
"extensionsUsed":[
"KHR_materials_clearcoat",
"KHR_materials_transmission",
"KHR_materials_emissive_strength",
"KHR_materials_specular",
"KHR_materials_ior"
],
"scene":0,
"scenes":[
{
"name":"Scene",
"nodes":[
0
]
}
],
"nodes":[
{
"mesh":0,
"name":"Cone",
"translation":[
0,
0.02206335961818695,
0
]
}
],
"materials":[
{
"doubleSided":true,
"emissiveFactor":[
1,
0.7336805926539774,
0.2730392248840733
],
"extensions":{
"KHR_materials_clearcoat":{
"clearcoatFactor":1,
"clearcoatRoughnessFactor":0.029999999329447746
},
"KHR_materials_transmission":{
"transmissionFactor":1
},
"KHR_materials_emissive_strength":{
"emissiveStrength":2.998099133671275
},
"KHR_materials_specular":{
"specularColorFactor":[
1,
1,
1
]
},
"KHR_materials_ior":{
"ior":1.4500000476837158
}
},
"name":"Material.001",
"pbrMetallicRoughness":{
"baseColorFactor":[
0.8000000715255737,
0.5938380360603333,
0.34376785159111023,
1
],
"roughnessFactor":0.5
}
}
],
"meshes":[
{
"name":"Cone",
"primitives":[
{
"attributes":{
"POSITION":0,
"TEXCOORD_0":1,
"NORMAL":2
},
"indices":3,
"material":0
}
]
}
],
"accessors":[
{
"bufferView":0,
"componentType":5126,
"count":28,
"max":[
2.046938896179199,
2.6071395874023438,
1
],
"min":[
-2.046938896179199,
-2.6071395874023438,
-1
],
"type":"VEC3"
},
{
"bufferView":1,
"componentType":5126,
"count":28,
"type":"VEC2"
},
{
"bufferView":2,
"componentType":5126,
"count":28,
"type":"VEC3"
},
{
"bufferView":3,
"componentType":5123,
"count":168,
"type":"SCALAR"
}
],
"bufferViews":[
{
"buffer":0,
"byteLength":336,
"byteOffset":0,
"target":34962
},
{
"buffer":0,
"byteLength":224,
"byteOffset":336,
"target":34962
},
{
"buffer":0,
"byteLength":336,
"byteOffset":560,
"target":34962
},
{
"buffer":0,
"byteLength":336,
"byteOffset":896,
"target":34963
}
],
"buffers":[
{
"byteLength":1232,
"uri":"data:application/octet-stream;base64,AAAAAAAAAAAAAIC/17NdPwAAAAAAAAC/AAAAADO8JUAAAACAAAAAAGDbJkAAAACATVsxP22ABT84y8y++AM/P6maBD8AAACAZ3T8PwAAAAD0BxW+DAEDQAAAAAAAAACA17NdvwAAAAAAAAC/TVsxv22ABT84y8y++AM/v6maBD8AAACAZ3T8vwAAAAD0BxW+DAEDwAAAAAAAAACAAAAAAAAAAAAAAIA/17NdPwAAAAAAAAA/TVsxP22ABT84y8w+Z3T8PwAAAAD0BxU+17NdvwAAAAAAAAA/TVsxv22ABT84y8w+Z3T8vwAAAAD0BxU+AAAAADO8JcAAAACAAAAAAGDbJsAAAACATVsxP22ABb84y8y++AM/P6maBL8AAACATVsxv22ABb84y8y++AM/v6maBL8AAACATVsxP22ABb84y8w+TVsxv22ABb84y8w+AACAPlyPAj/Oauo+rkchPwAAgD4AAEA/AACAPgAAQD+WIdU+vGwnP5Yh1T68bCc/liHVPrxsJz+WIdU+vGwnP85q6j6uRyE/liHVPrxsJz+WIdU+vGwnP5Yh1T68bCc/liHVPrxsJz8AAIA+XI8CP85q6j6uRyE/liHVPrxsJz+WIdU+vGwnP85q6j6uRyE/liHVPrxsJz+WIdU+vGwnPwAAgD4AAEA/AACAPgAAQD+WIdU+vGwnP5Yh1T68bCc/liHVPrxsJz+WIdU+vGwnP5Yh1T68bCc/liHVPrxsJz8AAAAAAAAAAAAAgL9eS8g+AAAAAMiYa78AAAAAAACAPwAAAIAAAAAAAACAPwAAAIBxrBs/bHj6PqkTIL9qvDQ/mEw1PwAAAIB/2V0/AAAAgAmK/74AAIA/AAAAAAAAAIBeS8i+AAAAAMiYa79xrBu/bHj6PqkTIL9qvDS/mEw1PwAAAIB/2V2/AAAAgAmK/74AAIC/AAAAAAAAAIAAAAAAAAAAAAAAgD9eS8g+AAAAAMiYaz9xrBs/bHj6PqkTID9/2V0/AAAAgAmK/z5eS8i+AAAAAMiYaz9xrBu/bHj6PqkTID9/2V2/AAAAgAmK/z4AAAAAAACAvwAAAIAAAACAAACAvwAAAIBxrBs/bHj6vqkTIL9qvDQ/mEw1vwAAAIBxrBu/bHj6vqkTIL9qvDS/mEw1vwAAAIBxrBs/bHj6vqkTID9xrBu/bHj6vqkTID8AAAMABAAAAAQAAQAEAAMAAgAEAAIABQAEAAUABwAEAAcABgAEAAYAAQAAAAgACQAAAAkAAwAJAAoAAgAJAAIAAwAJAAsADAAJAAwACgAJAAgACwANAA4ADwANAA8AAwAPAAUAAgAPAAIAAwAPABAABwAPAAcABQAPAA4AEAANAAMAEgANABIAEQASAAMAAgASAAIACgASAAoADAASAAwAEwASABMAEQAAAAEAFgAAABYAFQAWABcAFAAWABQAFQAWAAYABwAWAAcAFwAWAAEABgAAABUAGAAAABgACAAYABUAFAAYABQAGQAYABkADAAYAAwACwAYAAsACAANABUAGgANABoADgAaABUAFAAaABQAFwAaABcABwAaAAcAEAAaABAADgANABEAGwANABsAFQAbABkAFAAbABQAFQAbABMADAAbAAwAGQAbABEAEwA="
}
]
}

View File

@ -1,16 +1,19 @@
<template>
<div class="weh">
<div class="star-model">
<canvas id="can" />
<div class="data">wawa</div>
<canvas
:style="{
filter: `drop-shadow(0 0 24px ${color}) drop-shadow(0 0 30px white)`,
}"
id="can"
/>
</div>
</div>
</template>
<script setup lang="js">
import * as THREE from "three";
import { PropType, onMounted } from "vue";
import { Star } from "@/swagger";
import { onMounted } from "vue";
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';
import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';
@ -19,7 +22,8 @@ import { StarShader } from '../scripts/star_shader';
import { getRGB } from '../scripts/convert_color';
const props = defineProps({
star: { type: Star, required: true },
kind: { type: String, required: true },
color: { type: String, required: true},
});
onMounted(async () => {
@ -28,7 +32,7 @@ onMounted(async () => {
const renderer = new THREE.WebGLRenderer({ canvas: canvas ?? undefined });
renderer.setClearAlpha(0.0);
const scene = new THREE.Scene();
const model = await loader.loadAsync("/models/banana.gltf");
const model = await loader.loadAsync(`/models/${props.kind}.gltf`);
const clock = new THREE.Clock();
model.scene.traverse((child) => {
if (child.isMesh) {
@ -66,7 +70,7 @@ onMounted(async () => {
renderer.setPixelRatio(1 / (width / 125));
}
const rgb = getRGB(props.star.core.color);
const rgb = getRGB(props.color);
const starShader = StarShader;
starShader.uniforms.red.value = rgb[0] / 256;
starShader.uniforms.green.value = rgb[1] / 256;

View File

@ -0,0 +1,21 @@
<template>
<div class="description">
<h1>{{ star.name }}</h1>
<p>{{ star.description }}</p>
</div>
</template>
<script setup lang="ts">
import { PropType } from "vue";
import { Star } from "@/swagger";
defineProps({
star: { type: Object as PropType<Star>, required: true },
});
</script>
<style scoped>
.description {
padding: 1em;
}
</style>

View File

@ -50,12 +50,24 @@ export interface Star {
* @memberof Star
*/
core: Protostar;
/**
*
* @type {any}
* @memberof Star
*/
description: any | null;
/**
*
* @type {Kind}
* @memberof Star
*/
kind: Kind;
/**
*
* @type {any}
* @memberof Star
*/
name: any | null;
/**
*
* @type {Position}
@ -76,7 +88,9 @@ export interface Star {
export function instanceOfStar(value: object): boolean {
let isInstance = true;
isInstance = isInstance && "core" in value;
isInstance = isInstance && "description" in value;
isInstance = isInstance && "kind" in value;
isInstance = isInstance && "name" in value;
isInstance = isInstance && "position" in value;
isInstance = isInstance && "size" in value;
@ -94,7 +108,9 @@ export function StarFromJSONTyped(json: any, ignoreDiscriminator: boolean): Star
return {
'core': ProtostarFromJSON(json['core']),
'description': json['description'],
'kind': KindFromJSON(json['kind']),
'name': json['name'],
'position': PositionFromJSON(json['position']),
'size': SizeFromJSON(json['size']),
};
@ -110,7 +126,9 @@ export function StarToJSON(value?: Star | null): any {
return {
'core': ProtostarToJSON(value.core),
'description': value.description,
'kind': KindToJSON(value.kind),
'name': value.name,
'position': PositionToJSON(value.position),
'size': SizeToJSON(value.size),
};

View File

@ -1,13 +1,23 @@
<template>
<div>
<Suspense>
<LargeStar v-if="store.visiting" :star="store.visiting" />
</Suspense>
<div class="star-view">
<div class="star-model">
<Suspense>
<LargeStarModel
v-if="store.visiting"
:kind="store.visiting.kind.toString().toLowerCase()"
:color="store.visiting.core.color"
/>
</Suspense>
</div>
<div v-if="store.visiting" class="star-info">
<StarDescription :star="store.visiting" />
</div>
</div>
</template>
<script setup lang="ts">
import LargeStar from "@/components/LargeStar.vue";
import LargeStarModel from "@/components/LargeStarModel.vue";
import StarDescription from "@/components/StarDescription.vue";
import { useChartStore } from "@/state/stars";
import { useRoute } from "vue-router";
@ -17,3 +27,27 @@ const id: string = route.params.id.toString();
const store = useChartStore();
store.visit(parseInt(id) ?? 1);
</script>
<style scoped>
.star-view {
display: flex;
justify-content: center;
align-items: center;
}
.star-model {
flex-grow: 1;
}
.star-info {
flex-grow: 2;
}
@media (max-width: 720px) {
.star-view {
width: 100%;
align-items: stretch;
flex-direction: column;
}
}
</style>