MCPcopy Create free account
hub / github.com/dfranx/SHADERed / UploadDataToImage

Method UploadDataToImage

src/SHADERed/Objects/ObjectManager.cpp:1136–1181  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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;

Callers 1

UpdateMethod · 0.80

Calls

no outgoing calls

Tested by

no test coverage detected