Cycles render engine, initial commit. This is the engine itself, blender modifications and build instructions will follow later.
Cycles uses code from some great open source projects, many thanks them: * BVH building and traversal code from NVidia's "Understanding the Efficiency of Ray Traversal on GPUs": http://code.google.com/p/understanding-the-efficiency-of-ray-traversal-on-gpus/ * Open Shading Language for a large part of the shading system: http://code.google.com/p/openshadinglanguage/ * Blender for procedural textures and a few other nodes. * Approximate Catmull Clark subdivision from NVidia Mesh tools: http://code.google.com/p/nvidia-mesh-tools/ * Sobol direction vectors from: http://web.maths.unsw.edu.au/~fkuo/sobol/ * Film response functions from: http://www.cs.columbia.edu/CAVE/software/softlib/dorf.php
This commit is contained in:
104
intern/cycles/render/svm.h
Normal file
104
intern/cycles/render/svm.h
Normal file
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
* Copyright 2011, Blender Foundation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef __SVM_H__
|
||||
#define __SVM_H__
|
||||
|
||||
#include "attribute.h"
|
||||
#include "graph.h"
|
||||
#include "shader.h"
|
||||
|
||||
#include "util_set.h"
|
||||
|
||||
CCL_NAMESPACE_BEGIN
|
||||
|
||||
class Device;
|
||||
class DeviceScene;
|
||||
class ImageManager;
|
||||
class KernelSunSky;
|
||||
class Scene;
|
||||
class ShaderGraph;
|
||||
class ShaderInput;
|
||||
class ShaderNode;
|
||||
class ShaderOutput;
|
||||
|
||||
/* Shader Manager */
|
||||
|
||||
class SVMShaderManager : public ShaderManager {
|
||||
public:
|
||||
SVMShaderManager();
|
||||
~SVMShaderManager();
|
||||
|
||||
void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
|
||||
void device_free(Device *device, DeviceScene *dscene);
|
||||
};
|
||||
|
||||
/* Graph Compiler */
|
||||
|
||||
class SVMCompiler {
|
||||
public:
|
||||
SVMCompiler(ShaderManager *shader_manager, ImageManager *image_manager);
|
||||
void compile(Shader *shader, vector<int4>& svm_nodes, int index);
|
||||
|
||||
void stack_assign(ShaderOutput *output);
|
||||
void stack_assign(ShaderInput *input);
|
||||
void stack_link(ShaderInput *input, ShaderOutput *output);
|
||||
void add_node(NodeType type, int a = 0, int b = 0, int c = 0);
|
||||
void add_node(int a = 0, int b = 0, int c = 0, int d = 0);
|
||||
void add_node(NodeType type, const float3& f);
|
||||
void add_node(const float4& f);
|
||||
uint attribute(ustring name);
|
||||
uint attribute(Attribute::Standard std);
|
||||
uint encode_uchar4(uint x, uint y = 0, uint z = 0, uint w = 0);
|
||||
|
||||
ShaderType output_type() { return current_type; }
|
||||
|
||||
ImageManager *image_manager;
|
||||
ShaderManager *shader_manager;
|
||||
KernelSunSky *sunsky;
|
||||
bool background;
|
||||
|
||||
protected:
|
||||
struct Stack {
|
||||
int users[SVM_STACK_SIZE];
|
||||
};
|
||||
|
||||
void stack_clear_temporary(ShaderNode *node);
|
||||
int stack_size(ShaderSocketType type);
|
||||
int stack_find_offset(ShaderSocketType type);
|
||||
void stack_clear_users(ShaderNode *node, set<ShaderNode*>& done);
|
||||
|
||||
bool node_skip_input(ShaderNode *node, ShaderInput *input);
|
||||
|
||||
void find_dependencies(set<ShaderNode*>& dependencies, const set<ShaderNode*>& done, ShaderInput *input);
|
||||
void generate_svm_nodes(const set<ShaderNode*>& nodes, set<ShaderNode*>& done);
|
||||
void generate_closure(ShaderNode *node, set<ShaderNode*> done, Stack stack);
|
||||
|
||||
void compile_type(Shader *shader, ShaderGraph *graph, ShaderType type);
|
||||
|
||||
vector<int4> svm_nodes;
|
||||
ShaderType current_type;
|
||||
Shader *current_shader;
|
||||
Stack active_stack;
|
||||
int max_stack_use;
|
||||
};
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
||||
#endif /* __SVM_H__ */
|
||||
|
Reference in New Issue
Block a user