#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;
}