Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlfredo de Greef <eeshlo@yahoo.com>2006-06-05 06:24:12 +0400
committerAlfredo de Greef <eeshlo@yahoo.com>2006-06-05 06:24:12 +0400
commit6f0d7e8d1fd25e106456256e87eb25003fcc89c4 (patch)
tree593c024fe11dd18fe30c1710b76b788d08235b0a /source/blender/yafray/intern/export_File.cpp
parentac27f21b36dceddc9ed6dd08135fc779467314da (diff)
bugfix #4072 added support for strandmapping, done by exporting the
strand texcoords as orco coords, so yafray doesn't have to be adapted for this. bugfix #4254 added support for dupligroups, but might not work completely correct yet at this point, more testing needed. Also added some missing parts from the code apparently removed at some time. Mainly having to do with dupliverts, cam.info for aspect ratio/ortho mode/etc. Header stats (render window) should now work again too. Fixed missing last tile draw of render window. Added the missing const_cast in the win32 part of the xml export code.
Diffstat (limited to 'source/blender/yafray/intern/export_File.cpp')
-rwxr-xr-xsource/blender/yafray/intern/export_File.cpp108
1 files changed, 68 insertions, 40 deletions
diff --git a/source/blender/yafray/intern/export_File.cpp b/source/blender/yafray/intern/export_File.cpp
index 070ff9abc01..25e51a1b0bb 100755
--- a/source/blender/yafray/intern/export_File.cpp
+++ b/source/blender/yafray/intern/export_File.cpp
@@ -157,7 +157,7 @@ bool yafrayFileRender_t::initExport()
#ifdef WIN32
// try to create it
cout << "Trying to create...\n";
- if (createDir(xmlpath.c_str())==0) dir_failed=true; else dir_failed=false;
+ if (createDir(const_cast<char*>(xmlpath.c_str()))==0) dir_failed=true; else dir_failed=false;
#else
dir_failed = true;
#endif
@@ -1048,7 +1048,8 @@ void yafrayFileRender_t::writeMaterialsAndModulators()
else if ((mtex->texco & TEXCO_GLOB) || (mtex->texco & TEXCO_OBJECT))
// object mode is also set as global, but the object matrix was specified above with <modulator..>
ostr << "\t\t<texco value=\"global\" />\n";
- else if (mtex->texco & TEXCO_ORCO)
+ else if ((mtex->texco & TEXCO_ORCO) || (mtex->texco & TEXCO_STRAND))
+ // orco flag now used for 'strand'-mapping as well, see mesh code
ostr << "\t\t<texco value=\"orco\" />\n";
else if (mtex->texco & TEXCO_WINDOW)
ostr << "\t\t<texco value=\"window\" />\n";
@@ -1217,10 +1218,13 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
// Test the rendermaterial texco flag instead.
// update2: bug #3193 it seems it has changed again with the introduction of static 'hair' particles,
// now it uses the vert pointer again as an extra test to make sure there are orco coords available
- bool EXPORT_ORCO = (((face0mat->texco & TEXCO_ORCO)!=0) && (face0->v1->orco!=NULL));
+ int has_orco = 0;
+ if (face0mat->texco & TEXCO_STRAND)
+ has_orco = 1;
+ else
+ has_orco = (((face0mat->texco & TEXCO_ORCO)!=0) && (face0->v1->orco!=NULL)) ? 2 : 0;
- string has_orco = "off";
- if (EXPORT_ORCO) has_orco = "on";
+ string has_orco_st = has_orco ? "on" : "off";
// smooth shading if enabled
bool no_auto = true; //in case non-mesh, or mesh has no autosmooth
@@ -1229,7 +1233,7 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
if (mesh->flag & ME_AUTOSMOOTH) {
no_auto = false;
ostr.str("");
- ostr << "\t<mesh autosmooth=\"" << mesh->smoothresh << "\" has_orco=\"" << has_orco << "\" >\n";
+ ostr << "\t<mesh autosmooth=\"" << mesh->smoothresh << "\" has_orco=\"" << has_orco_st << "\" >\n";
xmlfile << ostr.str();
}
}
@@ -1239,9 +1243,9 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
// or flat shaded, the smooth flag of the first face is used to determine
// the shading for the whole mesh
if (face0->flag & ME_SMOOTH)
- xmlfile << "\t<mesh autosmooth=\"180\" has_orco=\"" << has_orco << "\" >\n";
+ xmlfile << "\t<mesh autosmooth=\"180\" has_orco=\"" << has_orco_st << "\" >\n";
else
- xmlfile << "\t<mesh autosmooth=\"0.1\" has_orco=\"" << has_orco << "\" >\n"; //0 shows artefacts
+ xmlfile << "\t<mesh autosmooth=\"0.1\" has_orco=\"" << has_orco_st << "\" >\n"; //0 shows artefacts
}
// now all vertices
@@ -1271,13 +1275,19 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
MTC_cp3Float(ver->co, tvec);
MTC_Mat4MulVecfl(imat, tvec);
ostr << "\t\t\t<p x=\"" << tvec[0]
- << "\" y=\"" << tvec[1]
- << "\" z=\"" << tvec[2] << "\" />\n";
- if (EXPORT_ORCO) {
+ << "\" y=\"" << tvec[1]
+ << "\" z=\"" << tvec[2] << "\" />\n";
+ // has_orco now an int, if 1 -> strand mapping, if 2 -> normal orco mapping
+ if (has_orco==1) {
+ ostr << "\t\t\t<p x=\"" << ver->accum
+ << "\" y=\"" << ver->accum
+ << "\" z=\"" << ver->accum << "\" />\n";
+ }
+ else if (has_orco==2) {
orco = ver->orco;
ostr << "\t\t\t<p x=\"" << orco[0]
- << "\" y=\"" << orco[1]
- << "\" z=\"" << orco[2] << "\" />\n";
+ << "\" y=\"" << orco[1]
+ << "\" z=\"" << orco[2] << "\" />\n";
}
}
if (vert_idx.find(vlr->v2)==vert_idx.end()) {
@@ -1286,13 +1296,19 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
MTC_cp3Float(ver->co, tvec);
MTC_Mat4MulVecfl(imat, tvec);
ostr << "\t\t\t<p x=\"" << tvec[0]
- << "\" y=\"" << tvec[1]
- << "\" z=\"" << tvec[2] << "\" />\n";
- if (EXPORT_ORCO) {
+ << "\" y=\"" << tvec[1]
+ << "\" z=\"" << tvec[2] << "\" />\n";
+ // has_orco now an int, if 1 -> strand mapping, if 2 -> normal orco mapping
+ if (has_orco==1) {
+ ostr << "\t\t\t<p x=\"" << ver->accum
+ << "\" y=\"" << ver->accum
+ << "\" z=\"" << ver->accum << "\" />\n";
+ }
+ else if (has_orco==2) {
orco = ver->orco;
ostr << "\t\t\t<p x=\"" << orco[0]
- << "\" y=\"" << orco[1]
- << "\" z=\"" << orco[2] << "\" />\n";
+ << "\" y=\"" << orco[1]
+ << "\" z=\"" << orco[2] << "\" />\n";
}
}
if (vert_idx.find(vlr->v3)==vert_idx.end()) {
@@ -1301,13 +1317,19 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
MTC_cp3Float(ver->co, tvec);
MTC_Mat4MulVecfl(imat, tvec);
ostr << "\t\t\t<p x=\"" << tvec[0]
- << "\" y=\"" << tvec[1]
- << "\" z=\"" << tvec[2] << "\" />\n";
- if (EXPORT_ORCO) {
+ << "\" y=\"" << tvec[1]
+ << "\" z=\"" << tvec[2] << "\" />\n";
+ // has_orco now an int, if 1 -> strand mapping, if 2 -> normal orco mapping
+ if (has_orco==1) {
+ ostr << "\t\t\t<p x=\"" << ver->accum
+ << "\" y=\"" << ver->accum
+ << "\" z=\"" << ver->accum << "\" />\n";
+ }
+ else if (has_orco==2) {
orco = ver->orco;
ostr << "\t\t\t<p x=\"" << orco[0]
- << "\" y=\"" << orco[1]
- << "\" z=\"" << orco[2] << "\" />\n";
+ << "\" y=\"" << orco[1]
+ << "\" z=\"" << orco[2] << "\" />\n";
}
}
if ((vlr->v4) && (vert_idx.find(vlr->v4)==vert_idx.end())) {
@@ -1316,13 +1338,19 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
MTC_cp3Float(ver->co, tvec);
MTC_Mat4MulVecfl(imat, tvec);
ostr << "\t\t\t<p x=\"" << tvec[0]
- << "\" y=\"" << tvec[1]
- << "\" z=\"" << tvec[2] << "\" />\n";
- if (EXPORT_ORCO) {
+ << "\" y=\"" << tvec[1]
+ << "\" z=\"" << tvec[2] << "\" />\n";
+ // has_orco now an int, if 1 -> strand mapping, if 2 -> normal orco mapping
+ if (has_orco==1) {
+ ostr << "\t\t\t<p x=\"" << ver->accum
+ << "\" y=\"" << ver->accum
+ << "\" z=\"" << ver->accum << "\" />\n";
+ }
+ else if (has_orco==2) {
orco = ver->orco;
ostr << "\t\t\t<p x=\"" << orco[0]
- << "\" y=\"" << orco[1]
- << "\" z=\"" << orco[2] << "\" />\n";
+ << "\" y=\"" << orco[1]
+ << "\" z=\"" << orco[2] << "\" />\n";
}
}
xmlfile << ostr.str();
@@ -1352,7 +1380,7 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
int idx2 = vert_idx.find(vlr->v2)->second;
int idx3 = vert_idx.find(vlr->v3)->second;
// make sure the indices point to the vertices when orco coords exported
- if (EXPORT_ORCO) { idx1*=2; idx2*=2; idx3*=2; }
+ if (has_orco) { idx1*=2; idx2*=2; idx3*=2; }
ostr.str("");
ostr << "\t\t\t<f a=\"" << idx1 << "\" b=\"" << idx2 << "\" c=\"" << idx3 << "\"";
@@ -1368,8 +1396,8 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
TFace* uvc = vlr->tface; // possible uvcoords (v upside down)
if (uvc) {
ostr << " u_a=\"" << uvc->uv[ui1][0] << "\" v_a=\"" << 1-uvc->uv[ui1][1] << "\""
- << " u_b=\"" << uvc->uv[ui2][0] << "\" v_b=\"" << 1-uvc->uv[ui2][1] << "\""
- << " u_c=\"" << uvc->uv[ui3][0] << "\" v_c=\"" << 1-uvc->uv[ui3][1] << "\"";
+ << " u_b=\"" << uvc->uv[ui2][0] << "\" v_b=\"" << 1-uvc->uv[ui2][1] << "\""
+ << " u_c=\"" << uvc->uv[ui3][0] << "\" v_c=\"" << 1-uvc->uv[ui3][1] << "\"";
}
// since Blender seems to need vcols when uvs are used, for yafray only export when the material actually uses vcols
@@ -1377,13 +1405,13 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
// vertex colors
unsigned char* pt = reinterpret_cast<unsigned char*>(&vlr->vcol[ui1]);
ostr << " vcol_a_r=\"" << (float)pt[3]/255.f << "\" vcol_a_g=\"" << (float)pt[2]/255.f
- << "\" vcol_a_b=\"" << (float)pt[1]/255.f << "\"";
+ << "\" vcol_a_b=\"" << (float)pt[1]/255.f << "\"";
pt = reinterpret_cast<unsigned char*>(&vlr->vcol[ui2]);
ostr << " vcol_b_r=\"" << (float)pt[3]/255.f << "\" vcol_b_g=\"" << (float)pt[2]/255.f
- << "\" vcol_b_b=\"" << (float)pt[1]/255.f << "\"";
+ << "\" vcol_b_b=\"" << (float)pt[1]/255.f << "\"";
pt = reinterpret_cast<unsigned char*>(&vlr->vcol[ui3]);
ostr << " vcol_c_r=\"" << (float)pt[3]/255.f << "\" vcol_c_g=\"" << (float)pt[2]/255.f
- << "\" vcol_c_b=\"" << (float)pt[1]/255.f << "\"";
+ << "\" vcol_c_b=\"" << (float)pt[1]/255.f << "\"";
}
ostr << " shader_name=\"" << fmatname << "\" />\n";
@@ -1394,7 +1422,7 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
idx3 = vert_idx.find(vlr->v1)->second;
// make sure the indices point to the vertices when orco coords exported
- if (EXPORT_ORCO) { idx1*=2; idx2*=2; idx3*=2; }
+ if (has_orco) { idx1*=2; idx2*=2; idx3*=2; }
ostr << "\t\t\t<f a=\"" << idx1 << "\" b=\"" << idx2 << "\" c=\"" << idx3 << "\"";
@@ -1405,20 +1433,20 @@ void yafrayFileRender_t::writeObject(Object* obj, const vector<VlakRen*> &VLR_li
if (uvc) {
ostr << " u_a=\"" << uvc->uv[ui1][0] << "\" v_a=\"" << 1-uvc->uv[ui1][1] << "\""
- << " u_b=\"" << uvc->uv[ui2][0] << "\" v_b=\"" << 1-uvc->uv[ui2][1] << "\""
- << " u_c=\"" << uvc->uv[ui3][0] << "\" v_c=\"" << 1-uvc->uv[ui3][1] << "\"";
+ << " u_b=\"" << uvc->uv[ui2][0] << "\" v_b=\"" << 1-uvc->uv[ui2][1] << "\""
+ << " u_c=\"" << uvc->uv[ui3][0] << "\" v_c=\"" << 1-uvc->uv[ui3][1] << "\"";
}
if ((EXPORT_VCOL) && (vlr->vcol)) {
// vertex colors
unsigned char* pt = reinterpret_cast<unsigned char*>(&vlr->vcol[ui1]);
ostr << " vcol_a_r=\"" << (float)pt[3]/255.f << "\" vcol_a_g=\"" << (float)pt[2]/255.f
- << "\" vcol_a_b=\"" << (float)pt[1]/255.f << "\"";
+ << "\" vcol_a_b=\"" << (float)pt[1]/255.f << "\"";
pt = reinterpret_cast<unsigned char*>(&vlr->vcol[ui2]);
ostr << " vcol_b_r=\"" << (float)pt[3]/255.f << "\" vcol_b_g=\"" << (float)pt[2]/255.f
- << "\" vcol_b_b=\"" << (float)pt[1]/255.f << "\"";
+ << "\" vcol_b_b=\"" << (float)pt[1]/255.f << "\"";
pt = reinterpret_cast<unsigned char*>(&vlr->vcol[ui3]);
ostr << " vcol_c_r=\"" << (float)pt[3]/255.f << "\" vcol_c_g=\"" << (float)pt[2]/255.f
- << "\" vcol_c_b=\"" << (float)pt[1]/255.f << "\"";
+ << "\" vcol_c_b=\"" << (float)pt[1]/255.f << "\"";
}
ostr << " shader_name=\"" << fmatname << "\" />\n";