| 1134 | } |
| 1135 | |
| 1136 | void ObjectManager::UploadDataToImage(ImageObject* img, GLuint tex, glm::ivec2 texSize) |
| 1137 | { |
| 1138 | GLuint imgTex = 0; |
| 1139 | for (auto& obj : m_items) |
| 1140 | if (obj->Image == img) { |
| 1141 | imgTex = obj->Texture; |
| 1142 | break; |
| 1143 | } |
| 1144 | |
| 1145 | if (tex != 0 && texSize.x != 0 && texSize.y != 0) { |
| 1146 | int width = std::min<int>(img->Size.x, texSize.x); |
| 1147 | int height = std::min<int>(img->Size.y, texSize.y); |
| 1148 | |
| 1149 | bool needsResize = width != texSize.x; |
| 1150 | |
| 1151 | unsigned char* pixels = (unsigned char*)malloc(texSize.x * texSize.y * 4); |
| 1152 | unsigned char* resPixels = pixels; |
| 1153 | |
| 1154 | // read pixels |
| 1155 | glBindTexture(GL_TEXTURE_2D, tex); |
| 1156 | glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); |
| 1157 | |
| 1158 | if (needsResize) { |
| 1159 | resPixels = (unsigned char*)malloc(width * height * 4); |
| 1160 | for (int y = 0; y < height; y++) |
| 1161 | memcpy(&resPixels[(height - y - 1) * width * 4], &pixels[(texSize.y - y - 1) * texSize.x * 4], width * 4); |
| 1162 | } |
| 1163 | |
| 1164 | glBindTexture(GL_TEXTURE_2D, imgTex); |
| 1165 | glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, resPixels); |
| 1166 | glBindTexture(GL_TEXTURE_2D, 0); |
| 1167 | |
| 1168 | if (needsResize) |
| 1169 | free(resPixels); |
| 1170 | |
| 1171 | free(pixels); |
| 1172 | } else { |
| 1173 | unsigned char* pixels = (unsigned char*)calloc(img->Size.x * img->Size.y, 4); |
| 1174 | |
| 1175 | glBindTexture(GL_TEXTURE_2D, imgTex); |
| 1176 | glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, img->Size.x, img->Size.y, GL_RGBA, GL_UNSIGNED_BYTE, pixels); |
| 1177 | glBindTexture(GL_TEXTURE_2D, 0); |
| 1178 | |
| 1179 | free(pixels); |
| 1180 | } |
| 1181 | } |
| 1182 | void ObjectManager::SaveToFile(ObjectManagerItem* item, const std::string& filepath) |
| 1183 | { |
| 1184 | glm::vec2 imgSize = item->TextureSize; |