static const char* mode_to_filetype (mode_t m) { #define HANDLE_TYPE(t,letter) if (m==t) { return letter; } #ifdef S_IFREG HANDLE_TYPE(S_IFREG, "f"); /* regular file */ #endif #ifdef S_IFDIR HANDLE_TYPE(S_IFDIR, "d"); /* directory */ #endif #ifdef S_IFLNK HANDLE_TYPE(S_IFLNK, "l"); /* symbolic link */ #endif #ifdef S_IFSOCK HANDLE_TYPE(S_IFSOCK, "s"); /* Unix domain socket */ #endif #ifdef S_IFBLK HANDLE_TYPE(S_IFBLK, "b"); /* block device */ #endif #ifdef S_IFCHR HANDLE_TYPE(S_IFCHR, "c"); /* character device */ #endif #ifdef S_IFIFO HANDLE_TYPE(S_IFIFO, "p"); /* FIFO */ #endif #ifdef S_IFDOOR HANDLE_TYPE(S_IFDOOR, "D"); /* Door (e.g. on Solaris) */ #endif return "U"; /* Unknown */ }
static void CopyShaderState_Uniforms(GLuint newProgID, GLuint oldProgID, std::unordered_map<std::size_t, Shader::UniformState, fast_hash>* uniformStates) { GLsizei numUniforms, maxUniformNameLength; glGetProgramiv(newProgID, GL_ACTIVE_UNIFORMS, &numUniforms); glGetProgramiv(newProgID, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxUniformNameLength); if (maxUniformNameLength <= 0) return; glUseProgram(newProgID); std::string name(maxUniformNameLength, 0); for (int i = 0; i < numUniforms; ++i) { GLsizei nameLength = 0; GLint size = 0; GLenum type = 0; glGetActiveUniform(newProgID, i, maxUniformNameLength, &nameLength, &size, &type, &name[0]); name[nameLength] = 0; if (nameLength == 0) continue; GLint oldLoc = -1; // only use when we don't got data in our own state tracker const GLint newLoc = glGetUniformLocation(newProgID, &name[0]); if (newLoc < 0) continue; // Try to find old data for the uniform either in the old shader itself or in our own state tracker const size_t hash = hashString(&name[0]); auto it = uniformStates->find(hash); Shader::UniformState* oldUniformState = NULL; if (it != uniformStates->end()) { oldUniformState = &it->second; } else { // Uniform not found in state tracker, try to read it from old shader object //oldUniformState = &(uniformStates->emplace(hash, name).first->second); oldUniformState = &(uniformStates->insert(std::pair<size_t, Shader::UniformState>(hash, Shader::UniformState(name))).first->second); } oldUniformState->SetLocation(newLoc); // Check if we got data we can use to initialize the uniform if (oldUniformState->IsUninit()) { oldLoc = glGetUniformLocation(oldProgID, &name[0]); // No old data found, so we cannot initialize the uniform if (oldLoc < 0) continue; //FIXME read data from old shader save data _in new uniformState_? } // Initialize the uniform with previous data switch (bindingType[type]) { #define HANDLE_TYPE(type, size, ftype, internalTypeName) \ case type##size: { \ internalTypeName _value[size]; \ if (oldLoc >= 0) { \ glGetUniform##ftype(oldProgID, oldLoc, &_value[0]); \ } else { \ memcpy(_value, oldUniformState->GetIntValues(), size * sizeof(internalTypeName)); \ } \ glUniform##size##ftype(newLoc, 1, &_value[0]); \ } break; #define HANDLE_MATTYPE(type, size, ftype, internalTypeName) \ case type##size: { \ internalTypeName _value[size*size]; \ if (oldLoc >= 0) { \ glGetUniform##ftype(oldProgID, oldLoc, &_value[0]); \ } else { \ memcpy(_value, oldUniformState->GetIntValues(), size*size * sizeof(internalTypeName)); \ } \ glUniformMatrix##size##ftype(newLoc, 1, false, &_value[0]); \ } break; HANDLE_TYPE(INT, 1, iv, GLint) HANDLE_TYPE(INT, 2, iv, GLint) HANDLE_TYPE(INT, 3, iv, GLint) HANDLE_TYPE(INT, 4, iv, GLint) HANDLE_TYPE(FLOAT, 1, fv, GLfloat) HANDLE_TYPE(FLOAT, 2, fv, GLfloat) HANDLE_TYPE(FLOAT, 3, fv, GLfloat) HANDLE_TYPE(FLOAT, 4, fv, GLfloat) HANDLE_TYPE(UNSIGNED, 1, uiv, GLuint) HANDLE_TYPE(UNSIGNED, 2, uiv, GLuint) HANDLE_TYPE(UNSIGNED, 3, uiv, GLuint) HANDLE_TYPE(UNSIGNED, 4, uiv, GLuint) HANDLE_MATTYPE(FLOAT_MAT, 2, fv, GLfloat) HANDLE_MATTYPE(FLOAT_MAT, 3, fv, GLfloat) HANDLE_MATTYPE(FLOAT_MAT, 4, fv, GLfloat) /*case ATOMIC: { GLint binding; glGetActiveAtomicCounterBufferiv(oldProgID, i, GL_ATOMIC_COUNTER_BUFFER_BINDING, &binding); glUniform1f(newLoc, 1, binding); } break;*/ default: LOG_L(L_WARNING, "Unknown GLSL uniform \"%s\" has unknown vartype \"%X\"", name.c_str(), type); } } glUseProgram(0); }
void CityObjectElementParser::initializeTypeIDTypeMap() { // double-checked lock if (!typeIDTypeMapInitialized) { std::lock_guard<std::mutex> lock(CityObjectElementParser::initializedTypeIDMutex); if (!typeIDTypeMapInitialized) { typeIDTypeMap.insert(HANDLE_TYPE(GEN, GenericCityObject)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, Building)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, BuildingPart)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, Room)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, BuildingInstallation)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, BuildingFurniture)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, Door)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, Window)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, CityFurniture)); typeIDTypeMap.insert(HANDLE_TYPE(FRN, CityFurniture)); typeIDTypeMap.insert(HANDLE_TYPE(TRANS, Track)); typeIDTypeMap.insert(HANDLE_TYPE(TRANS, Road)); typeIDTypeMap.insert(HANDLE_TYPE(TRANS, Railway)); typeIDTypeMap.insert(HANDLE_TYPE(TRANS, Square)); typeIDTypeMap.insert(HANDLE_GROUP_TYPE(TRANS, TransportationComplex, CityObject::CityObjectsType::COT_TransportationObject)); typeIDTypeMap.insert(HANDLE_GROUP_TYPE(TRANS, TrafficArea, CityObject::CityObjectsType::COT_TransportationObject)); typeIDTypeMap.insert(HANDLE_GROUP_TYPE(TRANS, AuxiliaryTrafficArea, CityObject::CityObjectsType::COT_TransportationObject)); typeIDTypeMap.insert(HANDLE_TYPE(VEG, PlantCover)); typeIDTypeMap.insert(HANDLE_TYPE(VEG, SolitaryVegetationObject)); typeIDTypeMap.insert(HANDLE_TYPE(WTR, WaterBody)); typeIDTypeMap.insert(HANDLE_GROUP_TYPE(WTR, WaterSurface, CityObject::COT_WaterBody)); typeIDTypeMap.insert(HANDLE_GROUP_TYPE(WTR, WaterGroundSurface, CityObject::COT_WaterBody)); typeIDTypeMap.insert(HANDLE_GROUP_TYPE(WTR, WaterClosureSurface, CityObject::COT_WaterBody)); typeIDTypeMap.insert(HANDLE_TYPE(LUSE, LandUse)); typeIDTypeMap.insert(HANDLE_TYPE(SUB, Tunnel)); typeIDTypeMap.insert(HANDLE_TYPE(BRID, Bridge)); typeIDTypeMap.insert(HANDLE_TYPE(BRID, BridgeConstructionElement)); typeIDTypeMap.insert(HANDLE_TYPE(BRID, BridgeInstallation)); typeIDTypeMap.insert(HANDLE_TYPE(BRID, BridgePart)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, WallSurface)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, RoofSurface)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, GroundSurface)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, ClosureSurface)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, FloorSurface)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, InteriorWallSurface)); typeIDTypeMap.insert(HANDLE_TYPE(BLDG, CeilingSurface)); typeIDTypeMap.insert(HANDLE_TYPE(GRP, CityObjectGroup)); typeIDTypeMap.insert(HANDLE_TYPE(DEM, ReliefFeature)); typeIDTypeMapInitialized = true; } } }