#!/usr/bin/python

# 
# (C) 2000 Sean Brennan
# Some code based on example NMesh program, source unknown.
#
#
# Redistribute as you wish =-)
#
# Takes a ppm file as input, and uses the colors
# to make a mesh.  The z value is the gray value
# according to some scaling function
#


import Blender
from Blender import NMesh
import math
from math import *
import strop

blockedge = 127
# open file for reading
print "looking for death valley >=-)"
picfile = open("death_vally.ppm", 'r')
print "found it"
fileline = picfile.readline()
if (fileline[0:2] == 'P6'):
 print "Success, this is a ppm file"
 filetype = 6
elif (fileline[0:2] == 'P5'):
 filetype = 5
 print "Success, this is a pgm file"
else:
 print "Bummer, I was expecting a PPM or PGM raw color file"
 exit
done = 'nope'
xres, yres = 0, 0
count = 0
while (done == 'nope'):
 fileline = picfile.readline()
 if (fileline[0:1] == '#'):
  # A comment in the graymap file
  continue
 else:
  numlist = strop.split(fileline)
  if (len(numlist) == 2):
   xres, yres = strop.split(fileline)
   xres = strop.atoi(xres)
   yres = strop.atoi(yres)
   print "Xres: ", xres, "Yres: ", yres
  else:
   depth = fileline 
   done = 'yes'
#end while
# Now read in the binay gray bytes
graymap = picfile.read()
# No idea how big graymap can be.  Hopefully pretty big. ;-)
print "Numbytes = ", len(graymap)
# First we chop things into blockedgexblockedge blocks, so as to be nice to blender.
#
xmajor = xres / blockedge
xminor = xres % blockedge
ymajor = yres / blockedge
yminor = yres % blockedge
print "Blocks in grid is ", xmajor + 1, " by ", ymajor + 1
aord = ord("A")
#
#
# Now we create a mesh object.
# The mesh is xres by yres
#
for ym in range(0, ymajor + 1):
 for xm in range(0, xmajor + 1):
    me=NMesh.GetRaw()
    if (xm == xmajor):
       xrange = xminor
    else:
       xrange = blockedge + 1
    if (ym == ymajor):
       yrange = yminor
    else:
       yrange = blockedge + 1
    print "Block ", xm, ",", ym, 
    for j in range(yrange):
     for i in range(xrange):
      if (filetype == 5):
       index =  (( ym * blockedge) + j) * xres + xm * blockedge + i
       graybyte = ord(graymap[index]) * 256
      else:
       index =  3 * (( ym * blockedge) + j) * xres + (xm * blockedge + i) * 3
       graybyte = ord(graymap[index]) * 256 + ord(graymap[index + 1])
      # Now we have the z value for this vertex
      #print '[%3d]' % graybyte,
      if ((i  % 43 + j % 47) == 0):
        print '.',
      if ((ord(graymap[index + 2])) != 0):
        print "OUCH @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"
      x= float( xm * blockedge + i) / 30.0
      y= float ( - ym * blockedge - j) / 30.0
      z=float(graybyte) / 900.0
      v=NMesh.Vert(x,y,z)
      me.verts.append(v)
    for j in range(0,yrange-1):  
        for i in range(0,xrange-1):  
            f=NMesh.Face()  
            f.v.append(me.verts[j*(xrange) +i])  
            f.v.append(me.verts[j*(xrange) +i+1])  
            f.v.append(me.verts[(j+1)*(xrange) +i+1])  
            f.v.append(me.verts[(j+1)*(xrange) +i]) 
            me.faces.append(f) 
            # Fin de la boucle interne  
        #Fin de la boucle externe  
    outname = "plane-"
    outname = outname + chr( xm + aord)
    outname = outname + chr( ym + aord)
    print outname, "Done"
    NMesh.PutRaw(me,outname,1)  
    Blender.Redraw()
print picfile
# PGM Graymap to mesh heightfield done
