mirror of
https://github.com/retroplasma/earth-reverse-engineering.git
synced 2026-01-25 14:16:56 +00:00
112 lines
3.2 KiB
C++
112 lines
3.2 KiB
C++
bool fetchData(const char* path, unsigned char** data, size_t* len) {
|
|
const char* base_url = "http://kh.google.com/rt/earth/";
|
|
char* url = (char*)malloc(strlen(base_url) + strlen(path) + 1);
|
|
strcpy(url, base_url); strcat(url, path);
|
|
printf("GET %s\n", url);
|
|
http_t* request = http_get(url, NULL);
|
|
free(url);
|
|
if (!request) return false;
|
|
|
|
http_status_t status;
|
|
do {
|
|
status = http_process(request);
|
|
SDL_Delay(1);
|
|
} while (status == HTTP_STATUS_PENDING);
|
|
|
|
if (status == HTTP_STATUS_FAILED) {
|
|
http_release(request);
|
|
return false;
|
|
}
|
|
|
|
*data = (unsigned char*)malloc(request->response_size);
|
|
*len = request->response_size;
|
|
memcpy(*data, request->response_data, *len);
|
|
|
|
http_release(request);
|
|
return true;
|
|
}
|
|
|
|
void createDir(const char* path) {
|
|
#ifdef _WIN32
|
|
_mkdir(path);
|
|
#else
|
|
mkdir(path, (mode_t)0755);
|
|
#endif
|
|
}
|
|
|
|
bool readFile(const char* file_path, unsigned char** data, size_t* len) {
|
|
FILE* file = fopen(file_path, "rb");
|
|
if (!file) return false;
|
|
fseek(file, 0, SEEK_END);
|
|
*len = ftell(file);
|
|
*data = (unsigned char*)malloc(*len);
|
|
fseek(file, 0, SEEK_SET);
|
|
fread(*data, *len, 1, file);
|
|
fclose(file);
|
|
return true;
|
|
}
|
|
|
|
void writeFile(const char* file_path, unsigned char* data, size_t len) {
|
|
FILE* file = fopen(file_path, "wb");
|
|
if (!file) return;
|
|
fwrite(data, len, 1, file);
|
|
fclose(file);
|
|
}
|
|
|
|
void imageHalve(unsigned char* pixels, int width, int height, int comp, unsigned char* out) {
|
|
assert(width > 1 && height > 1);
|
|
int half_width = width / 2;
|
|
int half_height = height / 2;
|
|
for (int y = 0; y < half_height; y++) {
|
|
for (int x = 0; x < half_width; x++) {
|
|
for (int ci = 0; ci < comp; ci++) {
|
|
int c = (int)(pixels[comp * (width * (2 * y + 0) + (2 * x + 0)) + ci]
|
|
+ pixels[comp * (width * (2 * y + 0) + (2 * x + 1)) + ci]
|
|
+ pixels[comp * (width * (2 * y + 1) + (2 * x + 0)) + ci]
|
|
+ pixels[comp * (width * (2 * y + 1) + (2 * x + 1)) + ci]);
|
|
out[comp * (half_width * y + x) + ci] = (unsigned char)(c / 4);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void imageHalveHorizontally(unsigned char* pixels, int width, int height, int comp, unsigned char* out) {
|
|
assert(width > 1);
|
|
int half_width = width / 2;
|
|
for (int y = 0; y < height; y++) {
|
|
for (int x = 0; x < half_width; x++) {
|
|
for (int ci = 0; ci < comp; ci++) {
|
|
int c = (int)(pixels[comp * (width * y + 2 * x + 0) + ci]
|
|
+ pixels[comp * (width * y + 2 * x + 1) + ci]);
|
|
out[comp * (half_width * y + x) + ci] = (unsigned char)(c / 2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void imageHalveVertically(unsigned char* pixels, int width, int height, int comp, unsigned char* out) {
|
|
assert(height > 1);
|
|
int half_height = height / 2;
|
|
for (int y = 0; y < half_height; y++) {
|
|
for (int x = 0; x < width; x++) {
|
|
for (int ci = 0; ci < comp; ci++) {
|
|
int c = (int)(pixels[comp * (width * (2 * y + 0) + x) + ci]
|
|
+ pixels[comp * (width * (2 * y + 1) + x) + ci]);
|
|
out[comp * (width * y + x) + ci] = (unsigned char)(c / 2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
bool intersectRaySphere(vec3_t ro, vec3_t rd, vec3_t s, float r, float* t) {
|
|
vec3_t m;
|
|
VectorSubtract(ro, s, m);
|
|
float b = DotProduct(m, rd);
|
|
float c = DotProduct(m, m) - r * r;
|
|
if (c > 0.0f && b > 0.0f) return false;
|
|
float discr = b * b - c;
|
|
if (discr < 0.0f) return false;
|
|
*t = -b - sqrtf(discr);
|
|
return true;
|
|
}
|