summaryrefslogtreecommitdiff
path: root/cad/plugins/QuteMol/qutemol/src/AO.cpp
blob: 5effe7d426488e8f9306379c6fb3a04b4c630cb4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120

typedef unsigned char Byte;

#include <math.h>

#include <vector>
#include <vcg/space/point3.h>

using namespace vcg;
using namespace std;

#include "CubeMapSamp.h"
#include "OctaMapSamp.h"

#include "Mol.h"
#include "AO.h"

const float infty=1000;

vector<bool> tmpbool(32*32,false);

void AO::PrintBuffer(){
  int target=32;
  int k=0;
  for (int y=0; y<target; y++){
    for (int x=0; x<target; x++) {
      double b=buf[k];
      if (b==infty) 
      printf("%2s","*");
      else 
      printf("%2s","-");
      if (tmpbool[k]) printf("'"); else printf(" ");

      k++;
//      printf("%7.3f ",buf[k++]);
    }
    printf("\n");
  }
}

void AO::RenderSphere(float cx, float cy, float cz, float rad){
  printf("Rendering %f %f %f %f...\n",cx,cy,cz,rad);
    /*cx*=bufscale;
    cy*=bufscale;
    rad*=bufscale;*/
    int cxi=int(cx);
    int cyi=int(cy);
    
    for (int y=-(int)rad; y<=(int)rad; y++) 
    for (int x=-(int)rad; x<=(int)rad; x++) 
    {
      float tmp=(-x*x-y*y+rad*rad);
      if (tmp>0) {
          tmp=sqrt(tmp)+cz;
          int i=index(x+cxi,y+cyi);
          if (buf[i]>tmp) buf[i]=tmp;
          //buf[i]=0;
      }
    }
}


void AO::CheckAtom(QAtom &a){

   int n=a.s.nsamp();
   for (int i=0; i<n; i++) {
      Point3f f=a.s.dirrot[i]*a.trr;
      
      if (f[2]>0) {
        
        
        int bx=(int) (a.trp[0]+f[0]);
        int by=(int) (a.trp[1]+f[1]);
        tmpbool[index(bx,by)]=true;;
        if (buf[index(bx,by)] == infty ) {
          a.s.sum[i]+=f[2];
        };
        a.s.div[i]+=f[2];
      }
   }
}


AO::AO( Point3f _dir, Mol &m) {
  
  dir=_dir.Normalize();
  
  // orthonormal basis
  Point3f ax,ay,az=dir;
  ax=az^Point3f(1,0,0);
  if (ax.SquaredNorm()<0.1) ax=az^Point3f(0,1,0);
  ax=ax.Normalize();
  ay=(az^ax).Normalize();
  
  // project...
  m.Transform(ax,ay,az);
  
  
  int target=32; // 
  bufx=bufy=target;
  float bufscalex=target/(m.tx1-m.tx0);
  float bufscaley=target/(m.ty1-m.ty0);
  bufscale=(bufscalex<bufscaley)?bufscalex:bufscaley;
                
  m.ScaleTransl(bufscale);
  CubeMapSamp::Transform(ax,ay,az);
  
  printf("Scale=%f\n",bufscale);

  buf.resize(target*target,infty);
  
  for (int i=0; i<m.atom.size()-1; i++) {
    QAtom &a=m.atom[i];
    CheckAtom(a);
    RenderSphere( a.trp[0], a.trp[1], a.trp[2], a.trr );
    PrintBuffer();
  }
  
  
}