Skip to content
Snippets Groups Projects
render.py 233 KiB
Newer Older
  • Learn to ignore specific revisions
  •             file.write('#end\n')
    
    
                file.write('#macro BuildWriteMesh2(VecArr, NormArr, UVArr, U, V, FileName)\n')
                #suppressed some file checking from original macro because no more separate files
                file.write(' #local Write=0;\n')
                file.write(' #debug concat("\\n\\n Building mesh2: \\n   - vertex_vectors\\n")\n')
                file.write('  #local NumVertices=dimension_size(VecArr,1);\n')
                file.write('  #switch (Write)\n')
                file.write('     #case(1)\n')
                file.write('        #write(\n')
                file.write('           MeshFile,\n')
                file.write('           "  vertex_vectors {\\n",\n')
                file.write('           "    ", str(NumVertices,0,0),"\\n    "\n')
                file.write('        )\n')
                file.write('     #break\n')
                file.write('     #case(2)\n')
                file.write('        #write(\n')
                file.write('           MeshFile,\n')
                file.write('           "# Vertices: ",str(NumVertices,0,0),"\\n"\n')
                file.write('        )\n')
                file.write('     #break\n')
                file.write('     #case(3)\n')
                file.write('        #write(\n')
                file.write('           MeshFile,\n')
                file.write('           str(2*NumVertices,0,0),",\\n"\n')
                file.write('        )\n')
                file.write('     #break\n')
                file.write('     #case(4)\n')
                file.write('        #write(\n')
                file.write('           MeshFile,\n')
                file.write('           "#declare VertexVectors= array[",str(NumVertices,0,0),"] {\\n  "\n')
                file.write('        )\n')
                file.write('     #break\n')
                file.write('  #end\n')
                file.write('  mesh2 {\n')
                file.write('     vertex_vectors {\n')
                file.write('        NumVertices\n')
                file.write('        #local I=0;\n')
                file.write('        #while (I<NumVertices)\n')
                file.write('           VecArr[I]\n')
                file.write('           #switch(Write)\n')
                file.write('              #case(1)\n')
                file.write('                 #write(MeshFile, VecArr[I])\n')
                file.write('              #break\n')
                file.write('              #case(2)\n')
                file.write('                 #write(\n')
                file.write('                    MeshFile,\n')
                file.write('                    "v ", VecArr[I].x," ", VecArr[I].y," ", VecArr[I].z,"\\n"\n')
                file.write('                 )\n')
                file.write('              #break\n')
                file.write('              #case(3)\n')
                file.write('                 #write(\n')
                file.write('                    MeshFile,\n')
                file.write('                    VecArr[I].x,",", VecArr[I].y,",", VecArr[I].z,",\\n"\n')
                file.write('                 )\n')
                file.write('              #break\n')
                file.write('              #case(4)\n')
                file.write('                 #write(MeshFile, VecArr[I])\n')
                file.write('              #break\n')
                file.write('           #end\n')
                file.write('           #local I=I+1;\n')
                file.write('           #if(Write=1 | Write=4)\n')
                file.write('              #if(mod(I,3)=0)\n')
                file.write('                 #write(MeshFile,"\\n    ")\n')
                file.write('              #end\n')
                file.write('           #end \n')
                file.write('        #end\n')
                file.write('        #switch(Write)\n')
                file.write('           #case(1)\n')
                file.write('              #write(MeshFile,"\\n  }\\n")\n')
                file.write('           #break\n')
                file.write('           #case(2)\n')
                file.write('              #write(MeshFile,"\\n")\n')
                file.write('           #break\n')
                file.write('           #case(3)\n')
                file.write('              // do nothing\n')
                file.write('           #break\n')
                file.write('           #case(4) \n')
                file.write('              #write(MeshFile,"\\n}\\n")\n')
                file.write('           #break\n')
                file.write('        #end\n')
                file.write('     }\n')
    
                file.write('     #debug concat("   - normal_vectors\\n")    \n')
                file.write('     #local NumVertices=dimension_size(NormArr,1);\n')
                file.write('     #switch(Write)\n')
                file.write('        #case(1)\n')
                file.write('           #write(\n')
                file.write('              MeshFile,\n')
                file.write('              "  normal_vectors {\\n",\n')
                file.write('              "    ", str(NumVertices,0,0),"\\n    "\n')
                file.write('           )\n')
                file.write('        #break\n')
                file.write('        #case(2)\n')
                file.write('           #write(\n')
                file.write('              MeshFile,\n')
                file.write('              "# Normals: ",str(NumVertices,0,0),"\\n"\n')
                file.write('           )\n')
                file.write('        #break\n')
                file.write('        #case(3)\n')
                file.write('           // do nothing\n')
                file.write('        #break\n')
                file.write('        #case(4)\n')
                file.write('           #write(\n')
                file.write('              MeshFile,\n')
                file.write('              "#declare NormalVectors= array[",str(NumVertices,0,0),"] {\\n  "\n')
                file.write('           )\n')
                file.write('        #break\n')
                file.write('     #end\n')
                file.write('     normal_vectors {\n')
                file.write('        NumVertices\n')
                file.write('        #local I=0;\n')
                file.write('        #while (I<NumVertices)\n')
                file.write('           NormArr[I]\n')
                file.write('           #switch(Write)\n')
                file.write('              #case(1)\n')
                file.write('                 #write(MeshFile NormArr[I])\n')
                file.write('              #break\n')
                file.write('              #case(2)\n')
                file.write('                 #write(\n')
                file.write('                    MeshFile,\n')
                file.write('                    "vn ", NormArr[I].x," ", NormArr[I].y," ", NormArr[I].z,"\\n"\n')
                file.write('                 )\n')
                file.write('              #break\n')
                file.write('              #case(3)\n')
                file.write('                 #write(\n')
                file.write('                    MeshFile,\n')
                file.write('                    NormArr[I].x,",", NormArr[I].y,",", NormArr[I].z,",\\n"\n')
                file.write('                 )\n')
                file.write('              #break\n')
                file.write('              #case(4)\n')
                file.write('                 #write(MeshFile NormArr[I])\n')
                file.write('              #break\n')
                file.write('           #end\n')
                file.write('           #local I=I+1;\n')
                file.write('           #if(Write=1 | Write=4) \n')
                file.write('              #if(mod(I,3)=0)\n')
                file.write('                 #write(MeshFile,"\\n    ")\n')
                file.write('              #end\n')
                file.write('           #end\n')
                file.write('        #end\n')
                file.write('        #switch(Write)\n')
                file.write('           #case(1)\n')
                file.write('              #write(MeshFile,"\\n  }\\n")\n')
                file.write('           #break\n')
                file.write('           #case(2)\n')
                file.write('              #write(MeshFile,"\\n")\n')
                file.write('           #break\n')
                file.write('           #case(3)\n')
                file.write('              //do nothing\n')
                file.write('           #break\n')
                file.write('           #case(4)\n')
                file.write('              #write(MeshFile,"\\n}\\n")\n')
                file.write('           #break\n')
                file.write('        #end\n')
                file.write('     }\n')
    
                file.write('     #debug concat("   - uv_vectors\\n")   \n')
                file.write('     #local NumVertices=dimension_size(UVArr,1);\n')
                file.write('     #switch(Write)\n')
                file.write('        #case(1)\n')
                file.write('           #write(\n')
                file.write('              MeshFile, \n')
                file.write('              "  uv_vectors {\\n",\n')
                file.write('              "    ", str(NumVertices,0,0),"\\n    "\n')
                file.write('           )\n')
                file.write('         #break\n')
                file.write('         #case(2)\n')
                file.write('           #write(\n')
                file.write('              MeshFile,\n')
                file.write('              "# UV-vectors: ",str(NumVertices,0,0),"\\n"\n')
                file.write('           )\n')
                file.write('         #break\n')
                file.write('         #case(3)\n')
                file.write('           // do nothing, *.pcm does not support uv-vectors\n')
                file.write('         #break\n')
                file.write('         #case(4)\n')
                file.write('            #write(\n')
                file.write('               MeshFile,\n')
                file.write('               "#declare UVVectors= array[",str(NumVertices,0,0),"] {\\n  "\n')
                file.write('            )\n')
                file.write('         #break\n')
                file.write('     #end\n')
                file.write('     uv_vectors {\n')
                file.write('        NumVertices\n')
                file.write('        #local I=0;\n')
                file.write('        #while (I<NumVertices)\n')
                file.write('           UVArr[I]\n')
                file.write('           #switch(Write)\n')
                file.write('              #case(1)\n')
                file.write('                 #write(MeshFile UVArr[I])\n')
                file.write('              #break\n')
                file.write('              #case(2)\n')
                file.write('                 #write(\n')
                file.write('                    MeshFile,\n')
                file.write('                    "vt ", UVArr[I].u," ", UVArr[I].v,"\\n"\n')
                file.write('                 )\n')
                file.write('              #break\n')
                file.write('              #case(3)\n')
                file.write('                 //do nothing\n')
                file.write('              #break\n')
                file.write('              #case(4)\n')
                file.write('                 #write(MeshFile UVArr[I])\n')
                file.write('              #break\n')
                file.write('           #end\n')
                file.write('           #local I=I+1; \n')
                file.write('           #if(Write=1 | Write=4)\n')
                file.write('              #if(mod(I,3)=0)\n')
                file.write('                 #write(MeshFile,"\\n    ")\n')
                file.write('              #end \n')
                file.write('           #end\n')
                file.write('        #end \n')
                file.write('        #switch(Write)\n')
                file.write('           #case(1)\n')
                file.write('              #write(MeshFile,"\\n  }\\n")\n')
                file.write('           #break\n')
                file.write('           #case(2)\n')
                file.write('              #write(MeshFile,"\\n")\n')
                file.write('           #break\n')
                file.write('           #case(3)\n')
                file.write('              //do nothing\n')
                file.write('           #break\n')
                file.write('           #case(4)\n')
                file.write('              #write(MeshFile,"\\n}\\n")\n')
                file.write('           #break\n')
                file.write('        #end\n')
                file.write('     }\n')
                file.write('\n')
                file.write('     #debug concat("   - face_indices\\n")   \n')
                file.write('     #declare NumFaces=U*V*2;\n')
                file.write('     #switch(Write)\n')
                file.write('        #case(1)\n')
                file.write('           #write(\n')
                file.write('              MeshFile,\n')
                file.write('              "  face_indices {\\n"\n')
                file.write('              "    ", str(NumFaces,0,0),"\\n    "\n')
                file.write('           )\n')
                file.write('        #break\n')
                file.write('        #case(2)\n')
                file.write('           #write (\n')
                file.write('              MeshFile,\n')
                file.write('              "# faces: ",str(NumFaces,0,0),"\\n"\n')
                file.write('           )\n')
                file.write('        #break\n')
                file.write('        #case(3)\n')
                file.write('           #write (\n')
                file.write('              MeshFile,\n')
                file.write('              "0,",str(NumFaces,0,0),",\\n"\n')
                file.write('           )\n')
                file.write('        #break\n')
                file.write('        #case(4)\n')
                file.write('           #write(\n')
                file.write('              MeshFile,\n')
                file.write('              "#declare FaceIndices= array[",str(NumFaces,0,0),"] {\\n  "\n')
                file.write('           )\n')
                file.write('        #break\n')
                file.write('     #end\n')
                file.write('     face_indices {\n')
                file.write('        NumFaces\n')
                file.write('        #local I=0;\n')
                file.write('        #local H=0;\n')
                file.write('        #local NumVertices=dimension_size(VecArr,1);\n')
                file.write('        #while (I<V)\n')
                file.write('           #local J=0;\n')
                file.write('           #while (J<U)\n')
                file.write('              #local Ind=(I*U)+I+J;\n')
                file.write('              <Ind, Ind+1, Ind+U+2>, <Ind, Ind+U+1, Ind+U+2>\n')
                file.write('              #switch(Write)\n')
                file.write('                 #case(1)\n')
                file.write('                    #write(\n')
                file.write('                       MeshFile,\n')
                file.write('                       <Ind, Ind+1, Ind+U+2>, <Ind, Ind+U+1, Ind+U+2>\n')
                file.write('                    )\n')
                file.write('                 #break\n')
                file.write('                 #case(2)\n')
                file.write('                    #write(\n')
                file.write('                       MeshFile,\n')
                file.write('                       "f ",Ind+1,"/",Ind+1,"/",Ind+1," ",Ind+1+1,"/",Ind+1+1,"/",Ind+1+1," ",Ind+U+2+1,"/",Ind+U+2+1,"/",Ind+U+2+1,"\\n",\n')
                file.write('                       "f ",Ind+U+1+1,"/",Ind+U+1+1,"/",Ind+U+1+1," ",Ind+1,"/",Ind+1,"/",Ind+1," ",Ind+U+2+1,"/",Ind+U+2+1,"/",Ind+U+2+1,"\\n"\n')
                file.write('                    )\n')
                file.write('                 #break\n')
                file.write('                 #case(3)\n')
                file.write('                    #write(\n')
                file.write('                       MeshFile,\n')
                file.write('                       Ind,",",Ind+NumVertices,",",Ind+1,",",Ind+1+NumVertices,",",Ind+U+2,",",Ind+U+2+NumVertices,",\\n"\n')
                file.write('                       Ind+U+1,",",Ind+U+1+NumVertices,",",Ind,",",Ind+NumVertices,",",Ind+U+2,",",Ind+U+2+NumVertices,",\\n"\n')
                file.write('                    )\n')
                file.write('                 #break\n')
                file.write('                 #case(4)\n')
                file.write('                    #write(\n')
                file.write('                       MeshFile,\n')
                file.write('                       <Ind, Ind+1, Ind+U+2>, <Ind, Ind+U+1, Ind+U+2>\n')
                file.write('                    )\n')
                file.write('                 #break\n')
                file.write('              #end\n')
                file.write('              #local J=J+1;\n')
                file.write('              #local H=H+1;\n')
                file.write('              #if(Write=1 | Write=4)\n')
                file.write('                 #if(mod(H,3)=0)\n')
                file.write('                    #write(MeshFile,"\\n    ")\n')
                file.write('                 #end \n')
                file.write('              #end\n')
                file.write('           #end\n')
                file.write('           #local I=I+1;\n')
                file.write('        #end\n')
                file.write('     }\n')
                file.write('     #switch(Write)\n')
                file.write('        #case(1)\n')
                file.write('           #write(MeshFile, "\\n  }\\n}")\n')
                file.write('           #fclose MeshFile\n')
                file.write('           #debug concat(" Done writing\\n")\n')
                file.write('        #break\n')
                file.write('        #case(2)\n')
                file.write('           #fclose MeshFile\n')
                file.write('           #debug concat(" Done writing\\n")\n')
                file.write('        #break\n')
                file.write('        #case(3)\n')
                file.write('           #fclose MeshFile\n')
                file.write('           #debug concat(" Done writing\\n")\n')
                file.write('        #break\n')
                file.write('        #case(4)\n')
                file.write('           #write(MeshFile, "\\n}\\n}")\n')
                file.write('           #fclose MeshFile\n')
                file.write('           #debug concat(" Done writing\\n")\n')
                file.write('        #break\n')
                file.write('     #end\n')
                file.write('  }\n')
                file.write('#end\n')
    
                file.write('#macro MSM(SplineArray, SplRes, Interp_type,  InterpRes, FileName)\n')
                file.write('    #declare Build=CheckFileName(FileName);\n')
                file.write('    #if(Build=0)\n')
                file.write('        #debug concat("\\n Parsing mesh2 from file: ", FileName, "\\n")\n')
                file.write('        #include FileName\n')
                file.write('        object{Surface}\n')
                file.write('    #else\n')
                file.write('        #local NumVertices=(SplRes+1)*(InterpRes+1);\n')
                file.write('        #local NumFaces=SplRes*InterpRes*2;\n')
                file.write('        #debug concat("\\n Calculating ",str(NumVertices,0,0)," vertices for ", str(NumFaces,0,0)," triangles\\n\\n")\n')
                file.write('        #local VecArr=array[NumVertices]\n')
                file.write('        #local NormArr=array[NumVertices]\n')
                file.write('        #local UVArr=array[NumVertices]\n')
                file.write('        #local N=dimension_size(SplineArray,1);\n')
                file.write('        #local TempSplArr0=array[N];\n')
                file.write('        #local TempSplArr1=array[N];\n')
                file.write('        #local TempSplArr2=array[N];\n')
                file.write('        #local PosStep=1/SplRes;\n')
                file.write('        #local InterpStep=1/InterpRes;\n')
                file.write('        #local Count=0;\n')
                file.write('        #local Pos=0;\n')
                file.write('        #while(Pos<=1)\n')
                file.write('            #local I=0;\n')
                file.write('            #if (Pos=0)\n')
                file.write('                #while (I<N)\n')
                file.write('                    #local Spl=spline{SplineArray[I]}\n')
                file.write('                    #local TempSplArr0[I]=<0,0,0>+Spl(Pos);\n')
                file.write('                    #local TempSplArr1[I]=<0,0,0>+Spl(Pos+PosStep);\n')
                file.write('                    #local TempSplArr2[I]=<0,0,0>+Spl(Pos-PosStep);\n')
                file.write('                    #local I=I+1;\n')
                file.write('                #end\n')
                file.write('                #local S0=BuildSpline(TempSplArr0, Interp_type)\n')
                file.write('                #local S1=BuildSpline(TempSplArr1, Interp_type)\n')
                file.write('                #local S2=BuildSpline(TempSplArr2, Interp_type)\n')
                file.write('            #else\n')
                file.write('                #while (I<N)\n')
                file.write('                    #local Spl=spline{SplineArray[I]}\n')
                file.write('                    #local TempSplArr1[I]=<0,0,0>+Spl(Pos+PosStep);\n')
                file.write('                    #local I=I+1;\n')
                file.write('                #end\n')
                file.write('                #local S1=BuildSpline(TempSplArr1, Interp_type)\n')
                file.write('            #end\n')
                file.write('            #local J=0;\n')
                file.write('            #while (J<=1)\n')
                file.write('                #local P0=<0,0,0>+S0(J);\n')
                file.write('                #local P1=<0,0,0>+S1(J);\n')
                file.write('                #local P2=<0,0,0>+S2(J);\n')
                file.write('                #local P3=<0,0,0>+S0(J+InterpStep);\n')
                file.write('                #local P4=<0,0,0>+S0(J-InterpStep);\n')
                file.write('                #local B1=P4-P0;\n')
                file.write('                #local B2=P2-P0;\n')
                file.write('                #local B3=P3-P0;\n')
                file.write('                #local B4=P1-P0;\n')
                file.write('                #local N1=vcross(B1,B2);\n')
                file.write('                #local N2=vcross(B2,B3);\n')
                file.write('                #local N3=vcross(B3,B4);\n')
                file.write('                #local N4=vcross(B4,B1);\n')
                file.write('                #local Norm=vnormalize((N1+N2+N3+N4));\n')
                file.write('                #local VecArr[Count]=P0;\n')
                file.write('                #local NormArr[Count]=Norm;\n')
                file.write('                #local UVArr[Count]=<J,Pos>;\n')
                file.write('                #local J=J+InterpStep;\n')
                file.write('                #local Count=Count+1;\n')
                file.write('            #end\n')
                file.write('            #local S2=spline{S0}\n')
                file.write('            #local S0=spline{S1}\n')
                file.write('            #debug concat("\\r Done ", str(Count,0,0)," vertices : ", str(100*Count/NumVertices,0,2)," %")\n')
                file.write('            #local Pos=Pos+PosStep;\n')
                file.write('        #end\n')
                file.write('        BuildWriteMesh2(VecArr, NormArr, UVArr, InterpRes, SplRes, "")\n')
                file.write('    #end\n')
                file.write('#end\n\n')
    
                file.write('#macro Coons(Spl1, Spl2, Spl3, Spl4, Iter_U, Iter_V, FileName)\n')
                file.write('   #declare Build=CheckFileName(FileName);\n')
                file.write('   #if(Build=0)\n')
                file.write('      #debug concat("\\n Parsing mesh2 from file: ", FileName, "\\n")\n')
                file.write('      #include FileName\n')
                file.write('      object{Surface}\n')
                file.write('   #else\n')
                file.write('      #local NumVertices=(Iter_U+1)*(Iter_V+1);\n')
                file.write('      #local NumFaces=Iter_U*Iter_V*2;\n')
                file.write('      #debug concat("\\n Calculating ", str(NumVertices,0,0), " vertices for ",str(NumFaces,0,0), " triangles\\n\\n")\n')
                file.write('      #declare VecArr=array[NumVertices]   \n')
                file.write('      #declare NormArr=array[NumVertices]   \n')
                file.write('      #local UVArr=array[NumVertices]      \n')
                file.write('      #local Spl1_0=Spl1(0);\n')
                file.write('      #local Spl2_0=Spl2(0);\n')
                file.write('      #local Spl3_0=Spl3(0);\n')
                file.write('      #local Spl4_0=Spl4(0);\n')
                file.write('      #local UStep=1/Iter_U;\n')
                file.write('      #local VStep=1/Iter_V;\n')
                file.write('      #local Count=0;\n')
                file.write('      #local I=0;\n')
                file.write('      #while (I<=1)\n')
                file.write('         #local Im=1-I;\n')
                file.write('         #local J=0;\n')
                file.write('         #while (J<=1)\n')
                file.write('            #local Jm=1-J;\n')
                file.write('            #local C0=Im*Jm*(Spl1_0)+Im*J*(Spl2_0)+I*J*(Spl3_0)+I*Jm*(Spl4_0);\n')
                file.write('            #local P0=LInterpolate(I, Spl1(J), Spl3(Jm)) + \n')
                file.write('               LInterpolate(Jm, Spl2(I), Spl4(Im))-C0;\n')
                file.write('            #declare VecArr[Count]=P0;\n')
                file.write('            #local UVArr[Count]=<J,I>;\n')
                file.write('            #local J=J+UStep;\n')
                file.write('            #local Count=Count+1;\n')
                file.write('         #end\n')
                file.write('         #debug concat(\n')
                file.write('            "\r Done ", str(Count,0,0)," vertices :         ",\n')
                file.write('            str(100*Count/NumVertices,0,2)," %"\n')
                file.write('         )\n')
                file.write('         #local I=I+VStep;\n')
                file.write('      #end\n')
                file.write('      #debug "\r Normals                                  "\n')
                file.write('      #local Count=0;\n')
                file.write('      #local I=0;\n')
                file.write('      #while (I<=Iter_V)\n')
                file.write('         #local J=0;\n')
                file.write('         #while (J<=Iter_U)\n')
                file.write('            #local Ind=(I*Iter_U)+I+J;\n')
                file.write('            #local P0=VecArr[Ind];\n')
                file.write('            #if(J=0)\n')
                file.write('               #local P1=P0+(P0-VecArr[Ind+1]);\n')
                file.write('            #else\n')
                file.write('               #local P1=VecArr[Ind-1];\n')
                file.write('            #end\n')
                file.write('            #if (J=Iter_U)\n')
                file.write('               #local P2=P0+(P0-VecArr[Ind-1]);\n')
                file.write('            #else\n')
                file.write('               #local P2=VecArr[Ind+1];\n')
                file.write('            #end\n')
                file.write('            #if (I=0)\n')
                file.write('               #local P3=P0+(P0-VecArr[Ind+Iter_U+1]);\n')
                file.write('            #else\n')
                file.write('               #local P3=VecArr[Ind-Iter_U-1];\n')
                file.write('            #end\n')
                file.write('            #if (I=Iter_V)\n')
                file.write('               #local P4=P0+(P0-VecArr[Ind-Iter_U-1]);\n')
                file.write('            #else\n')
                file.write('               #local P4=VecArr[Ind+Iter_U+1];\n')
                file.write('            #end\n')
                file.write('            #local B1=P4-P0;\n')
                file.write('            #local B2=P2-P0;\n')
                file.write('            #local B3=P3-P0;\n')
                file.write('            #local B4=P1-P0;\n')
                file.write('            #local N1=vcross(B1,B2);\n')
                file.write('            #local N2=vcross(B2,B3);\n')
                file.write('            #local N3=vcross(B3,B4);\n')
                file.write('            #local N4=vcross(B4,B1);\n')
                file.write('            #local Norm=vnormalize((N1+N2+N3+N4));\n')
                file.write('            #declare NormArr[Count]=Norm;\n')
                file.write('            #local J=J+1;\n')
                file.write('            #local Count=Count+1;\n')
                file.write('         #end\n')
                file.write('         #debug concat("\r Done ", str(Count,0,0)," normals : ",str(100*Count/NumVertices,0,2), " %")\n')
                file.write('         #local I=I+1;\n')
                file.write('      #end\n')
                file.write('      BuildWriteMesh2(VecArr, NormArr, UVArr, Iter_U, Iter_V, FileName)\n')
                file.write('   #end\n')
                file.write('#end\n\n')
    
                tabWrite("\n//dummy sphere to represent empty curve location\n")
    
                tabWrite("#declare %s =\n"%dataname)
    
                tabWrite("sphere {<%.6g, %.6g, %.6g>,0 pigment{rgbt 1} no_image no_reflection no_radiosity photons{pass_through collect off} hollow}\n\n" % (ob.location.x, ob.location.y, ob.location.z)) # ob.name > povdataname)
            # And non empty curves
    
            else:
                if bezier_sweep == False:
                    tabWrite("#declare %s =\n"%dataname)
                if ob.pov.curveshape == 'sphere_sweep' and bezier_sweep == False:
                    tabWrite("union {\n")
                    for spl in ob.data.splines:
                        if spl.type != "BEZIER":
                            spl_type = "linear"
                            if spl.type == "NURBS":
                                spl_type = "cubic"
                            points=spl.points
                            numPoints=len(points)
                            if spl.use_cyclic_u:
                                numPoints+=3
    
                            tabWrite("sphere_sweep { %s_spline %s,\n"%(spl_type,numPoints))
                            if spl.use_cyclic_u:
                                pt1 = points[len(points)-1]
                                wpt1 = pt1.co
                                tabWrite("<%.4g,%.4g,%.4g>,%.4g\n" %(wpt1[0], wpt1[1], wpt1[2], pt1.radius*ob.data.bevel_depth))
                            for pt in points:
                                wpt = pt.co
                                tabWrite("<%.4g,%.4g,%.4g>,%.4g\n" %(wpt[0], wpt[1], wpt[2], pt.radius*ob.data.bevel_depth))
                            if spl.use_cyclic_u:
                                for i in range (0,2):
                                    endPt=points[i]
                                    wpt = endPt.co
                                    tabWrite("<%.4g,%.4g,%.4g>,%.4g\n" %(wpt[0], wpt[1], wpt[2], endPt.radius*ob.data.bevel_depth))
    
                if ob.pov.curveshape == 'sor':
                    for spl in ob.data.splines:
                        if spl.type in {'POLY','NURBS'}:
                            points=spl.points
                            numPoints=len(points)
                            tabWrite("sor { %s,\n"%numPoints)
                            for pt in points:
                                wpt = pt.co
                                tabWrite("<%.4g,%.4g>\n" %(wpt[0], wpt[1]))
                        else:
                            tabWrite("box { 0,0\n")
                if ob.pov.curveshape in {'lathe','prism'}:
                    spl = ob.data.splines[0]
                    if spl.type == "BEZIER":
                        points=spl.bezier_points
                        lenCur=len(points)-1
                        lenPts=lenCur*4
                        ifprism = ''
                        if ob.pov.curveshape in {'prism'}:
                            height = ob.data.extrude
                            ifprism = '-%s, %s,'%(height, height)
                            lenCur+=1
                            lenPts+=4
                        tabWrite("%s { bezier_spline %s %s,\n"%(ob.pov.curveshape,ifprism,lenPts))
                        for i in range(0,lenCur):
                            p1=points[i].co
                            pR=points[i].handle_right
                            end = i+1
                            if i == lenCur-1 and ob.pov.curveshape in {'prism'}:
                                end = 0
                            pL=points[end].handle_left
                            p2=points[end].co
                            line="<%.4g,%.4g>"%(p1[0],p1[1])
                            line+="<%.4g,%.4g>"%(pR[0],pR[1])
                            line+="<%.4g,%.4g>"%(pL[0],pL[1])
                            line+="<%.4g,%.4g>"%(p2[0],p2[1])
                            tabWrite("%s\n" %line)
                    else:
    
                        lenCur=len(points)
                        lenPts=lenCur
                        ifprism = ''
                        if ob.pov.curveshape in {'prism'}:
                            height = ob.data.extrude
                            ifprism = '-%s, %s,'%(height, height)
                            lenPts+=3
                        spl_type = 'quadratic'
                        if spl.type == 'POLY':
                            spl_type = 'linear'
                        tabWrite("%s { %s_spline %s %s,\n"%(ob.pov.curveshape,spl_type,ifprism,lenPts))
                        if ob.pov.curveshape in {'prism'}:
                            pt = points[len(points)-1]
    
                            wpt = pt.co
                            tabWrite("<%.4g,%.4g>\n" %(wpt[0], wpt[1]))
    
                            wpt = pt.co
                            tabWrite("<%.4g,%.4g>\n" %(wpt[0], wpt[1]))
    
                        if ob.pov.curveshape in {'prism'}:
                            for i in range(2):
                                pt = points[i]
                                wpt = pt.co
                                tabWrite("<%.4g,%.4g>\n" %(wpt[0], wpt[1]))
                if bezier_sweep:
    
                    for p in range(len(ob.data.splines)):
    
                        br = []
                        depth = ob.data.bevel_depth
                        spl = ob.data.splines[p]
                        points=spl.bezier_points
                        lenCur = len(points)-1
                        numPoints = lenCur*4
                        if spl.use_cyclic_u:
                            lenCur += 1
                            numPoints += 4
                        tabWrite("#declare %s_points_%s = array[%s]{\n"%(dataname,p,numPoints))
                        for i in range(lenCur):
                            p1=points[i].co
                            pR=points[i].handle_right
                            end = i+1
                            if spl.use_cyclic_u and i == (lenCur - 1):
                                end = 0
                            pL=points[end].handle_left
                            p2=points[end].co
                            r3 = points[end].radius * depth
                            r0 = points[i].radius * depth
                            r1 = 2/3*r0 + 1/3*r3
                            r2 = 1/3*r0 + 2/3*r3
                            br.append((r0,r1,r2,r3))
                            line="<%.4g,%.4g,%.4f>"%(p1[0],p1[1],p1[2])
                            line+="<%.4g,%.4g,%.4f>"%(pR[0],pR[1],pR[2])
                            line+="<%.4g,%.4g,%.4f>"%(pL[0],pL[1],pL[2])
                            line+="<%.4g,%.4g,%.4f>"%(p2[0],p2[1],p2[2])
                            tabWrite("%s\n" %line)
                        tabWrite("}\n")
                        tabWrite("#declare %s_radii_%s = array[%s]{\n"%(dataname,p,len(br)*4))
                        for Tuple in br:
                            tabWrite('%.4f,%.4f,%.4f,%.4f\n'%(Tuple[0],Tuple[1],Tuple[2],Tuple[3]))
                        tabWrite("}\n")
                    if len(ob.data.splines)== 1:
                        tabWrite('#declare %s = object{\n'%dataname)
                        tabWrite('    Shape_Bezierpoints_Sphere_Sweep(yes,%s, %s_points_%s, %s_radii_%s) \n'%(ob.data.resolution_u,dataname,p,dataname,p))
                    else:
                        tabWrite('#declare %s = union{\n'%dataname)
                        for p in range(len(ob.data.splines)):
                            tabWrite('    object{Shape_Bezierpoints_Sphere_Sweep(yes,%s, %s_points_%s, %s_radii_%s)} \n'%(ob.data.resolution_u,dataname,p,dataname,p))
                        #tabWrite('#include "bezier_spheresweep.inc"\n') #now inlined
                       # tabWrite('#declare %s = object{Shape_Bezierpoints_Sphere_Sweep(yes,%s, %s_bezier_points, %.4f) \n'%(dataname,ob.data.resolution_u,dataname,ob.data.bevel_depth))
                if ob.pov.curveshape in {'loft'}:
                    tabWrite('object {MSM(%s,%s,"c",%s,"")\n'%(dataname,ob.pov.res_u,ob.pov.res_v))
                if ob.pov.curveshape in {'birail'}:
                    splines = '%s1,%s2,%s3,%s4'%(dataname,dataname,dataname,dataname)
                    tabWrite('object {Coons(%s, %s, %s, "")\n'%(splines,ob.pov.res_u,ob.pov.res_v))
                povMatName = "Default_texture"
                if ob.active_material:
                    #povMatName = string_strip_hyphen(bpy.path.clean_name(ob.active_material.name))
                    try:
                        material = ob.active_material
                        writeObjectMaterial(material, ob)
                    except IndexError:
                        print(me)
                #tabWrite("texture {%s}\n"%povMatName)
                if ob.pov.curveshape in {'prism'}:
                    tabWrite("rotate <90,0,0>\n")
                    tabWrite("scale y*-1\n" )
                tabWrite("}\n")
    
    
    #################################################################
    
    
    
    Luca Bonavita's avatar
    Luca Bonavita committed
        def exportMeta(metas):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            """write all POV blob primitives and Blender Metas to exported file """
    
    Luca Bonavita's avatar
    Luca Bonavita committed
            # TODO - blenders 'motherball' naming is not supported.
    
            if comments and len(metas) >= 1:
    
                file.write("//--Blob objects--\n\n")
    
            # Get groups of metaballs by blender name prefix.
            meta_group = {}
            meta_elems = {}
    
    Luca Bonavita's avatar
    Luca Bonavita committed
            for ob in metas:
    
                if not prefix in meta_group:
                    meta_group[prefix] = ob  # .data.threshold
    
                elems = [(elem, ob) for elem in ob.data.elements if elem.type in {'BALL', 'ELLIPSOID','CAPSULE','CUBE','PLANE'}]
    
                if prefix in meta_elems:
                    meta_elems[prefix].extend(elems)
    
                    meta_elems[prefix] = elems
    
                # empty metaball
                if len(elems)==0:
                    tabWrite("\n//dummy sphere to represent empty meta location\n")
    
                    tabWrite("sphere {<%.6g, %.6g, %.6g>,0 pigment{rgbt 1} no_image no_reflection no_radiosity photons{pass_through collect off} hollow}\n\n" % (ob.location.x, ob.location.y, ob.location.z)) # ob.name > povdataname)
                # other metaballs
                else:
    
                        if len(meta_elems[mg])!=0:
    
                            tabWrite("blob{threshold %.4g // %s \n" % (ob.data.threshold, mg))
                            for elems in meta_elems[mg]:
                                elem = elems[0]
                                loc = elem.co
                                stiffness = elem.stiffness
                                if elem.use_negative:
                                    stiffness = - stiffness
                                if elem.type == 'BALL':
                                    tabWrite("sphere { <%.6g, %.6g, %.6g>, %.4g, %.4g " %
                                             (loc.x, loc.y, loc.z, elem.radius, stiffness))
    
                                    writeMatrix(global_matrix @ elems[1].matrix_world)
    
                                    tabWrite("}\n")
    
                                elif elem.type == 'ELLIPSOID':
                                    tabWrite("sphere{ <%.6g, %.6g, %.6g>,%.4g,%.4g " %
                                             (loc.x / elem.size_x, loc.y / elem.size_y, loc.z / elem.size_z,
                                              elem.radius, stiffness))
                                    tabWrite("scale <%.6g, %.6g, %.6g>" % (elem.size_x, elem.size_y, elem.size_z))
    
                                    writeMatrix(global_matrix @ elems[1].matrix_world)
    
                                    tabWrite("}\n")
    
                                elif elem.type == 'CAPSULE':
                                    tabWrite("cylinder{ <%.6g, %.6g, %.6g>,<%.6g, %.6g, %.6g>,%.4g,%.4g " %
                                             ((loc.x - elem.size_x), (loc.y), (loc.z),
                                              (loc.x + elem.size_x), (loc.y), (loc.z),
                                              elem.radius, stiffness))
    
                                    #tabWrite("scale <%.6g, %.6g, %.6g>" % (elem.size_x, elem.size_y, elem.size_z))
    
                                    writeMatrix(global_matrix @ elems[1].matrix_world)
    
                                    tabWrite("}\n")
    
                                elif elem.type == 'CUBE':
                                    tabWrite("cylinder { -x*8, +x*8,%.4g,%.4g translate<%.6g,%.6g,%.6g> scale  <1/4,1,1> scale <%.6g, %.6g, %.6g>\n" % (elem.radius*2.0, stiffness/4.0, loc.x, loc.y, loc.z, elem.size_x, elem.size_y, elem.size_z))
    
                                    writeMatrix(global_matrix @ elems[1].matrix_world)
    
                                    tabWrite("}\n")
                                    tabWrite("cylinder { -y*8, +y*8,%.4g,%.4g translate<%.6g,%.6g,%.6g> scale <1,1/4,1> scale <%.6g, %.6g, %.6g>\n" % (elem.radius*2.0, stiffness/4.0, loc.x, loc.y, loc.z, elem.size_x, elem.size_y, elem.size_z))
    
                                    writeMatrix(global_matrix @ elems[1].matrix_world)
    
                                    tabWrite("}\n")
    
                                    tabWrite("cylinder { -z*8, +z*8,%.4g,%.4g translate<%.6g,%.6g,%.6g> scale <1,1,1/4> scale <%.6g, %.6g, %.6g>\n" % (elem.radius*2.0, stiffness/4.0, loc.x, loc.y, loc.z, elem.size_x, elem.size_y, elem.size_z))
    
                                    writeMatrix(global_matrix @ elems[1].matrix_world)
    
                                elif elem.type == 'PLANE':
                                    tabWrite("cylinder { -x*8, +x*8,%.4g,%.4g translate<%.6g,%.6g,%.6g> scale  <1/4,1,1> scale <%.6g, %.6g, %.6g>\n" % (elem.radius*2.0, stiffness/4.0, loc.x, loc.y, loc.z, elem.size_x, elem.size_y, elem.size_z))
    
                                    writeMatrix(global_matrix @ elems[1].matrix_world)
    
                                    tabWrite("}\n")
                                    tabWrite("cylinder { -y*8, +y*8,%.4g,%.4g translate<%.6g,%.6g,%.6g> scale <1,1/4,1> scale <%.6g, %.6g, %.6g>\n" % (elem.radius*2.0, stiffness/4.0, loc.x, loc.y, loc.z, elem.size_x, elem.size_y, elem.size_z))
    
                                    writeMatrix(global_matrix @ elems[1].matrix_world)
    
                                    tabWrite("}\n")
    
                            try:
                                material = elems[1].data.materials[0]  # lame! - blender cant do enything else.
                            except:
                                material = None
                            if material:
                                diffuse_color = material.diffuse_color
    
                                if material.use_transparency and material.transparency_method == 'RAYTRACE':
    
                                    povFilter = material.pov_raytrace_transparency.filter * (1.0 - material.alpha)
    
                                    trans = (1.0 - material.pov.alpha) - povFilter
    
                                else:
                                    povFilter = 0.0
                                material_finish = materialNames[material.name]
                                tabWrite("pigment {srgbft<%.3g, %.3g, %.3g, %.3g, %.3g>} \n" %
                                         (diffuse_color[0], diffuse_color[1], diffuse_color[2],
                                          povFilter, trans))
                                tabWrite("finish{%s} " % safety(material_finish, Level=2))
                            else:
                                tabWrite("pigment{srgb 1} finish{%s} " % (safety(DEF_MAT_NAME, Level=2)))
    
    
                                writeObjectMaterial(material, ob)
                                #writeObjectMaterial(material, elems[1])
                                tabWrite("radiosity{importance %3g}\n" % ob.pov.importance_value)
    
                                tabWrite("}\n\n")  # End of Metaball block
    
    Luca Bonavita's avatar
    Luca Bonavita committed
                meta = ob.data
    
    
                # important because no elements will break parsing.
    
                elements = [elem for elem in meta.elements if elem.type in {'BALL', 'ELLIPSOID'}]
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                    tabWrite("blob {\n")
                    tabWrite("threshold %.4g\n" % meta.threshold)
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                        material = meta.materials[0]  # lame! - blender cant do enything else.
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                    for elem in elements:
                        loc = elem.co
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                        stiffness = elem.stiffness
                        if elem.use_negative:
                            stiffness = - stiffness
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                        if elem.type == 'BALL':
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                            tabWrite("sphere { <%.6g, %.6g, %.6g>, %.4g, %.4g }\n" %
    
                                     (loc.x, loc.y, loc.z, elem.radius, stiffness))
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                            # After this wecould do something simple like...
    
                            # except we'll write the color
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                        elif elem.type == 'ELLIPSOID':
                            # location is modified by scale
    
                            tabWrite("sphere { <%.6g, %.6g, %.6g>, %.4g, %.4g }\n" %
                                     (loc.x / elem.size_x,
                                      loc.y / elem.size_y,
                                      loc.z / elem.size_z,
    
                            tabWrite("scale <%.6g, %.6g, %.6g> \n" %
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                    if material:
                        diffuse_color = material.diffuse_color
    
                        if material.use_transparency and material.transparency_method == 'RAYTRACE':
    
                            povFilter = material.pov_raytrace_transparency.filter * (1.0 - material.alpha)
    
                            trans = (1.0 - material.pov.alpha) - povFilter
    
                            povFilter = 0.0
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                        material_finish = materialNames[material.name]
    
                        tabWrite("pigment {srgbft<%.3g, %.3g, %.3g, %.3g, %.3g>} \n" %
    
                                 (diffuse_color[0], diffuse_color[1], diffuse_color[2],
                                  povFilter, trans))
    
                        tabWrite("finish {%s}\n" % safety(material_finish, Level=2))
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                        # Write the finish last.
                        tabWrite("finish {%s}\n" % (safety(DEF_MAT_NAME, Level=2)))
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                    writeMatrix(global_matrix @ ob.matrix_world)
    
                    # Importance for radiosity sampling added here
    
                    # importance > ob.pov.importance_value
    
                    tabWrite("importance %3g \n" % importance)
                    tabWrite("}\n")
    
    Luca Bonavita's avatar
    Luca Bonavita committed
    
    
                    tabWrite("}\n")  # End of Metaball block
    
                    if comments and len(metas) >= 1:
    
        def exportMeshes(scene, sel, csg):
    
    Maurice Raybaud's avatar
    Maurice Raybaud committed
            """write all meshes as POV mesh2{} syntax to exported file """
    
    #        obmatslist = []
    #        def hasUniqueMaterial():
    #            # Grab materials attached to object instances ...
    #            if hasattr(ob, 'material_slots'):
    #                for ms in ob.material_slots:
    
    #                    if ms.material is not None and ms.link == 'OBJECT':
    
    #                        if ms.material in obmatslist:
    #                            return False
    #                        else:
    #                            obmatslist.append(ms.material)
    #                            return True
    #        def hasObjectMaterial(ob):
    #            # Grab materials attached to object instances ...
    #            if hasattr(ob, 'material_slots'):
    #                for ms in ob.material_slots:
    
    #                    if ms.material is not None and ms.link == 'OBJECT':
    
    #                        # If there is at least one material slot linked to the object
    
    #                        # and not the data (mesh), always create a new, "private" data instance.
    
    #                        return True
    #            return False
            # For objects using local material(s) only!
    
            # This is a mapping between a tuple (dataname, materialnames, ...), and the POV dataname.
    
            # As only objects using:
            #     * The same data.
            #     * EXACTLY the same materials, in EXACTLY the same sockets.
    
            # ... can share a same instance in POV export.
    
            def checkObjectMaterials(ob, name, dataname):
                if hasattr(ob, 'material_slots'):
                    has_local_mats = False
                    key = [dataname]
                    for ms in ob.material_slots:
    
                        if ms.material is not None:
    
                            key.append(ms.material.name)
                            if ms.link == 'OBJECT' and not has_local_mats:
                                has_local_mats = True
                        else:
    
                            # Even if the slot is empty, it is important to grab it...
    
                            key.append("")
                    if has_local_mats:
                        # If this object uses local material(s), lets find if another object
                        # using the same data and exactly the same list of materials
    
                        # (in the same slots) has already been processed...
    
                        # Note that here also, we use object name as new, unique dataname for Pov.
    
                        key = tuple(key)  # Lists are not hashable...
    
                        if key not in obmats2data:
                            obmats2data[key] = name
                        return obmats2data[key]
                return None
    
            data_ref = {}
    
            def store(scene, ob, name, dataname, matrix):
                # The Object needs to be written at least once but if its data is
                # already in data_ref this has already been done.
    
                # This func returns the "povray" name of the data, or None
    
                # if no writing is needed.
                if ob.is_modified(scene, 'RENDER'):
                    # Data modified.
                    # Create unique entry in data_ref by using object name
                    # (always unique in Blender) as data name.
                    data_ref[name] = [(name, MatrixAsPovString(matrix))]
                    return name
                # Here, we replace dataname by the value returned by checkObjectMaterials, only if
                # it is not evaluated to False (i.e. only if the object uses some local material(s)).
                dataname = checkObjectMaterials(ob, name, dataname) or dataname
                if dataname in data_ref:
                    # Data already known, just add the object instance.
                    data_ref[dataname].append((name, MatrixAsPovString(matrix)))
                    # No need to write data
                    return None
                else:
                    # Data not yet processed, create a new entry in data_ref.
                    data_ref[dataname] = [(name, MatrixAsPovString(matrix))]
                    return dataname
    
            def exportSmoke(smoke_obj_name):
                #if LuxManager.CurrentScene.name == 'preview':
                    #return 1, 1, 1, 1.0
                #else:
                flowtype = -1
                smoke_obj = bpy.data.objects[smoke_obj_name]
                domain = None
    
                # Search smoke domain target for smoke modifiers
                for mod in smoke_obj.modifiers:
                    if mod.name == 'Smoke':
                        if mod.smoke_type == 'FLOW':
                            if mod.flow_settings.smoke_flow_type == 'BOTH':
                                flowtype = 2
                            else:
                                if mod.flow_settings.smoke_flow_type == 'SMOKE':
                                    flowtype = 0
                                else:
                                    if mod.flow_settings.smoke_flow_type == 'FIRE':
                                        flowtype = 1
    
                        if mod.smoke_type == 'DOMAIN':
                            domain = smoke_obj
                            smoke_modifier = mod
    
                eps = 0.000001
                if domain is not None:
                    #if bpy.app.version[0] >= 2 and bpy.app.version[1] >= 71:
                    # Blender version 2.71 supports direct access to smoke data structure
                    set = mod.domain_settings
                    channeldata = []
                    for v in set.density_grid:
                        channeldata.append(v.real)
                        print(v.real)
                    ## Usage en voxel texture:
                    # channeldata = []
                    # if channel == 'density':
                        # for v in set.density_grid:
                            # channeldata.append(v.real)
    
                    # if channel == 'fire':
                        # for v in set.flame_grid:
                            # channeldata.append(v.real)
    
                    resolution = set.resolution_max
                    big_res = []
                    big_res.append(set.domain_resolution[0])
                    big_res.append(set.domain_resolution[1])
                    big_res.append(set.domain_resolution[2])
    
                    if set.use_high_resolution:
                        big_res[0] = big_res[0] * (set.amplify + 1)
                        big_res[1] = big_res[1] * (set.amplify + 1)
                        big_res[2] = big_res[2] * (set.amplify + 1)
                    # else:
                        # p = []
                        ##gather smoke domain settings
                        # BBox = domain.bound_box
                        # p.append([BBox[0][0], BBox[0][1], BBox[0][2]])
                        # p.append([BBox[6][0], BBox[6][1], BBox[6][2]])
                        # set = mod.domain_settings
                        # resolution = set.resolution_max
                        # smokecache = set.point_cache
                        # ret = read_cache(smokecache, set.use_high_resolution, set.amplify + 1, flowtype)
                        # res_x = ret[0]
                        # res_y = ret[1]
                        # res_z = ret[2]
                        # density = ret[3]
                        # fire = ret[4]
    
                        # if res_x * res_y * res_z > 0:
                            ##new cache format
                            # big_res = []
                            # big_res.append(res_x)
                            # big_res.append(res_y)
                            # big_res.append(res_z)
                        # else:
                            # max = domain.dimensions[0]
                            # if (max - domain.dimensions[1]) < -eps:
                                # max = domain.dimensions[1]
    
                            # if (max - domain.dimensions[2]) < -eps:
                                # max = domain.dimensions[2]