#include <iostream>
#include <cmath>
using namespace std;
inline float saturate(float a) {
return min(max(a, 0.0f), 1.0f);
}
inline uint32_t MakeCookTorranceMaterial(float roughness, float fresnel, float specular) {
return uint32_t(saturate(roughness) * 1023.0f) |
(uint32_t(saturate(fresnel) * 1023.0f) << 10) |
(uint32_t(saturate(specular) * 1023.0f) << 20);
}
inline float GetCookTorranceRoughness(uint32_t material) {
return float(0x3FF & material) / 1023.0f;
}
inline float GetCookTorranceFresnel(uint32_t material) {
return float(0x3FF &(material >> 10)) / 1023.0f;
}
inline float GetCookTorranceSpecular(uint32_t material) {
return float(0x3FF & (material >> 20)) / 1023.0f;
}
int main() {
// your code goes here
auto m = MakeCookTorranceMaterial(0.35, 0.5, 1);
cout << GetCookTorranceRoughness(m) << endl;
cout << GetCookTorranceFresnel(m) << endl;
cout << GetCookTorranceSpecular(m) << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y21hdGg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbmxpbmUgZmxvYXQgc2F0dXJhdGUoZmxvYXQgYSkgewoJcmV0dXJuIG1pbihtYXgoYSwgMC4wZiksIDEuMGYpOwp9CgppbmxpbmUgdWludDMyX3QgTWFrZUNvb2tUb3JyYW5jZU1hdGVyaWFsKGZsb2F0IHJvdWdobmVzcywgZmxvYXQgZnJlc25lbCwgZmxvYXQgc3BlY3VsYXIpIHsKCXJldHVybiB1aW50MzJfdChzYXR1cmF0ZShyb3VnaG5lc3MpICogMTAyMy4wZikgfAoJCSh1aW50MzJfdChzYXR1cmF0ZShmcmVzbmVsKSAqIDEwMjMuMGYpIDw8IDEwKSB8CgkJKHVpbnQzMl90KHNhdHVyYXRlKHNwZWN1bGFyKSAqIDEwMjMuMGYpIDw8IDIwKTsKfQoKaW5saW5lIGZsb2F0IEdldENvb2tUb3JyYW5jZVJvdWdobmVzcyh1aW50MzJfdCBtYXRlcmlhbCkgewoJcmV0dXJuIGZsb2F0KDB4M0ZGICYgbWF0ZXJpYWwpIC8gMTAyMy4wZjsKfQoKaW5saW5lIGZsb2F0IEdldENvb2tUb3JyYW5jZUZyZXNuZWwodWludDMyX3QgbWF0ZXJpYWwpIHsKCXJldHVybiBmbG9hdCgweDNGRiAmKG1hdGVyaWFsID4+IDEwKSkgLyAxMDIzLjBmOwp9CgppbmxpbmUgZmxvYXQgR2V0Q29va1RvcnJhbmNlU3BlY3VsYXIodWludDMyX3QgbWF0ZXJpYWwpIHsKCXJldHVybiBmbG9hdCgweDNGRiAmIChtYXRlcmlhbCA+PiAyMCkpIC8gMTAyMy4wZjsKfQoKaW50IG1haW4oKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCgkKCWF1dG8gbSA9IE1ha2VDb29rVG9ycmFuY2VNYXRlcmlhbCgwLjM1LCAwLjUsIDEpOwoJCgljb3V0IDw8IEdldENvb2tUb3JyYW5jZVJvdWdobmVzcyhtKSA8PCBlbmRsOwoJY291dCA8PCBHZXRDb29rVG9ycmFuY2VGcmVzbmVsKG0pIDw8IGVuZGw7Cgljb3V0IDw8IEdldENvb2tUb3JyYW5jZVNwZWN1bGFyKG0pIDw8IGVuZGw7CgkKCXJldHVybiAwOwp9