1 //:
2 // \file
3 // \author Vishal Jain
4 // \date 26-Jan-2011
5 
6 #include "testlib/testlib_test.h"
7 #include "testlib/testlib_root_dir.h"
8 #include "vgl/vgl_point_3d.h"
9 #include "vpgl/vpgl_perspective_camera.h"
10 #include "vil/vil_image_view.h"
11 #include "vil/vil_save.h"
12 
13 #include <boct/boct_bit_tree.h>
14 
15 #include <boxm2/boxm2_scene.h>
16 #include <boxm2/boxm2_block.h>
17 #include <boxm2/boxm2_data_base.h>
18 #include <boxm2/boxm2_block_metadata.h>
19 #include <boxm2/io/boxm2_lru_cache.h>
20 #include <boxm2/cpp/algo/boxm2_render_functions.h>
21 
22 
test_camera()23 vpgl_camera_double_sptr test_camera()
24 {
25   vnl_matrix_fixed<double, 3, 3> mk(0.0);
26   mk[0][0]=990.0; mk[0][2]=4.0;
27   mk[1][1]=990.0; mk[1][2]=4.0; mk[2][2]=8.0/7.0;
28   vpgl_calibration_matrix<double> K(mk);
29   vnl_matrix_fixed<double, 3, 3> mr(0.0);
30   mr[0][0]=1.0; mr[1][1]=-1.0; mr[2][2]=-1.0;
31   vgl_rotation_3d<double> R(mr);
32   vgl_point_3d<double> t(0.5,0.5,100);
33 
34   std::cout<<mk<<mr<<t;
35   vpgl_camera_double_sptr cam = new vpgl_perspective_camera<double>(K,t,R);
36   return cam;
37 }
38 
39 
test_cone_ray_trace()40 void test_cone_ray_trace()
41 {
42   //manufacture scene information
43   boxm2_scene_sptr scene = new boxm2_scene();
44   scene->set_local_origin( vgl_point_3d<double>(0,0,0) );
45 
46   //set scene block information
47   std::map<boxm2_block_id, boxm2_block_metadata> blocks;
48   boxm2_block_id id(0,0,0);
49   boxm2_block_metadata data(id,
50                            vgl_point_3d<double>(0,0,0),
51                            vgl_vector_3d<double>(1.0/8.0, 1.0/8.0, 1.0/8.0),
52                            vgl_vector_3d<unsigned>(8,8,1),
53                            1, 1, 100,0.0); //Pinit starts out at 0 (will create 0 alphas?
54   blocks[id] = data;
55   scene->set_blocks(blocks);
56 
57   //: list of appearance models/observation models used by this scene
58   std::vector<std::string> appearances;
59   appearances.push_back(boxm2_data_traits<BOXM2_MOG3_GREY>::prefix());
60   scene->set_appearances(appearances);
61 
62   //grab boxm2_scene_info
63   boxm2_scene_info* info = scene->get_blk_metadata(id);
64 
65   //instantiate a cache to grab the first block
66   boxm2_lru_cache::create(scene);
67   boxm2_block* blk = boxm2_cache::instance()->get_block(scene,id);
68   boxm2_data_base * alph = boxm2_cache::instance()->get_data_base(scene,id,boxm2_data_traits<BOXM2_ALPHA>::prefix());
69   boxm2_data_base * mog  = boxm2_cache::instance()->get_data_base(scene,id,boxm2_data_traits<BOXM2_MOG3_GREY>::prefix());
70 
71   //set block data to be black and white
72   boxm2_data<BOXM2_ALPHA>* alpha_data_ = new boxm2_data<BOXM2_ALPHA>(alph->data_buffer(),alph->buffer_length(),alph->block_id());
73   boxm2_data<BOXM2_MOG3_GREY>* mog3_data_  = new boxm2_data<BOXM2_MOG3_GREY>(mog->data_buffer(),mog->buffer_length(),mog->block_id());
74   typedef vnl_vector_fixed<vxl_byte, 16> uchar16;
75   for (int x=0; x<8; ++x) {
76     for (int y=0; y<4; ++y) {
77       //load current block/tree
78       uchar16 tree = blk->trees()(x,y,0);
79       boct_bit_tree bit_tree( (unsigned char*)tree.data_block(), info->root_level+1);
80       int data_ptr = bit_tree.get_data_ptr();
81 
82       alpha_data_->data()[data_ptr] = 1000;
83       mog3_data_->data()[data_ptr] = boxm2_data<BOXM2_MOG3_GREY>::datatype( (vxl_byte) 255);
84     }
85   }
86   for (int x=0; x<8; ++x) {
87     for (int y=4; y<8; ++y) {
88       //load current block/tree
89       uchar16 tree = blk->trees()(x,y,0);
90       boct_bit_tree bit_tree( (unsigned char*)tree.data_block(), info->root_level+1);
91       int data_ptr = bit_tree.get_data_ptr();
92 
93       alpha_data_->data()[data_ptr] = 1000;
94       mog3_data_->data()[data_ptr] = boxm2_data<BOXM2_MOG3_GREY>::datatype((vxl_byte) 0);
95     }
96   }
97 
98   //change up the valeus
99 
100   std::vector<boxm2_data_base*> datas;
101   datas.push_back(alph); datas.push_back(mog);
102 
103   //generate test camera
104   vpgl_camera_double_sptr cam = test_camera();
105 
106   //create image
107   unsigned ni=8, nj=8;
108   auto* expected = new vil_image_view<float>(ni,nj);
109   expected->fill(0.0f);
110   auto* vis = new vil_image_view<float>(ni,nj);
111   vis->fill(1.0f);
112 
113   //run render process
114   boxm2_render_cone_exp_image( info, blk, datas, cam, expected, vis, ni, nj) ;
115   vil_save( *expected, "cone_expected.tiff" );
116 
117   //create noncone
118   auto* ray_expected = new vil_image_view<float>(ni,nj);
119   ray_expected->fill(0.0f);
120   auto* ray_vis = new vil_image_view<float>(ni,nj);
121   ray_vis->fill(1.0f);
122   boxm2_render_expected_image( info, blk, datas, cam, ray_expected, ray_vis, ni, nj) ;
123   vil_save( *ray_expected, "ray_expected.tiff" );
124 }
125 
126 
127 TESTMAIN(test_cone_ray_trace);
128