bool GameState::enter(void* options) { m_crate = new CTexture(); std::wstring crateFile = L"../GameData/Textures/woodcrate01.dds"; m_crate->load(crateFile); m_sky = new CTextureCube(); std::wstring skyFile = L"../GameData/Textures/skybox.dds"; m_sky->load(skyFile); m_grass = new CTexture(); std::wstring grassFile = L"../GameData/Textures/grass.dds"; m_grass->load(grassFile); m_skybox = new SkyMesh(new CSkySphereGeometry(10, 3), new CSkyBoxMaterial(m_sky)); m_playerCube = new CubeMesh(CCubeGeometry::getInstance(), new CBasicMaterial(m_crate)); m_playerCube->translate(glm::vec3(4.95f, 0.0f, 4.95f)); m_sceneCube = new CubeMesh(CCubeGeometry::getInstance(), new CBasicMaterial(m_crate)); m_sceneCube->translate(glm::vec3(-2.0f, 0.0f, 3.0f)); m_ground = new GroundMesh(CQuadGeometry::getInstance(), new CBasicMaterial(m_grass)); m_ground->translate(glm::vec3(0.0f, -1.0f, 0.0f)); std::string fontname = "Arial"; m_font = new CFontWrapper(fontname); m_player = new Player(); m_dirLight = new CLight(); m_pointLights = new CLight[LIGHT_COUNT]; m_pointLightDirs = new glm::vec3[LIGHT_COUNT]; boost::random::mt19937 gen; boost::random::uniform_real_distribution<> pos_dist(-20.0f, 20.0f); boost::random::uniform_real_distribution<> color_dist(0.2f, 1.0f); for (int i = 0; i < LIGHT_COUNT; i++) { m_pointLights[i].Type = POINTLIGHT; m_pointLights[i].LightPosition = glm::vec3(pos_dist(gen), 4.0f, pos_dist(gen)); m_pointLights[i].LightColor = glm::vec3(color_dist(gen), color_dist(gen), color_dist(gen)); m_pointLights[i].LightRange = glm::vec4(8.0f, 8.0f, 8.0f, 1.0f); m_pointLightDirs[i] = glm::normalize(glm::vec3(pos_dist(gen), 0.0f, pos_dist(gen))); } m_player->attach(m_playerCube); CGeometryData test_data; test_data.getPositionVector()->push_back(glm::vec3(1.879789f, 1.23123f, 0.1231231f)); test_data.getPositionVector()->push_back(glm::vec3(1.122789f, 1.21223f, 3.1231231f)); test_data.getPositionVector()->push_back(glm::vec3(1.879789f, 1.23123f, 0.1231231f)); test_data.getPositionVector()->push_back(glm::vec3(1.123789f, 1.23123f, 0.1231231f)); test_data.getPositionVector()->push_back(glm::vec3(1.879789f, 1.12323f, 0.43431231f)); test_data.getPositionVector()->push_back(glm::vec3(0.879789f, 1.23123f, 2.1231231f)); test_data.getPositionVector()->push_back(glm::vec3(0.129789f, 1.23123f, 2.123231f)); test_data.getPositionVector()->push_back(glm::vec3(1.879789f, 4.23123f, 2.1231231f)); test_data.getPositionVector()->push_back(glm::vec3(1.879789f, 4.23123f, 2.1231231f)); test_data.removeDuplicates(); return true; }
// ---------- begin of function ColorTable::generate_table ----------// // // match one set of palette with a universal palette // the set of palette is pointed by sPal, size is sPalSize, // with some reserved color pointed by sReservedColor and size is sReservedCount // the univeral palette is pointed by Pal, size is PalSize, // with some reserved color pointed by reservedColor and size is reservedCount // note : numbers in reservedColor must be in ascending order // // generated map size must be palSize and it has only scale // void ColorTable::generate_table(PalDesc &sPalD, PalDesc &palD) { int sPalSize = sPalD.pal_size, palSize = palD.pal_size; err_when(sPalD.pal == NULL || sPalSize <= 0 || sPalD.reserved_count < 0); err_when(palD.pal == NULL || palSize <= 0 || palD.reserved_count < 0); err_when(palSize > MAX_COLOUR_TABLE_SIZE || sPalSize > MAX_COLOUR_TABLE_SIZE); deinit(); abs_scale = 0; table_size = sPalSize; WORD *remapEntry = remap_table = (WORD *)mem_add(sPalSize); int sReservedIndex = 0; for(int c=0; c < sPalSize; ++c, ++remapEntry) { *remapEntry = c; // put a default value (as if it is a reserved color) // ------ see if it is a reserved color --------// if( sPalD.is_reserved(c, sReservedIndex)) continue; RGBColor rgb = sPalD.get_rgb(c); // ------- scan the closet color, except the reserved color int cc, dist[NEAREST_COLOR], thisDiff; BYTE closeColor[NEAREST_COLOR]; // [0] is the closest for( cc = 0; cc < NEAREST_COLOR; ++cc ) { closeColor[cc] = c; dist[cc] = 3*0xff*0xff+1; } int dReservedIndex = 0; int d; for( d=0; d < palSize; ++d) { // ------- skip scanning reserved color ------// if( palD.is_reserved(d, dReservedIndex) ) continue; // ------- compare the sqaure distance ----------// thisDiff = color_dist(rgb, palD.get_rgb(d)); if( thisDiff < dist[NEAREST_COLOR-1]) { BYTE d1 = (BYTE) d; for( cc = 0; cc < NEAREST_COLOR; ++cc ) { if( thisDiff < dist[cc] ) { // swap thisDiff and dist[cc] // so that the replaced result will be shifted to next int tempd; BYTE tempc; tempd = dist[cc]; dist[cc] = thisDiff; thisDiff = tempd; tempc = closeColor[cc]; closeColor[cc] = d1; d1 = tempc; } } } } // closeColor[] are the closest 8 colours, use hsv comparison to find the nearest d = closeColor[0]; *remapEntry = d; int minDiff = color_dist_hsv(rgb, palD.get_rgb(d)); for( cc = 1; cc < NEAREST_COLOR; ++cc) { d = closeColor[cc]; thisDiff = color_dist_hsv(rgb, palD.get_rgb(d)); if( thisDiff < minDiff ) { minDiff = thisDiff; *remapEntry = d; } } } }