Implicit surface rendering via ray tracing
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.
 
 
 

120 lines
2.7 KiB

/*
* Copyright (c) 2014-2021, NVIDIA CORPORATION. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* SPDX-FileCopyrightText: Copyright (c) 2014-2021 NVIDIA CORPORATION
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef NV_MISC_INCLUDED
#define NV_MISC_INCLUDED
#include <algorithm>
#include <assert.h>
#include <math.h>
#include <stdlib.h>
#include <string>
#include <vector>
#include "nvprint.hpp"
/**
# functions in nvh
- mipMapLevels : compute number of mip maps
- stringFormat : sprintf for std::string
- frand : random float using rand()
- permutation : fills uint vector with random permutation of values [0... vec.size-1]
*/
namespace nvh {
inline std::string stringFormat(const char* msg, ...)
{
va_list list;
if(msg == 0)
return std::string();
// Speculate needed string size and vsnprintf to std::string.
// If it was too small, we resize and try for the second (and final) time.
std::string str;
str.resize(64);
for(int i = 0; i < 2; ++i)
{
va_start(list, msg);
int charsNeeded = vsnprintf(&str[0], str.size(), msg, list); // charsNeeded doesn't count \0
va_end(list);
if (charsNeeded < 0)
{
assert(!"encoding error");
return std::string();
}
if(charsNeeded < str.size())
{ // Not <= due to \0 terminator (which we trim out of std::string)
str.resize(charsNeeded);
return str;
}
else
{
str.resize(charsNeeded + 1); // Leave room for \0
}
}
assert(!"String should have been resized perfectly second try");
return std::string();
}
inline float frand()
{
return float(rand() % RAND_MAX) / float(RAND_MAX);
}
inline int mipMapLevels(int size)
{
int num = 0;
while(size)
{
num++;
size /= 2;
}
return num;
}
// permutation creates a random permutation of all integer values
// 0..data.size-1 occuring once within data.
inline void permutation(std::vector<unsigned int>& data)
{
size_t size = data.size();
assert(size < RAND_MAX);
for(size_t i = 0; i < size; i++)
{
data[i] = (unsigned int)(i);
}
for(size_t i = size - 1; i > 0; i--)
{
size_t other = rand() % (i + 1);
std::swap(data[i], data[other]);
}
}
} // namespace nvh
#endif