data loading (quick and dirty)

This commit is contained in:
Djairo Hougee 2025-01-23 12:04:18 +01:00
parent d25b7c3cf9
commit d4be857092
3 changed files with 62 additions and 5 deletions

View File

@ -1,14 +1,71 @@
#include "MainWindow.h" #include "MainWindow.h"
#include "hurricanedata/datareader.h"
#include "cuda_runtime.h" #include "cuda_runtime.h"
#include <csignal> #include <csignal>
#include <iostream> #include <iostream>
#include <memory> #include <memory>
#include <vector>
#include "consts.h"
#include "Shader.h" #include "Shader.h"
#include "input/Widget.h" #include "input/Widget.h"
#include "cuda_error.h" #include "cuda_error.h"
// FIXME: this is the worst code in this project - very ad hoc
// this is a blocking operation, and really does not follow any practices of code design
// should really be a proper class like GpuBufferHandler.
void loadData(float* d_data, const int idx) {
std::cout << "hi\n";
std::vector<float> h_data;
std::cout << "hi\n";
std::string path = "data/trimmed";
std::cout << "hi\n";
std::string variable = "T";
std::cout << "hi\n";
DataReader dataReader(path, variable);
std::cout << "hi\n";
size_t dataLength = dataReader.fileLength(idx);
std::cout << "hi\n";
h_data.resize(dataLength);
std::cout << "hi\n";
dataReader.loadFile(h_data.data(), idx);
std::cout << "hi\n";
// getTemperature(h_data, idx);
// getSpeed(h_data, idx);
float* hostVolume = new float[VOLUME_WIDTH * VOLUME_HEIGHT * VOLUME_DEPTH];
for (int i = 0; i < VOLUME_WIDTH * VOLUME_HEIGHT * VOLUME_DEPTH; i++) {
hostVolume[i] = h_data[i + 0*VOLUME_DEPTH*VOLUME_HEIGHT*VOLUME_WIDTH];
// Discard missing values
if (h_data[i + 0*VOLUME_DEPTH*VOLUME_HEIGHT*VOLUME_WIDTH] + epsilon >= infty) hostVolume[i] = -infty;
}
std::cout << "hi\n";
// Reverse the order of hostVolume - why is it upside down anyway?
for (int i = 0; i < VOLUME_WIDTH; i++) {
for (int j = 0; j < VOLUME_HEIGHT; j++) {
for (int k = 0; k < VOLUME_DEPTH/2; k++) {
float temp = hostVolume[i + j*VOLUME_WIDTH + k*VOLUME_WIDTH*VOLUME_HEIGHT];
hostVolume[i + j*VOLUME_WIDTH + k*VOLUME_WIDTH*VOLUME_HEIGHT] = hostVolume[i + j*VOLUME_WIDTH + (VOLUME_DEPTH - 1 - k)*VOLUME_WIDTH*VOLUME_HEIGHT];
hostVolume[i + j*VOLUME_WIDTH + (VOLUME_DEPTH - 1 - k)*VOLUME_WIDTH*VOLUME_HEIGHT] = temp;
}
}
}
std::cout << "hi\n";
// Allocate + copy data to GPU
size_t volumeSize = sizeof(float) * VOLUME_WIDTH * VOLUME_HEIGHT * VOLUME_DEPTH;
std::cout << "hi\n";
cudaMemcpy(d_data, hostVolume, volumeSize, cudaMemcpyHostToDevice);
std::cout << "hi\n";
}
void Window::saveImage() { void Window::saveImage() {
unsigned char* pixels = new unsigned char[this->w * this->h * 3]; unsigned char* pixels = new unsigned char[this->w * this->h * 3];
@ -41,6 +98,8 @@ void framebuffer_size_callback(GLFWwindow* window, int w, int h) {
} }
int Window::init(float* data) { int Window::init(float* data) {
this->data = data;
// init glfw // init glfw
glfwInit(); glfwInit();
// requesting context version 1.0 makes glfw try to provide the latest version if possible // requesting context version 1.0 makes glfw try to provide the latest version if possible
@ -124,6 +183,7 @@ void Window::tick() {
this->widget->tick(1000.0/diff); this->widget->tick(1000.0/diff);
if (this->widget->dateChanged) { if (this->widget->dateChanged) {
// TODO: Load new date file here // TODO: Load new date file here
loadData(this->data, this->widget->date);
this->widget->dateChanged = false; this->widget->dateChanged = false;
} }
if (this->widget->saveImage) { if (this->widget->saveImage) {

View File

@ -107,7 +107,6 @@ void Widget::tick(double fps) {
ImGui::DragFloat("Alpha accum. limit", &this->alphaAcumLimit, 0.01f, 0.0f, 1.0f, "%.2f"); ImGui::DragFloat("Alpha accum. limit", &this->alphaAcumLimit, 0.01f, 0.0f, 1.0f, "%.2f");
ImGui::DragInt("Opacity const. (log [1e-5, 1])", &this->opacityConst, 1, 0, 100, "%d%%", ImGuiSliderFlags_AlwaysClamp); ImGui::DragInt("Opacity const. (log [1e-5, 1])", &this->opacityConst, 1, 0, 100, "%d%%", ImGuiSliderFlags_AlwaysClamp);
ImGui::DragFloat("Levoy Width", &this->levoyWidth, 0.01f, 0.0f, 100.0f, "%.2f"); ImGui::DragFloat("Levoy Width", &this->levoyWidth, 0.01f, 0.0f, 100.0f, "%.2f");
// ImGui::DragFloat("Levoy Focus", &this->levoyFocus, 0.01f, 250.0f, 350.0f, "%.2f");
ImGui::DragFloat("Levoy Focus", &this->levoyFocus, 0.01f, 0.0f, 1.0f, "%.2f"); ImGui::DragFloat("Levoy Focus", &this->levoyFocus, 0.01f, 0.0f, 1.0f, "%.2f");
// the items[] contains the entries for the combobox. The selected index is stored as an int on this->tfComboSelected // the items[] contains the entries for the combobox. The selected index is stored as an int on this->tfComboSelected
@ -115,9 +114,7 @@ void Widget::tick(double fps) {
// whatever value is selected here is available on the gpu as d_tfComboSelected. // whatever value is selected here is available on the gpu as d_tfComboSelected.
const char* items[] = {"Opacity - gradient", "Opacity - sigmoid", "Opacity - constant", "Opacity - levoy"}; const char* items[] = {"Opacity - gradient", "Opacity - sigmoid", "Opacity - constant", "Opacity - levoy"};
if (ImGui::BeginCombo("Transfer function", items[this->tfComboSelected])) { if (ImGui::BeginCombo("Transfer function", items[this->tfComboSelected])) {
// std::cout << "hello???\n";
for (int n = 0; n < IM_ARRAYSIZE(items); n++) { for (int n = 0; n < IM_ARRAYSIZE(items); n++) {
// std::cout << "letsssssa a asdfa???\n";
const bool is_selected = (this->tfComboSelected == n); const bool is_selected = (this->tfComboSelected == n);
if (ImGui::Selectable(items[n], is_selected)) if (ImGui::Selectable(items[n], is_selected))
this->tfComboSelected = n; this->tfComboSelected = n;

View File

@ -43,8 +43,8 @@ void getSpeed(std::vector<float>& speedData, int idx = 0) {
int main() { int main() {
std::vector<float> data; std::vector<float> data;
// getTemperature(data, 254); // 20121028 getTemperature(data, 254); // 20121028
getSpeed(data, 254); // 20121028 // getSpeed(data, 254); // 20121028
std::cout << "DATA size: " << data.size() << std::endl; std::cout << "DATA size: " << data.size() << std::endl;