Intelligent Sigend Distance Fields
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
3.5 KiB

2 years ago
import os
import pickle
import sys
import math
from optparse import OptionParser
import numpy as np
import test_make_sphere_sdf
def init():
usage = "usage: python3 run.py -f inputFile\n(need to install numpy)"
parser = OptionParser(usage)
parser.add_option("-f", "--file", dest="file",
help="read data from FILENAME(need .raw file)")
parser.add_option("-d", "--demo", dest="demo",
help="Implicit function demo")
parser.add_option("-s", "--size", dest="size",
help="Rendering resolution, must be a power of 2, eg: 128, 256")
# parser.add_option("-s", "--size", dest="dataSize",
# help="the size of input data(x, y, z)")
(optionsMap, argsList) = parser.parse_args()
if len(sys.argv) <= 1:
parser.print_help()
exit(-1)
return optionsMap, argsList
# data is a 3D array
def loadSdfFile(file_path):
data = pickle.load(open(file_path, 'rb'))
x, y, z = data[0].shape[0], data[0].shape[1], data[0].shape[2]
data = data[0]
print("data:")
print(data)
print("x,", x, "y,", y, "z,", z)
data = -data
2 years ago
return x, y, z, data
def saveArrayToRaw(array, output_file, element_type='float32'):
new_array = array.astype(element_type)
new_array.tofile(output_file)
def run(options, pack_value=-999):
status = 0
if os.path.exists("./build"):
status = os.system("cd build && cmake ..")
else:
status = os.system("mkdir build && cd build && cmake ..")
# compile
if status != 0:
os._exit(255)
os.chdir("build")
os.system("make")
os.chdir("../")
# padding and saving raw files
file = options.file
if file:
file_name, file_ext = os.path.splitext(file)
print(file_ext)
size = 256
if file_ext == '.sdf':
x, y, z, data = loadSdfFile(file)
size = np.power(2, math.ceil(math.log2(x)))
size = max(size, np.power(2, math.ceil(math.log2(y))))
size = max(size, np.power(2, math.ceil(math.log2(z))))
pad_width = ((0, size-x), (0, size-y), (0, size-z))
data = np.pad(data, pad_width, mode='constant', constant_values=pack_value)
print(data.shape)
data = data.flatten()
file = file_name + ".raw"
saveArrayToRaw(data, file)
# exec
print("__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia ./build/renderSDF -file " + file + " -size " + str(math.log2(size)))
os.system("__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia ./build/renderSDF -file " + file + " -size " + str(math.log2(size)))
elif file_ext == '.sdf':
# exec
print("__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia ./build/renderSDF -file " + file + " -size " + str(math.log2(size)))
os.system("__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia ./build/renderSDF -file " + file)
else:
raise Exception('Input file extension error!')
else:
render_type = options.demo
size = 128
if options.size:
size = int(options.size)
print("__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia ./build/renderSDF -type " + render_type + " -size " + str(math.log2(size)))
os.system("__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia ./build/renderSDF -type " + render_type + " -size " + str(math.log2(size)))
if __name__ == "__main__":
opt, arg = init()
run(opt)