[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12271] branches/qdune/blender:
Brecht Van Lommel
brechtvanlommel at pandora.be
Wed Oct 17 17:49:00 CEST 2007
Revision: 12271
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12271
Author: blendix
Date: 2007-10-17 17:48:59 +0200 (Wed, 17 Oct 2007)
Log Message:
-----------
Initial QDune blender integration, most blender features are still missing.
Building:
- Only Scons support is available at the moment.
QDune Notes:
- Only files in subdirectories are used, the standalone applications
qdrender.cpp and mktex.cpp in the main directory are not compiled.
- This also means the new/delete overloading from qdrender.cpp is not used,
need to find out how best to deal with debugging memory allocations/leaks.
- ri.h has been extended with RiBlender functions.
- Added a blender directory with BlenderOptions and BlenderShader classes.
- Added uint64 type in QDRender.h.
- Added get_du, get_dv functions to MicroPolygonGrid.
- Added blender_surface_shader and blender_displacement_shader to attributes.
- Added a BLENDER framebuffer type, though the pixels are still mostly sent
to blender from the zbuffer hidder (should be changed).
- Added a RiBlenderViewPlane function to let qdune directly uses blender's
viewplane (much easier than trying to find the correspondence between the
camera models). Added Ortho and Frustum functions in Transform.cpp to turn
these parameters into a matrix.
- Renamed the noise hash variable names in Noise.cpp to have a qd_ prefix, to
avoid conflict with existing variable names in blender.
- Changed the behavior of normalize and vsetlength to to set the vector to
zero if it has length zero, instead of giving uninitialized values.
- The ccdata files are now compiled in using datatoc, instead of being read
from a file, but they are huge, need to figure out some way to make them
smaller.
- Bugfix: create the default cubic basis matrices in State::begin instead of
the State::State because they were being freed in State::end, which could
give crashes on re-render.
- Bugfix: in RiEnd(), set _tokens and _parms to NULL after delete; to avoid
double free on re-render.
- Bugfix: Primitives::linear_dice in case of curves should only interpolate
between 2 values each time, not 4, otherwise will read outside the array
bounds.
Blender Notes:
- renderinterface.h has a generic render interface used by both blender
internal and qdune.
- convertblender.c calls functions in this interface instead of directly
creating blender internal geometry.
Known Bugs:
- Interrupting (esc) during "preparing scene" will not work well, might
crash.
Modified Paths:
--------------
branches/qdune/blender/extern/SConscript
branches/qdune/blender/extern/qdune/core/Attributes.cpp
branches/qdune/blender/extern/qdune/core/Attributes.h
branches/qdune/blender/extern/qdune/core/Camera.cpp
branches/qdune/blender/extern/qdune/core/Mathutil.h
branches/qdune/blender/extern/qdune/core/Noise.cpp
branches/qdune/blender/extern/qdune/core/Options.h
branches/qdune/blender/extern/qdune/core/QDRender.h
branches/qdune/blender/extern/qdune/core/State.cpp
branches/qdune/blender/extern/qdune/core/State.h
branches/qdune/blender/extern/qdune/core/Transform.cpp
branches/qdune/blender/extern/qdune/core/Transform.h
branches/qdune/blender/extern/qdune/framebuffer/FrameBuffer.cpp
branches/qdune/blender/extern/qdune/framebuffer/FrameBuffer.h
branches/qdune/blender/extern/qdune/framework/ReyesFramework.cpp
branches/qdune/blender/extern/qdune/hider/Hider.h
branches/qdune/blender/extern/qdune/hider/ZbufferHider.cpp
branches/qdune/blender/extern/qdune/hider/ZbufferHider.h
branches/qdune/blender/extern/qdune/mpgrid/MicroPolygonGrid.cpp
branches/qdune/blender/extern/qdune/mpgrid/MicroPolygonGrid.h
branches/qdune/blender/extern/qdune/primitives/CCSubdivision.cpp
branches/qdune/blender/extern/qdune/primitives/Points.cpp
branches/qdune/blender/extern/qdune/primitives/Primitive.cpp
branches/qdune/blender/extern/qdune/ribparse/ri.cpp
branches/qdune/blender/extern/qdune/ribparse/ri.h
branches/qdune/blender/extern/qdune/svm/slshader.cpp
branches/qdune/blender/source/blender/blenkernel/BKE_displist.h
branches/qdune/blender/source/blender/blenkernel/BKE_modifier.h
branches/qdune/blender/source/blender/blenkernel/intern/curve.c
branches/qdune/blender/source/blender/blenkernel/intern/customdata.c
branches/qdune/blender/source/blender/blenkernel/intern/displist.c
branches/qdune/blender/source/blender/blenkernel/intern/material.c
branches/qdune/blender/source/blender/blenkernel/intern/modifier.c
branches/qdune/blender/source/blender/blenkernel/intern/scene.c
branches/qdune/blender/source/blender/blenloader/intern/readfile.c
branches/qdune/blender/source/blender/makesdna/DNA_customdata_types.h
branches/qdune/blender/source/blender/makesdna/DNA_material_types.h
branches/qdune/blender/source/blender/makesdna/DNA_scene_types.h
branches/qdune/blender/source/blender/render/SConscript
branches/qdune/blender/source/blender/render/intern/include/envmap.h
branches/qdune/blender/source/blender/render/intern/include/initrender.h
branches/qdune/blender/source/blender/render/intern/include/pixelshading.h
branches/qdune/blender/source/blender/render/intern/include/render_types.h
branches/qdune/blender/source/blender/render/intern/include/renderdatabase.h
branches/qdune/blender/source/blender/render/intern/include/shading.h
branches/qdune/blender/source/blender/render/intern/source/Makefile
branches/qdune/blender/source/blender/render/intern/source/convertblender.c
branches/qdune/blender/source/blender/render/intern/source/envmap.c
branches/qdune/blender/source/blender/render/intern/source/initrender.c
branches/qdune/blender/source/blender/render/intern/source/pipeline.c
branches/qdune/blender/source/blender/render/intern/source/pixelshading.c
branches/qdune/blender/source/blender/render/intern/source/raytrace.c
branches/qdune/blender/source/blender/render/intern/source/rendercore.c
branches/qdune/blender/source/blender/render/intern/source/renderdatabase.c
branches/qdune/blender/source/blender/render/intern/source/shadeinput.c
branches/qdune/blender/source/blender/render/intern/source/shadeoutput.c
branches/qdune/blender/source/blender/render/intern/source/texture.c
branches/qdune/blender/source/blender/render/intern/source/zbuf.c
branches/qdune/blender/source/blender/src/buttons_object.c
branches/qdune/blender/source/blender/src/buttons_scene.c
branches/qdune/blender/source/blender/src/buttons_shading.c
branches/qdune/blender/source/blender/yafray/intern/yafray_Render.cpp
Added Paths:
-----------
branches/qdune/blender/extern/qdune/SConscript
branches/qdune/blender/extern/qdune/blender/
branches/qdune/blender/extern/qdune/blender/BlenderOptions.cpp
branches/qdune/blender/extern/qdune/blender/BlenderOptions.h
branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp
branches/qdune/blender/extern/qdune/blender/BlenderShader.h
branches/qdune/blender/extern/qdune/primitives/ccdata50.dat.cpp
branches/qdune/blender/extern/qdune/primitives/ccdata50NT.dat.cpp
branches/qdune/blender/source/blender/render/intern/include/renderinterface.h
branches/qdune/blender/source/blender/render/intern/source/blenderinterface.c
branches/qdune/blender/source/blender/render/intern/source/qdinterface.c
Modified: branches/qdune/blender/extern/SConscript
===================================================================
--- branches/qdune/blender/extern/SConscript 2007-10-17 15:27:38 UTC (rev 12270)
+++ branches/qdune/blender/extern/SConscript 2007-10-17 15:48:59 UTC (rev 12271)
@@ -16,3 +16,6 @@
if env['WITH_BF_FFMPEG'] and env['BF_FFMPEG_LIB'] == '':
SConscript(['ffmpeg/SConscript']);
+
+SConscript(['qdune/SConscript'])
+
Added: branches/qdune/blender/extern/qdune/SConscript
===================================================================
--- branches/qdune/blender/extern/qdune/SConscript (rev 0)
+++ branches/qdune/blender/extern/qdune/SConscript 2007-10-17 15:48:59 UTC (rev 12271)
@@ -0,0 +1,14 @@
+#!/usr/bin/python
+
+Import ('env')
+
+sources = env.Glob('*/*.cpp')
+
+incs = 'blender core framebuffer framework hider imgio mpgrid primitives qdtl'
+incs += ' ribparse svm ' + env['BF_OPENEXR_INC']
+incs += ' #/source/blender/render/extern/include'
+incs += ' #/source/blender/makesdna'
+defs = ''
+
+env.BlenderLib ('blender_qdune', sources, Split(incs), Split(defs), libtype='blender', priority=10 )
+
Added: branches/qdune/blender/extern/qdune/blender/BlenderOptions.cpp
===================================================================
--- branches/qdune/blender/extern/qdune/blender/BlenderOptions.cpp (rev 0)
+++ branches/qdune/blender/extern/qdune/blender/BlenderOptions.cpp 2007-10-17 15:48:59 UTC (rev 12271)
@@ -0,0 +1,51 @@
+#include <iostream>
+
+#include "BlenderOptions.h"
+
+__BEGIN_QDRENDER
+
+#ifdef _MSC_VER
+#pragma warning(disable : 4996)
+#endif
+
+//----------------------------------------------------------
+// BlenderOptions
+
+BlenderOptions::BlenderOptions()
+{
+ enabled= false;
+
+ // functions
+ bucketAdd = NULL;
+ bucketBegin = NULL;
+ bucketUpdate = NULL;
+ bucketEnd = NULL;
+
+ testBreak = NULL;
+
+ shadeInit = NULL;
+ shade = NULL;
+ shadeDisplacement = NULL;
+ shadeBackground = NULL;
+
+ // camera
+ viewPlane[0] = 0;
+ viewPlane[1] = 0;
+ viewPlane[2] = 0;
+ viewPlane[3] = 0;
+
+ // buckets
+ bucketOrder = RI_SWEEP_ORDER;
+
+ // thread
+ thread = NULL;
+}
+
+BlenderOptions::~BlenderOptions()
+{
+ //nothing to do
+}
+
+//------------------------------------------------------------------------------
+
+__END_QDRENDER
Added: branches/qdune/blender/extern/qdune/blender/BlenderOptions.h
===================================================================
--- branches/qdune/blender/extern/qdune/blender/BlenderOptions.h (rev 0)
+++ branches/qdune/blender/extern/qdune/blender/BlenderOptions.h 2007-10-17 15:48:59 UTC (rev 12271)
@@ -0,0 +1,37 @@
+#ifndef BLENDER_OPTIONS_H
+#define BLENDER_OPTIONS_H
+
+#include "ri.h"
+
+#include "QDRender.h"
+__BEGIN_QDRENDER
+
+class BlenderOptions
+{
+public:
+ BlenderOptions();
+ ~BlenderOptions();
+
+ RtBoolean enabled;
+
+ RtBlenderThread *thread;
+
+ RtFloat viewPlane[4];
+ RtToken bucketOrder;
+
+ RtBlenderBucketAdd bucketAdd;
+ RtBlenderBucketBegin bucketBegin;
+ RtBlenderBucketUpdate bucketUpdate;
+ RtBlenderBucketEnd bucketEnd;
+
+ RtBlenderTestBreak testBreak;
+
+ RtBlenderShadeInit shadeInit;
+ RtBlenderShade shade;
+ RtBlenderShadeDisplacement shadeDisplacement;
+ RtBlenderShadeBackground shadeBackground;
+};
+
+__END_QDRENDER
+
+#endif // BLENDER_OPTIONS_H
Added: branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp
===================================================================
--- branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp (rev 0)
+++ branches/qdune/blender/extern/qdune/blender/BlenderShader.cpp 2007-10-17 15:48:59 UTC (rev 12271)
@@ -0,0 +1,251 @@
+
+#include "BlenderShader.h"
+#include "MicroPolygonGrid.h"
+#include "Mathutil.h"
+
+/* blender includes for structs only, no function calls */
+extern "C" {
+#include "RE_shader_ext.h"
+#include "DNA_material_types.h"
+#include "DNA_scene_types.h"
+}
+
+RtBlenderThread *BLENDER_THREAD = NULL; // TODO
+
+__BEGIN_QDRENDER
+
+//------------------------------------------------------------------------------
+// BlenderShader
+
+BlenderShader::BlenderShader()
+{
+}
+
+BlenderShader::~BlenderShader()
+{
+}
+
+RtVoid BlenderShader::run(MicroPolygonGrid* grid, bool displace)
+{
+ Material *mat;
+ RtPoint *P;
+ RtVector *I;
+ RtVector *dPdu = NULL, *dPdv = NULL;
+ RtNormal *N;
+ RtColor *Ci;
+ RtColor *Oi;
+ RtNormal nor;
+ RtVector *orco = NULL, *orcodu = NULL, *orcodv = NULL;
+ RtFloat *stress = NULL;
+ RtVector *uv[8], *uvdu[8], *uvdv[8];
+ float du, dv;
+ char uvtoken[128];
+ int a, i, n, texco;
+ ShadeInput shi;
+ ShadeResult shr;
+
+ blenderShadeInit(BLENDER_THREAD, &shi, &shr);
+ mat = (Material*)blender_material[0];
+ n = grid->get_nverts();
+
+ texco= mat->texco;
+
+ /* pass option forces UV calc */
+ if(shi.passflag & SCE_PASS_UV)
+ texco |= (NEED_UV|TEXCO_UV);
+
+ P = (RtPoint*)grid->findVariable("P");
+ N = (RtNormal*)grid->findVariable("N");
+ I = (RtVector*)grid->findVariable("I");
+ Ci = (RtColor*)grid->addVariable("Ci");
+ Oi = (RtColor*)grid->addVariable("Oi");
+
+ dPdu = (RtVector*)grid->findVariable("dPdu");
+ dPdv = (RtVector*)grid->findVariable("dPdv");
+
+ /* shade_input_set_triangle_i */
+ shi.mat= shi.mat_override? shi.mat_override: mat;
+ shi.osatex= (shi.mat->texco & TEXCO_OSA);
+ shi.mode= shi.mat->mode_l; /* or-ed result for all nodes */
+
+ du = grid->get_du();
+ dv = grid->get_dv();
+
+ /* get texture coordinate variables */
+ if(texco & TEXCO_ORCO) {
+ orco = (float(*)[3])grid->findVariable("orco");
+
+ if(orco && shi.osatex) {
+ orcodu = new RtVector[n];
+ orcodv = new RtVector[n];
+
+ grid->DuV(orcodu, orco);
+ grid->DvV(orcodv, orco);
+ }
+ }
+
+ memset(uv, 0, sizeof(RtVector*)*8);
+ memset(uvdu, 0, sizeof(RtVector*)*8);
+ memset(uvdv, 0, sizeof(RtVector*)*8);
+ if(texco & TEXCO_UV) {
+ for(a=0; a<1; a++) {
+ sprintf(uvtoken, "uv%d", a);
+ uv[a] = (RtVector*)grid->findVariable(uvtoken);
+ printf("%p\n", uv[a]);
+
+ if(shi.osatex) {
+ uvdu[a] = new RtVector[n];
+ uvdv[a] = new RtVector[n];
+
+ grid->DuV(uvdv[a], uv[a]);
+ grid->DvV(uvdv[a], uv[a]);
+ }
+ }
+ }
+ if(texco & TEXCO_STRESS)
+ stress = (float*)grid->findVariable("stress");
+
+ for (i=0; i<n; i++) {
+ /* shadeinput_set_normals and viewco */
+ vnormalize(nor, N[i]);
+ nor[0]= -nor[0];
+ nor[1]= -nor[1];
+ nor[2]= nor[2];
+
+ shi.facenor[0]= nor[0];
+ shi.facenor[1]= nor[1];
+ shi.facenor[2]= nor[2];
+
+ shi.orignor[0]= shi.facenor[0];
+ shi.orignor[1]= shi.facenor[1];
+ shi.orignor[2]= shi.facenor[2];
+ /* TODO if (vlr->noflag & R_FLIPPED_NO) { */
+
+ /* shade_input_set_viewco */
+ shi.xs= 0;
+ shi.ys= 0;
+
+ vnormalize(shi.view, I[i]);
+ shi.view[2]= -shi.view[2];
+
+ shi.co[0]= P[i][0];
+ shi.co[1]= P[i][1];
+ shi.co[2]= -P[i][2];
+
+ shi.dxco[0]= dPdu[i][0];
+ shi.dxco[1]= dPdu[i][1];
+ shi.dxco[2]= dPdu[i][2];
+
+ shi.dyco[0]= dPdv[i][0];
+ shi.dyco[1]= dPdv[i][1];
+ shi.dyco[2]= dPdv[i][2];
+
+ shi.vn[0]= nor[0];
+ shi.vn[1]= nor[1];
+ shi.vn[2]= nor[2];
+
+ shi.vno[0]= shi.vn[0];
+ shi.vno[1]= shi.vn[1];
+ shi.vno[2]= shi.vn[2];
+
+ /* TODO dxco, dxview */
+ /* TODO mask, samplenr */
+
+ /* texture coordinates */
+ if((texco & TEXCO_ORCO) && orco) {
+ shi.lo[0]= orco[i][0];
+ shi.lo[1]= orco[i][1];
+ shi.lo[2]= orco[i][2];
+
+ if(shi.osatex) {
+ shi.dxlo[0]= orcodu[i][0]*du;
+ shi.dxlo[1]= orcodu[i][1]*du;
+ shi.dxlo[2]= orcodu[i][2]*du;
+
+ shi.dylo[0]= orcodv[i][0]*dv;
+ shi.dylo[1]= orcodv[i][1]*dv;
+ shi.dylo[2]= orcodv[i][2]*dv;
+ }
+ }
+
+#if 0
+ if(texco & TEXCO_GLOB) {
+ VECCOPY(shi.gl, shi.co);
+ MTC_Mat4MulVecfl(R.viewinv, shi.gl);
+ if(shi.osatex) {
+ VECCOPY(shi.dxgl, shi.dxco);
+ MTC_Mat3MulVecfl(R.imat, shi.dxco);
+ VECCOPY(shi.dygl, shi.dyco);
+ MTC_Mat3MulVecfl(R.imat, shi.dyco);
+ }
+ }
+#endif
+
+ if(texco & TEXCO_UV) {
+ for(a=0; a<1; a++) {
+ ShadeInputUV *suv= &shi.uv[a];
+
+ shi.totuv++;
+ suv->name= "";;
+
+ suv->uv[0]= -1.0f + 2.0f*uv[a][i][0];
+ suv->uv[1]= -1.0f + 2.0f*uv[a][i][1];
+ suv->uv[2]= 0.0f;
+
+ if(shi.osatex) {
+#if 0
+ suv->dxuv[0]= 2.0f*uvdu[a][i][0]*du;
+ suv->dxuv[1]= 2.0f*uvdu[a][i][1]*du;
+ suv->dxuv[2]= 0.0f;
+
+ suv->dyuv[0]= 2.0f*uvdv[a][i][0]*dv;
+ suv->dyuv[1]= 2.0f*uvdv[a][i][1]*dv;
+ suv->dyuv[2]= 0.0f;
+#endif
+ }
+ }
+ }
+
+ if((texco & TEXCO_STRESS) && stress) {
+ shi.stress= stress[i];
+ if(shi.stress<1.0f) shi.stress-= 1.0f;
+ else shi.stress= (shi.stress-1.0f)/shi.stress;
+ }
+
+ if(displacement) {
+ RtVector displacement;
+
+ blenderShadeDisplacement(BLENDER_THREAD,
+ (RtBlenderShadeInput*)&shi, displacement);
+
+ P[i][0] += displacement[0];
+ P[i][1] += displacement[1];
+ P[i][2] -= displacement[2];
+ }
+ else {
+ blenderShade(BLENDER_THREAD, (RtBlenderShadeInput*)&shi,
+ (RtBlenderShadeResult*)&shr);
+
+ Ci[i][0]= shr.combined[0];
+ Ci[i][1]= shr.combined[1];
+ Ci[i][2]= shr.combined[2];
+ Oi[i][0]= shr.combined[3];
+ Oi[i][1]= shr.combined[3];
+ Oi[i][2]= shr.combined[3];
+
+ }
+ }
+
+ if(orcodu) delete orcodu;
+ if(orcodv) delete orcodv;
+
+ for(a=0; a<8; a++) {
+ if(uvdu[a]) {
+ delete uvdu[a];
+ delete uvdv[a];
+ }
+ }
+}
+
+__END_QDRENDER
+
Added: branches/qdune/blender/extern/qdune/blender/BlenderShader.h
===================================================================
--- branches/qdune/blender/extern/qdune/blender/BlenderShader.h (rev 0)
+++ branches/qdune/blender/extern/qdune/blender/BlenderShader.h 2007-10-17 15:48:59 UTC (rev 12271)
@@ -0,0 +1,32 @@
+#ifndef _BLENDERSHADER_H
+#define _BLENDERSHADER_H
+
+#include "ri.h"
+
+#include "QDRender.h"
+__BEGIN_QDRENDER
+
+class MicroPolygonGrid;
+class BlenderShader
+{
+public:
+ // ctor
+ BlenderShader();
+ // dtor
+ ~BlenderShader();
+ // mtds
+ RtVoid run(MicroPolygonGrid* grid, bool displace=false);
+ // data
+ RtVoid *blender_material[16]; /* MAX_MATERIALS */
+ RtVoid *blender_object;
+ // blender functions
+ RtBlenderShadeInit blenderShadeInit;
+ RtBlenderShade blenderShade;
+ RtBlenderShadeDisplacement blenderShadeDisplacement;
+ // bool
+ bool displacement;
+};
+
+__END_QDRENDER
+
+#endif // _BLENDERSHADER_H
Modified: branches/qdune/blender/extern/qdune/core/Attributes.cpp
===================================================================
--- branches/qdune/blender/extern/qdune/core/Attributes.cpp 2007-10-17 15:27:38 UTC (rev 12270)
+++ branches/qdune/blender/extern/qdune/core/Attributes.cpp 2007-10-17 15:48:59 UTC (rev 12271)
@@ -35,6 +35,9 @@
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list