[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