• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ekarpp / lumo / 14235426927

03 Apr 2025 03:53AM UTC coverage: 72.653%. First build
14235426927

push

github

ekarpp
0.6.1

* Generalize thread pool
* Paralellize material parsing for scenes
* Implement variable wavelength index of refraction (and dispersion)
* Implement efficiency optimized russian roulette
* Add batching to samplers
* Restricts mediums to scene boundaries
* Fix cylinder bounding box
* Fix instance sample on normals
* Update github actions

290 of 821 new or added lines in 36 files covered. (35.32%)

6740 of 9277 relevant lines covered (72.65%)

39613243.93 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/parser/mtl/task.rs
1
use super::*;
2

3
#[derive(Clone)]
4
pub struct MtlTaskExecutor {
5
    zip_bytes: Arc<Vec<u8>>,
6
    map_ks: bool,
7
}
8

9
impl MtlTaskExecutor {
NEW
10
    pub fn new(zip_bytes: Arc<Vec<u8>>, map_ks: bool) -> Self {
×
NEW
11
        Self { zip_bytes, map_ks }
×
NEW
12
    }
×
13
}
14

15
impl Executor<MtlTask, MtlTaskResult> for MtlTaskExecutor {
NEW
16
    fn exec(&mut self, task: MtlTask) -> MtlTaskResult {
×
NEW
17
        let mut mtl = MtlConfig::default();
×
NEW
18
        let mut mtl_name = String::default();
×
NEW
19
        for line in task.lines {
×
NEW
20
            let tokens: Vec<&str> = line.split_ascii_whitespace().collect();
×
NEW
21
            match tokens[0] {
×
NEW
22
                "newmtl" => mtl_name = tokens[1].to_string(),
×
23
                /* diffuse color */
NEW
24
                "Kd" => {
×
NEW
25
                    let kd = parse_vec3(&tokens)
×
NEW
26
                        .expect("Couldn't parse vec3");
×
NEW
27
                    mtl.Kd = Spectrum::from_rgb(RGB::from(kd));
×
NEW
28
                }
×
29
                /* texture map */
NEW
30
                "map_Kd" => {
×
NEW
31
                    let tex_name = tokens[1..].join(" ").replace('\\', "/");
×
NEW
32
                    let img = super::_img_from_zip(&self.zip_bytes, &tex_name)
×
NEW
33
                        .expect("Couldn't extract image");
×
NEW
34
                    mtl.map_Kd = Some(img);
×
NEW
35
                }
×
36
                /* emission color */
NEW
37
                "Ke" => {
×
NEW
38
                    let ke = parse_vec3(&tokens)
×
NEW
39
                        .expect("Couldn't parse vec3");
×
NEW
40
                    mtl.Ke = Spectrum::from_rgb(RGB::from(ke));
×
NEW
41
                }
×
NEW
42
                "map_Ke" => {
×
NEW
43
                    let tex_name = tokens[1..].join(" ").replace('\\', "/");
×
NEW
44
                    let img = super::_img_from_zip(&self.zip_bytes, &tex_name)
×
NEW
45
                        .expect("Couldn't extract image");
×
NEW
46
                    mtl.map_Ke = Some(img);
×
NEW
47
                }
×
48
                /* specular color */
NEW
49
                "Ks" => {
×
NEW
50
                    let ks = parse_vec3(&tokens)
×
NEW
51
                        .expect("Couldn't parse vec3");
×
NEW
52
                    mtl.Ks = Spectrum::from_rgb(RGB::from(ks));
×
NEW
53
                }
×
NEW
54
                "map_Ks" => {
×
NEW
55
                    let tex_name = tokens[1..].join(" ").replace('\\', "/");
×
NEW
56
                    if self.map_ks {
×
NEW
57
                        let img = super::_img_from_zip(&self.zip_bytes, &tex_name)
×
NEW
58
                            .expect("Couldn't extract image");
×
NEW
59
                        mtl.map_Ks = Some(img);
×
NEW
60
                    } else {
×
NEW
61
                        let bytes = super::_extract_zip(&self.zip_bytes, &tex_name)
×
NEW
62
                            .expect("Couldn't extract image");
×
NEW
63
                        // occlusion, roughness, metalness
×
NEW
64
                        let orm = Image::<Vec3>::mean_vec3_from_file(bytes.as_slice())
×
NEW
65
                            .expect("Couldn't decode image");
×
NEW
66
                        mtl.roughness = orm.y;
×
NEW
67
                        mtl.k = orm.z;
×
NEW
68
                        mtl.Ks = Spectrum::WHITE;
×
NEW
69
                    }
×
70
                }
71
                /* bump map */
NEW
72
                "map_Bump" => {
×
NEW
73
                    let map_name = tokens[1..].join(" ").replace('\\', "/");
×
NEW
74
                    let bytes = super::_extract_zip(&self.zip_bytes, &map_name)
×
NEW
75
                        .expect("Couldn't extract image");
×
NEW
76
                    mtl.map_Bump = Some(Image::bump_from_file(bytes.as_slice())
×
NEW
77
                                        .expect("Couldn't decode image"));
×
NEW
78
                }
×
79
                /* transmission filter */
NEW
80
                "Tf" => {
×
NEW
81
                    let tf = parse_vec3(&tokens)
×
NEW
82
                        .expect("Couldn't parse vec3");
×
NEW
83
                    mtl.Tf = Spectrum::from_rgb(RGB::from(tf));
×
NEW
84
                }
×
85
                /* refraction index */
NEW
86
                "Ni" => {
×
NEW
87
                    let ni = parse_double(tokens[1])
×
NEW
88
                        .expect("Couldn't parse double");
×
NEW
89
                    mtl.eta = ni;
×
NEW
90
                }
×
91
                /* roughness */
NEW
92
                "Ns" => {
×
NEW
93
                    let ns = parse_double(tokens[1])
×
NEW
94
                        .expect("Couldn't parse double");
×
NEW
95
                    // blender uses this mapping
×
NEW
96
                    mtl.roughness = 1.0 - ns.min(900.0).sqrt() / 30.0;
×
NEW
97
                }
×
98
                /* illumination model */
NEW
99
                "illum" => {
×
NEW
100
                    let illum = parse_double(tokens[1])
×
NEW
101
                        .expect("Couldn't parse double")as usize;
×
NEW
102
                    match illum {
×
NEW
103
                        5 => mtl.fresnel_enabled = true,
×
NEW
104
                        6 => mtl.is_transparent = true,
×
NEW
105
                        7 => { mtl.fresnel_enabled = true; mtl.is_transparent = true; },
×
NEW
106
                        _ => (),
×
107
                    }
108
                }
NEW
109
                _ => (),
×
110

111
            }
112
        }
113

NEW
114
        MtlTaskResult::new(mtl, mtl_name)
×
NEW
115
    }
×
116
}
117

118
pub struct MtlTask {
119
    pub lines: Vec<String>,
120
}
121

122
impl MtlTask {
NEW
123
    pub fn new(lines: Vec<String>) -> Self {
×
NEW
124
        Self { lines }
×
NEW
125
    }
×
126
}
127

128
pub struct MtlTaskResult {
129
    pub mtl_cfg: MtlConfig,
130
    pub mtl_name: String,
131
}
132

133
impl MtlTaskResult {
NEW
134
    pub fn new(mtl_cfg: MtlConfig, mtl_name: String) -> Self {
×
NEW
135
        Self { mtl_cfg, mtl_name }
×
NEW
136
    }
×
137
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc