//############################################################################
//
// LaserBoy !!!
//
// by James Lehman
// Extra Stimulus Inc.
// james@akrobiz.com
//
// began: October 2003
//
// Copyright 2003 to 2024 James Lehman.
// This source is distributed under the terms of the GNU General Public License.
//
// LaserBoy_frame.cpp is part of LaserBoy.
//
// LaserBoy is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// LaserBoy is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with LaserBoy. If not, see .
//
//############################################################################
#include "LaserBoy_SDL_GUI.hpp"
//############################################################################
LaserBoy_frame::LaserBoy_frame(LaserBoy_segment& segment)
: LaserBoy_ild_header ()
, LaserBoy_segment (segment)
, is_selected (false)
, is_unique (true)
, is_wagged (false)
, egg (0)
, spider (0)
, palette_name ()
, intro ()
, bridge ()
, coda ()
{
intro.palette_index = segment.palette_index;
bridge.palette_index = segment.palette_index;
coda.palette_index = segment.palette_index;
if(segment.palette_index > LASERBOY_TRUE_COLOR)
palette_name = p_space->palette_picker(segment.palette_index).name;
else
palette_name.clear();
is_2D();
}
//############################################################################
LaserBoy_frame::LaserBoy_frame(const int& palette_index,
bool add_origin
)
: LaserBoy_ild_header ()
, LaserBoy_segment (palette_index, add_origin)
, is_selected (false)
, is_unique (true)
, is_wagged (false)
, egg (0)
, spider (0)
, palette_name ()
, intro ()
, bridge ()
, coda ()
{
intro.palette_index = palette_index;
bridge.palette_index = palette_index;
coda.palette_index = palette_index;
if(palette_index > LASERBOY_TRUE_COLOR)
palette_name = p_space->palette_picker(palette_index).name;
else
palette_name.clear();
}
//############################################################################
LaserBoy_frame::LaserBoy_frame(const LaserBoy_ild_header& header,
const LaserBoy_segment& segment
)
: LaserBoy_ild_header ()
, LaserBoy_segment (segment)
, is_selected (false)
, is_unique (true)
, is_wagged (false)
, egg (0)
, spider (0)
, palette_name ()
, intro ()
, bridge ()
, coda ()
{
intro.palette_index = segment.palette_index;
bridge.palette_index = segment.palette_index;
coda.palette_index = segment.palette_index;
if(segment.palette_index > LASERBOY_TRUE_COLOR)
palette_name = p_space->palette_picker(segment.palette_index).name;
else
palette_name.clear();
}
//############################################################################
LaserBoy_frame::LaserBoy_frame(LaserBoy_vertex(*F)(int, int),
int vertices_per_frame,
int frame_index
)
: LaserBoy_ild_header( )
, LaserBoy_segment ( )
, is_selected (false)
, is_unique (true )
, is_wagged (false)
, egg (0 )
, spider (0 )
, intro ( )
, bridge ( )
, coda ( )
{
palette_name = p_space->palette_picker(LASERBOY_LASERBOY_HUES).name;
is_selected = false;
is_unique = true;
is_wagged = false;
palette_index = LASERBOY_LASERBOY_HUES;
format = LASERBOY_3D_FRAME;
LaserBoy_vertex vertex = F(0, frame_index);
vertex.blank();
reserve(vertices_per_frame + 2);
push_back(vertex);
for(int p = 0; p < vertices_per_frame; p++)
push_back(F(p, frame_index));
push_back(vertex);
quantity = size();
}
//############################################################################
void LaserBoy_frame::sync_rgb_and_palette()
{
LaserBoy_segment::sync_rgb_and_palette();
if(palette_index > LASERBOY_TRUE_COLOR)
palette_name = p_space->palette_picker(palette_index).name;
else
palette_name.clear();
return;
}
//############################################################################
bool LaserBoy_frame::save_as_ild(const string& file, LaserBoy_ild_header_count& counter)
{
if(size() > 1)
{
std::ofstream out(file.c_str(), ios::out | ios::binary);
if(out.is_open())
{
LaserBoy_ild_header header;
header.total = 1;
header.owner = "LaserBoy";
owner = "LaserBoy";
if(name.size() == 0 || name == "ESI.....")
name = "ESI00000";
if(p_space->save_2D_as_3D)
format = LASERBOY_3D_FRAME;
if(!p_space->save_ild_fmt_4_5)
{
if(palette_index == LASERBOY_TRUE_COLOR)
{
header.format = LASERBOY_PALETTE;
header.name = p_space->palette_picker(LASERBOY_REDUCED_332).name;
header.quantity = p_space->palette_picker(LASERBOY_REDUCED_332).number_of_colors();
header.identity = 0;
header.total = 3;
header.to_ofstream_ild(out);
p_space->palette_picker(LASERBOY_REDUCED_332).to_ofstream_ild(out);
counter._2++;
header.format = LASERBOY_COLOR_TABLE;
header.name = name;
header.quantity = size();
header.identity = 1;
header.to_ofstream_ild(out);
as_color_table().to_ofstream_ild(out);
counter._3++;
}
else if(palette_index != LASERBOY_ILDA_DEFAULT)
{
header.format = LASERBOY_PALETTE;
header.name = p_space->palette_picker(palette_index).name;
header.quantity = p_space->palette_picker(palette_index).number_of_colors();
header.identity = 0;
header.total = 2;
header.to_ofstream_ild(out);
p_space->palette_picker(palette_index).to_ofstream_ild(out);
counter._2++;
}
} // end if(!p_space->save_ild_fmt_4_5)
//----------------------------------------------------------------
LaserBoy_frame copy(*this);
if(p_space->auto_minimize)
copy.minimize(0);
else if(p_space->save_1_frame_bridge && bridge.size() > 2)
copy += bridge;
copy.sync_rgb_and_palette();
copy.quantity = copy.size();
copy.total = header.total;
copy.identity = header.total - 1;
if(p_space->save_ild_fmt_4_5)
{
if(copy.format == LASERBOY_3D_FRAME) copy.format = LASERBOY_3D_FRAME_RGB;
if(copy.format == LASERBOY_2D_FRAME) copy.format = LASERBOY_2D_FRAME_RGB;
}
copy.LaserBoy_ild_header::to_ofstream_ild(out);
for(size_t i = 0; i < copy.size() - 1; i++)
copy.at(i).to_ofstream_ild(out, copy.format, false);
copy.back().to_ofstream_ild(out, copy.format, true); // last vertex
switch(copy.format)
{
case 0:
counter._0++;
break;
case 1:
counter._1++;
break;
case 4:
counter._4++;
break;
case 5:
counter._5++;
break;
default:
break;
}
//----------------------------------------------------------------
if(p_space->save_ild_fmt_4_5)
header.format = LASERBOY_3D_FRAME_RGB;
else
header.format = LASERBOY_3D_FRAME;
header.name = "ILDA_End";
header.owner = p_space->install_GUID;
header.quantity = 0;
header.identity = header.total;
header.to_ofstream_ild(out);
counter._e++;
p_space->last_ild_file_name = file;
out.close();
is_2D();
} // end if(out.is_open())
else
return false;
//--------------------------------------------------------------------
return true;
}
return false;
}
//############################################################################
bool LaserBoy_frame::save_as_ctn(const string& file)
{
std::ofstream out(file.c_str(), ios::out | ios::binary);
if(out.is_open())
{
to_ofstream_ctn(out);
out.close();
}
else
return false;
//------------------------------------------------------------------------
return true;
}
//############################################################################
bool LaserBoy_frame::save_as_txt(const string& file)
{
std::ofstream out(file.c_str(), ios::out);
if(out.is_open())
{
txt_tag(out);
//----------------------------------------------------------------
LaserBoy_frame copy(*this);
if(p_space->auto_minimize)
copy.minimize(0);
//----------------------------------------------------------------
if(!p_space->save_txt_with_color)
{
if(copy.palette_index != LASERBOY_TRUE_COLOR)
{
if( p_space->save_txt_named_palettes
|| copy.palette_index >= LASERBOY_BUILT_IN_PALETTES
)
p_space->palette_picker(copy.palette_index).to_ofstream_txt(out);
else
{
out << "palette named "
<< p_space->palette_picker(copy.palette_index).name
<< ENDL
<< ENDL;
}
}
else
copy.to_ofstream_txt_color_table(out);
}
copy.to_ofstream_txt(out, 0);
out.close();
}
else
return false;
//----------------------------------------------------------------
return true;
}
//############################################################################
bool LaserBoy_frame::save_as_txt_table(const string& file)
{
std::ofstream out(file.c_str(), ios::out);
if(out.is_open())
{
txt_tag(out);
to_ofstream_txt_color_table(out);
out.close();
}
else
return false;
return true;
}
//############################################################################
LaserBoy_Error_Code LaserBoy_frame::optimize(LaserBoy_3D_short point_of_entry) // last point of previous frame
{
int i,
j,
dwell_samples;
LaserBoy_3D_double _0,
_1,
_2;
LaserBoy_vertex vertex,
black_vertex;
LaserBoy_Error_Code stat = LASERBOY_OK;
//------------------------------------------------------------------------
vertex = front();
vertex.blank();
//------------------------------------------------------------------------
stat |= add_dwell();
if(p_space->dots_setting == LASERBOY_DOTS_ENHANCE)
stat |= enhance_dots();
stat |= add_lit_span_vertices();
stat |= add_blank_span_vertices();
//------------------------------------------------------------------------
is_wagged = false;
//------------------------------------------------------------------------
// intro from the origin to the first vertex
//------------------------------------------------------------------------
intro.clear();
intro += LaserBoy_segment(point_of_entry, vertex); // line from entry point to first vertex
//------------------------------------------------------------------------
_0 = point_of_entry;
_1 =
_2 = front();
//------------------------------------------------------------------------
j = 0;
while( (_1 == _2)
&& (++j < (int)size())
)
_2 = at(j);
//------------------------------------------------------------------------
if(_0 == _1)
dwell_samples = 0;
else if(_0 == _2)
dwell_samples = start_dwell_vertices(pi,
p_space->sample_rate,
p_space->max_dwell_microsec
);
else
dwell_samples = start_dwell_vertices(delta_angle(_0 | _2,
_0 | _1,
_1 | _2
),
p_space->sample_rate,
p_space->max_dwell_microsec
);
if(dwell_samples) // dwell from the line to the first lit vector
for(i = 0; i < dwell_samples; i++)
intro.push_back(vertex); // front() all blank
//------------------------------------------------------------------------
// bridge to join the end back to the biginning
//------------------------------------------------------------------------
bridge.clear();
_0 =
_1 = back();
_2 = front();
//------------------------------------------------------------------------
j = 0;
while( (_1 == _2)
&& (++j < (int)size())
)
_2 = at(j);
//------------------------------------------------------------------------
j = size() - 1;
while( (_0 == _1)
&& (--j >= 0)
)
_0 = at(j);
//------------------------------------------------------------------------
if( (_0 == _1)
|| (_1 == _2)
)
dwell_samples = 0;
else if(_0 == _2)
dwell_samples = end_dwell_vertices(pi,
p_space->sample_rate,
p_space->max_dwell_microsec
);
else
dwell_samples = end_dwell_vertices(delta_angle(_0 | _2,
_0 | _1,
_1 | _2
),
p_space->sample_rate,
p_space->max_dwell_microsec
);
if(dwell_samples)
{
vertex = black_vertex = back();
if(p_space->black_dwell_vertices)
{
black_vertex.c = p_space->palette_picker(palette_index).black;
black_vertex.r =
black_vertex.g =
black_vertex.b = 0x00;
}
for(i = 0; i < dwell_samples; i++)
if(i < (int)p_space->lit_dwell_overhang)
bridge.push_back(vertex); // dwell on last lit vector
else
bridge.push_back(black_vertex);
} // end if(dwell_samples)
//------------------------------------------------------------------------
if(front_to_back_magnitude() >= p_space->insignificant_distance)
{
vertex = front();
vertex.blank();
bridge += LaserBoy_segment(back(), vertex); // line from last vertex to first for repete
//----------------------------------------------------------------
_0 = back();
_1 =
_2 = front();
//----------------------------------------------------------------
j = 0;
while( (_1 == _2)
&& (++j < (int)size())
)
_2 = at(j);
//----------------------------------------------------------------
j = size() - 1;
while( (_0 == _1)
&& (--j >= 0)
)
_0 = at(j);
//----------------------------------------------------------------
if( (_0 == _1)
|| (_1 == _2)
)
dwell_samples = 0;
else if(_0 == _2)
dwell_samples = start_dwell_vertices(pi,
p_space->sample_rate,
p_space->max_dwell_microsec
);
else
dwell_samples = start_dwell_vertices(delta_angle(_0 | _2,
_0 | _1,
_1 | _2
),
p_space->sample_rate,
p_space->max_dwell_microsec
);
if(dwell_samples) // dwell from the line to the front()
{
vertex = front();
vertex.blank();
for(i = 0; i < dwell_samples; i++)
bridge.push_back(vertex);
}
}
//------------------------------------------------------------------------
if(length_in_seconds() < (p_space->max_wag_microsec / 1000000.0))
{
dwell_samples = start_dwell_vertices(pi,
p_space->sample_rate,
p_space->max_dwell_microsec
);
if((int)bridge.size() > 2 * dwell_samples)
{
bridge.clear();
vertex = front();
vertex.blank();
for(i = 0; i < dwell_samples; i++)
bridge.push_back(vertex);
bridge += *this;
vertex = back();
vertex.blank();
for(i = 0; i < dwell_samples; i++)
bridge.push_back(vertex);
bridge.reverse();
is_wagged = true;
}
}
quantity = size();
return stat;
}
//############################################################################
void LaserBoy_frame::add_coda(LaserBoy_3D_short next_frame_entry_point)
{
int i,
j,
dwell_samples;
LaserBoy_3D_double _0,
_1,
_2;
LaserBoy_vertex vertex,
black_vertex;
//------------------------------------------------------------------------
// coda is dwell only at the last point before moving toward next frame entry
//------------------------------------------------------------------------
coda.clear();
//------------------------------------------------------------------------
_0 = at(size() - 2);
_1 = back();
_2 = next_frame_entry_point;
j = size() - 1;
while( (_0 == _1)
&& (--j >= 0)
)
_0 = at(j);
//------------------------------------------------------------------------
if(_1 == _2)
dwell_samples = 0;
else if(_0 == _2)
dwell_samples = end_dwell_vertices(pi,
p_space->sample_rate,
p_space->max_dwell_microsec
);
else
dwell_samples = end_dwell_vertices(delta_angle(_0 | _2,
_0 | _1,
_1 | _2
),
p_space->sample_rate,
p_space->max_dwell_microsec
);
//------------------------------------------------------------------------
vertex = black_vertex = back();
if(p_space->black_dwell_vertices)
{
black_vertex.c = p_space->palette_picker(palette_index).black;
black_vertex.r =
black_vertex.g =
black_vertex.b = 0x00;
}
if(dwell_samples > 2)
for(i = 0; i < (int)dwell_samples; i++)
{
if(i < (int)p_space->lit_dwell_overhang)
coda.push_back(vertex);
else
coda.push_back(black_vertex);
}
else // coda must exist to convey end_of_frame in optimized wav!
{
coda.push_back(black_vertex);
coda.push_back(black_vertex);
}
//------------------------------------------------------------------------
return;
}
//############################################################################
bool LaserBoy_frame::from_ifstream_format_3(std::ifstream& in,
const LaserBoy_ild_header& header,
long int& bytes_skipped
)
{
clear();
*this = header;
//------------------------------------------------------------------------
if(quantity)
{
u_int i;
LaserBoy_color color;
LaserBoy_vertex vertex;
LaserBoy_ild_header next_header;
//----------------------------------------------------------------
reserve(quantity);
for(i = 0; i < quantity; i++)
if(color.from_ifstream_ild(in))
push_back((LaserBoy_vertex)color);
else
return false;
//----------------------------------------------------------------
if(next_header.from_ifstream_ild(in, bytes_skipped))
{
if(quantity != next_header.quantity)
segment_error |= LASERBOY_COLOR_VERTEX_MISSMATCH;
if(quantity < next_header.quantity)
reserve(next_header.quantity);
*this = next_header;
for(i = 0; i < next_header.quantity; i++)
{
if(vertex.from_ifstream_ild(in, next_header.format))
{
at(i).x = vertex.x;
at(i).y = vertex.y;
at(i).z = vertex.z;
at(i).k = vertex.k;
at(i).c = vertex.c;
}
else
return false;
}
//----------------------------------------------------------------
front().blank();
//----------------------------------------------------------------
palette_index = LASERBOY_TRUE_COLOR;
sync_rgb_and_palette();
}
else
return false;
}
//------------------------------------------------------------------------
return true;
}
//############################################################################
LaserBoy_Error_Code LaserBoy_frame::from_ifstream_ild(std::ifstream& in,
const LaserBoy_ild_header& header
)
{
u_int i;
LaserBoy_vertex vertex;
//------------------------------------------------------------------------
clear();
*this = header;
//------------------------------------------------------------------------
if( format == LASERBOY_3D_FRAME_RGB
|| format == LASERBOY_2D_FRAME_RGB
)
palette_index = LASERBOY_TRUE_COLOR;
//------------------------------------------------------------------------
if(quantity)
{
reserve(quantity);
for(i = 0; i < quantity; i++)
{
if(vertex.from_ifstream_ild(in, format))
push_back(vertex);
else
{
segment_error |= LASERBOY_QUANTITY_DATA_MISSMATCH;
break;
}
}
//----------------------------------------------------------------
if(size() == 0)
segment_error |= LASERBOY_EOF;
//----------------------------------------------------------------
front().blank();
}
//------------------------------------------------------------------------
return segment_error;
}
//############################################################################
LaserBoy_Error_Code LaserBoy_frame::from_ifstream_dxf(std::ifstream& in)
{
u_int i;
LaserBoy_vertex vertex;
LaserBoy_real_segment real_vertices;
//------------------------------------------------------------------------
format = LASERBOY_3D_FRAME ;
palette_index = LASERBOY_TRUE_COLOR;
//------------------------------------------------------------------------
segment_error |= real_vertices.from_ifstream_dxf(in);
//------------------------------------------------------------------------
if(real_vertices.size() > 2) // more than the default original vector
{
if(p_space->auto_scale_dxf)
real_vertices.normalize();
reserve(real_vertices.size() - 2);
for(i = 2; i < real_vertices.size(); i++)
push_back((LaserBoy_vertex)real_vertices[i]);
}
else
{
reserve(2);
push_back(vertex);
push_back(vertex);
}
//------------------------------------------------------------------------
is_2D(); // if so change format to LASERBOY_2D_FRAME
quantity = size();
return segment_error;
}
//############################################################################
LaserBoy_Error_Code LaserBoy_frame::from_ifstream_txt(std::ifstream& in,
const u_int& group_type,
const u_int& element_type,
int& line_number
)
{ //------------------------------------------------------------------------
switch(group_type)
{
case LASERBOY_COLOR_TABLE:
format = LASERBOY_COLOR_TABLE;
palette_index = LASERBOY_TRUE_COLOR;
break;
//----------------------------------------------------------------
case LASERBOY_3D_FRAME_RGB:
format = LASERBOY_3D_FRAME_RGB;
palette_index = LASERBOY_TRUE_COLOR;
break;
//----------------------------------------------------------------
case LASERBOY_2D_FRAME_RGB:
format = LASERBOY_2D_FRAME_RGB;
palette_index = LASERBOY_TRUE_COLOR;
break;
//----------------------------------------------------------------
case LASERBOY_3D_FRAME_HEX:
format = LASERBOY_3D_FRAME_RGB;
palette_index = LASERBOY_TRUE_COLOR;
break;
//----------------------------------------------------------------
case LASERBOY_2D_FRAME_HEX:
format = LASERBOY_2D_FRAME_RGB;
palette_index = LASERBOY_TRUE_COLOR;
break;
//----------------------------------------------------------------
case LASERBOY_3D_FRAME_PALETTE:
format = LASERBOY_3D_FRAME;
palette_index = p_space->palette_index;
break;
//----------------------------------------------------------------
case LASERBOY_2D_FRAME_PALETTE:
format = LASERBOY_2D_FRAME;
palette_index = p_space->palette_index;
break;
//----------------------------------------------------------------
case LASERBOY_3D_FRAME_TABLE:
format = LASERBOY_3D_FRAME;
palette_index = LASERBOY_TRUE_COLOR;
break;
//----------------------------------------------------------------
case LASERBOY_2D_FRAME_TABLE:
format = LASERBOY_2D_FRAME;
palette_index = LASERBOY_TRUE_COLOR;
break;
}
//------------------------------------------------------------------------
if( group_type == LASERBOY_3D_FRAME_TABLE
|| group_type == LASERBOY_2D_FRAME_TABLE // we already have r g b
)
{
u_int i;
LaserBoy_vertex vertex;
for(i = 0; i < size(); i++)
if(!at(i).from_ifstream_txt(in, group_type, element_type, line_number))
break;
if(i < size()) // too few vertices
segment_error |= LASERBOY_COLOR_VERTEX_MISSMATCH;
i = 0;
while(vertex.from_ifstream_txt(in, group_type, element_type, line_number))
i++;
if(i > 0)
segment_error |= LASERBOY_COLOR_VERTEX_MISSMATCH;
}
//------------------------------------------------------------------------
else
{
LaserBoy_vertex vertex;
clear();
if(palette_index == LASERBOY_TRUE_COLOR)
while(vertex.from_ifstream_txt(in, group_type, element_type, line_number))
push_back(vertex);
else
while(vertex.from_ifstream_txt(in, group_type, element_type, line_number))
{
vertex.r = p_space->palette_picker(palette_index)[vertex.c].r;
vertex.g = p_space->palette_picker(palette_index)[vertex.c].g;
vertex.b = p_space->palette_picker(palette_index)[vertex.c].b;
push_back(vertex);
}
}
//------------------------------------------------------------------------
quantity = size();
return segment_error;
}
//############################################################################
LaserBoy_Bounds LaserBoy_frame::move_selection(LaserBoy_3D_double d)
{
if(size() > 1 && size_of_selection())
{
u_int i;
LaserBoy_Bounds out_of_bounds = LASERBOY_IN_BOUNDS;
if(!p_space->destructive_clipping)
{
for(i = 0; i < size(); i++)
if( is_index_selected(i)
&& (out_of_bounds = LaserBoy_bounds_check(at(i).as_3D_double() + d, LASERBOY_CUBE))
)
return out_of_bounds;
for(i = 0; i < size(); i++)
if(is_index_selected(i))
at(i) = at(i).as_3D_double() + d;
return LASERBOY_IN_BOUNDS;
}
LaserBoy_real_segment rs = to_real_segment(false);
for(i = 0; i < rs.size(); i++)
if(is_index_selected(i))
rs.at(i) += d;
rs.clip();
if( (rs.size())
> (size() - size_of_selection())
)
spider = spider - (size() - rs.size());
else
egg = spider = 0;
*this = rs;
return LASERBOY_IN_BOUNDS;
}
return LASERBOY_IN_BOUNDS;
}
//############################################################################
LaserBoy_Bounds LaserBoy_frame::scale_selection(LaserBoy_3D_double m)
{
if(size() > 1 && size_of_selection())
{
u_int i;
LaserBoy_Bounds out_of_bounds = LASERBOY_IN_BOUNDS;
LaserBoy_3D_short origin;
LaserBoy_3D_double center = selected_segment().centroid_of_coordinates();
if(!p_space->destructive_clipping)
{
for(i = 0; i < size(); i++)
if(is_index_selected(i))
{
if( is_index_selected(i)
&& (out_of_bounds |= LaserBoy_bounds_check((m * (at(i).as_3D_double() - center)) + center, LASERBOY_CUBE))
)
return out_of_bounds;
}
for(i = 0; i < size(); i++)
if(is_index_selected(i))
at(i) = (m * (at(i).as_3D_double() - center)) + center;
return LASERBOY_IN_BOUNDS;
}
LaserBoy_real_segment rs = to_real_segment(false);
for(i = 0; i < rs.size(); i++)
if(is_index_selected(i))
rs.at(i) = (m * (rs.at(i) - center)) + center;
rs.clip();
if( (rs.size())
> (size() - size_of_selection())
)
spider = spider - (size() - rs.size());
else
egg = spider = 0;
*this = rs;
return LASERBOY_IN_BOUNDS;
}
return LASERBOY_IN_BOUNDS;
}
//############################################################################
LaserBoy_Bounds LaserBoy_frame::scale_selection_on_fulcrum(LaserBoy_3D_double magnitude)
{
if(size() > 1 && size_of_selection())
{
u_int i;
LaserBoy_Bounds out_of_bounds = LASERBOY_IN_BOUNDS;
LaserBoy_3D_short origin;
if(!p_space->destructive_clipping)
{
for(i = 0; i < size(); i++)
if( is_index_selected(i)
&& (out_of_bounds |= LaserBoy_bounds_check((magnitude * (at(i).as_3D_double() - p_space->fulcrum)) + p_space->fulcrum, LASERBOY_CUBE))
)
return out_of_bounds;
for(i = 0; i < size(); i++)
if(is_index_selected(i))
at(i) = (magnitude * (at(i).as_3D_double() - p_space->fulcrum)) + p_space->fulcrum;
return LASERBOY_IN_BOUNDS;
}
LaserBoy_real_segment rs = to_real_segment(false);
for(i = 0; i < rs.size(); i++)
if(is_index_selected(i))
rs.at(i) = (magnitude * (rs.at(i) - p_space->fulcrum)) + p_space->fulcrum;
rs.clip();
if( (rs.size())
> (size() - size_of_selection())
)
spider = spider - (size() - rs.size());
else
egg = spider = 0;
*this = rs;
return LASERBOY_IN_BOUNDS;
}
return LASERBOY_IN_BOUNDS;
}
//############################################################################
LaserBoy_Bounds LaserBoy_frame::rotate_selection(LaserBoy_3D_double a)
{
if(size() > 1 && size_of_selection())
{
u_int i;
LaserBoy_Bounds out_of_bounds = LASERBOY_IN_BOUNDS;
LaserBoy_3D_short origin;
LaserBoy_3D_double center = selected_segment().centroid_of_coordinates();
if(!p_space->destructive_clipping)
{
for(i = 0; i < size(); i++)
if( is_index_selected(i)
&& (out_of_bounds |= LaserBoy_bounds_check(rotate_vertex_on_coordinates(at(i).as_3D_double(), center, a), LASERBOY_CUBE))
)
return out_of_bounds;
for(i = 0; i < size(); i++)
if(is_index_selected(i))
at(i) = rotate_vertex_on_coordinates(at(i).as_3D_double(), center, a);
return LASERBOY_IN_BOUNDS;
}
LaserBoy_real_segment rs = to_real_segment(false);
for(i = 0; i < rs.size(); i++)
if(is_index_selected(i))
rs.at(i) = rotate_vertex_on_coordinates(rs.at(i), center, a);
rs.clip();
if( (rs.size())
> (size() - size_of_selection())
)
spider = spider - (size() - rs.size());
else
egg = spider = 0;
*this = rs;
return LASERBOY_IN_BOUNDS;
}
return LASERBOY_IN_BOUNDS;
}
//############################################################################
LaserBoy_Bounds LaserBoy_frame::rotate_selection_on_fulcrum(LaserBoy_3D_double a)
{
if(size() > 1 && size_of_selection())
{
u_int i;
LaserBoy_Bounds out_of_bounds = LASERBOY_IN_BOUNDS;
LaserBoy_3D_double _d;
if(!p_space->destructive_clipping)
{
for(i = 0; i < size(); i++)
if( is_index_selected(i)
&& (out_of_bounds |= LaserBoy_bounds_check(rotate_vertex_on_coordinates(at(i).as_3D_double(), p_space->fulcrum, a), LASERBOY_CUBE))
)
return out_of_bounds;
for(i = 0; i < size(); i++)
if(is_index_selected(i))
at(i) = rotate_vertex_on_coordinates(at(i).as_3D_double(), p_space->fulcrum, a);
return LASERBOY_IN_BOUNDS;
}
LaserBoy_real_segment rs = to_real_segment(false);
for(i = 0; i < rs.size(); i++)
if(is_index_selected(i))
rs.at(i) = rotate_vertex_on_coordinates(rs.at(i), p_space->fulcrum, a);
rs.clip();
if( (rs.size())
> (size() - size_of_selection())
)
spider = spider - (size() - rs.size());
else
egg = spider = 0;
*this = rs;
return LASERBOY_IN_BOUNDS;
}
return LASERBOY_IN_BOUNDS;
}
//############################################################################
void LaserBoy_frame::next_segment_select()
{
size_t segment_index, start, end;
find_segment_of_vertex(egg, start, end, segment_index);
if(spider < end)
find_segment_at_index(segment_index, egg, spider);
else
find_segment_at_index(segment_index + 1, egg, spider);
return;
}
//############################################################################
void LaserBoy_frame::next_segment_egg()
{
size_t segment_index, start, end;
find_segment_of_vertex(egg, start, end, segment_index);
find_segment_at_index(segment_index + 1, egg, end);
return;
}
//############################################################################
void LaserBoy_frame::next_segment_spider()
{
size_t segment_index, start, end;
find_segment_of_vertex(spider, start, end, segment_index);
find_segment_at_index(segment_index + 1, start, spider);
return;
}
//############################################################################
void LaserBoy_frame::previous_segment_select()
{
size_t segment_index, start, end;
find_segment_of_vertex(egg, start, end, segment_index);
if(segment_index == 0)
segment_index = number_of_segments();
find_segment_at_index(segment_index - 1, egg, spider);
return;
}
//############################################################################
void LaserBoy_frame::previous_segment_egg()
{
size_t segment_index, start, end;
find_segment_of_vertex(egg, start, end, segment_index);
if(segment_index == 0)
segment_index = number_of_segments();
find_segment_at_index(segment_index - 1, egg, end);
return;
}
//############################################################################
void LaserBoy_frame::previous_segment_spider()
{
size_t segment_index, start, end;
find_segment_of_vertex(spider, start, end, segment_index);
if(segment_index == 0)
segment_index = number_of_segments();
find_segment_at_index(segment_index - 1, start, spider);
return;
}
//############################################################################
void LaserBoy_frame::color_select()
{
if(size() > 1)
{
u_int i;
//----------------------------------------------------------------
if(palette_index != LASERBOY_TRUE_COLOR)
{
for(i = 0; i < size(); i++)
if( at(i).is_color(p_space->black_level)
&& is_index_selected(i)
)
{
at(i).c = p_space->selected_color_index;
at(i).r = p_space->palette_picker(palette_index)[p_space->selected_color_index].r;
at(i).g = p_space->palette_picker(palette_index)[p_space->selected_color_index].g;
at(i).b = p_space->palette_picker(palette_index)[p_space->selected_color_index].b;
}
}
//----------------------------------------------------------------
else
{
for(i = 0; i < size(); i++)
if( at(i).is_color(p_space->black_level)
&& is_index_selected(i)
)
{
at(i).r = p_space->palette_picker(palette_index)[p_space->selected_color_index].r;
at(i).g = p_space->palette_picker(palette_index)[p_space->selected_color_index].g;
at(i).b = p_space->palette_picker(palette_index)[p_space->selected_color_index].b;
}
}
//----------------------------------------------------------------
}
return;
}
//############################################################################
void LaserBoy_frame::color_index_select()
{
if(size() > 1)
{
u_int i,
num_colors,
j = 0;
//----------------------------------------------------------------
if(palette_index != LASERBOY_TRUE_COLOR)
{
num_colors = p_space->palette_picker(palette_index).last;
num_colors++; // you can't do modulus with ZERO!
for(i = 0; i < size(); i++)
if( at(i).is_color(p_space->black_level)
&& is_index_selected(i)
)
{
at(i).c = p_space->selected_color_index;
at(i).r = p_space->palette_picker(palette_index)[j % num_colors].r;
at(i).g = p_space->palette_picker(palette_index)[j % num_colors].g;
at(i).b = p_space->palette_picker(palette_index)[j % num_colors].b;
j++;
}
}
//----------------------------------------------------------------
else
{
num_colors = p_space->palette_picker(p_space->target_palette_index).last;
num_colors++; // you can't do modulus with ZERO!
for(i = 0; i < size(); i++)
if( at(i).is_color(p_space->black_level)
&& is_index_selected(i)
)
{
at(i).r = p_space->palette_picker(p_space->target_palette_index)[j % num_colors].r;
at(i).g = p_space->palette_picker(p_space->target_palette_index)[j % num_colors].g;
at(i).b = p_space->palette_picker(p_space->target_palette_index)[j % num_colors].b;
j++;
}
}
//----------------------------------------------------------------
}
return;
}
//############################################################################
void LaserBoy_frame::color_span_select()
{
if(size() > 1)
{
u_int i,
j = 0,
selected = 0,
span = egg,
offset = spider;
//----------------------------------------------------------------
for(i = span; i <= offset; i++)
if(at(i).is_color(p_space->black_level))
selected++;
//----------------------------------------------------------------
if(palette_index != LASERBOY_TRUE_COLOR)
{
span = p_space->palette_picker(palette_index).last
- p_space->palette_picker(palette_index).first,
offset = p_space->palette_picker(palette_index).first;
for(i = 0; i < size(); i++)
if( at(i).is_color(p_space->black_level)
&& is_index_selected(i)
)
{
at(i).c = (u_char) ( j
* p_space->recolor_span_factor
/ selected
* span
)
% span
+ offset;
at(i).r = p_space->palette_picker(palette_index)[at(i).c].r;
at(i).g = p_space->palette_picker(palette_index)[at(i).c].g;
at(i).b = p_space->palette_picker(palette_index)[at(i).c].b;
j++;
}
}
//----------------------------------------------------------------
else
{
span = p_space->palette_picker(p_space->target_palette_index).last
- p_space->palette_picker(p_space->target_palette_index).first,
offset = p_space->palette_picker(p_space->target_palette_index).first;
for(i = 0; i < size(); i++)
if( at(i).is_color(p_space->black_level)
&& is_index_selected(i)
)
{
at(i).c = (u_char) ( j
* p_space->recolor_span_factor
/ selected
* span
)
% span
+ offset;
at(i).r = p_space->palette_picker(p_space->target_palette_index)[at(i).c].r;
at(i).g = p_space->palette_picker(p_space->target_palette_index)[at(i).c].g;
at(i).b = p_space->palette_picker(p_space->target_palette_index)[at(i).c].b;
j++;
}
}
//----------------------------------------------------------------
}
return;
}
//############################################################################
void LaserBoy_frame::color_index_black()
{
if(size() > 1)
{
u_int i,
j = 0;
//----------------------------------------------------------------
if(palette_index != LASERBOY_TRUE_COLOR)
{
for(i = 0; i < size(); i++)
if( at(i).is_black(p_space->black_level)
&& is_index_selected(i)
)
{
at(i).c = p_space->selected_color_index;
at(i).r = p_space->palette_picker(palette_index)[j % p_space->palette_picker(palette_index).last].r;
at(i).g = p_space->palette_picker(palette_index)[j % p_space->palette_picker(palette_index).last].g;
at(i).b = p_space->palette_picker(palette_index)[j % p_space->palette_picker(palette_index).last].b;
j++;
}
}
//----------------------------------------------------------------
else
{
for(i = 0; i < size(); i++)
if( at(i).is_black(p_space->black_level)
&& is_index_selected(i)
)
{
at(i).r = p_space->palette_picker(p_space->target_palette_index)[j % p_space->palette_picker(p_space->target_palette_index).last].r;
at(i).g = p_space->palette_picker(p_space->target_palette_index)[j % p_space->palette_picker(p_space->target_palette_index).last].g;
at(i).b = p_space->palette_picker(p_space->target_palette_index)[j % p_space->palette_picker(p_space->target_palette_index).last].b;
j++;
}
}
//----------------------------------------------------------------
}
return;
}
//############################################################################
void LaserBoy_frame::color_span_black()
{
if(size() > 1)
{
u_int i,
j = 0,
selected = 0,
span = egg,
offset = spider;
//----------------------------------------------------------------
for(i = span; i <= offset; i++)
if(at(i).is_black(p_space->black_level))
selected++;
//----------------------------------------------------------------
if(palette_index != LASERBOY_TRUE_COLOR)
{
span = p_space->palette_picker(palette_index).last
- p_space->palette_picker(palette_index).first,
offset = p_space->palette_picker(palette_index).first;
for(i = 0; i < size(); i++)
if( at(i).is_black(p_space->black_level)
&& is_index_selected(i)
)
{
at(i).c = (u_char) ( j
* p_space->recolor_span_factor
/ selected
* span
)
% span
+ offset;
at(i).r = p_space->palette_picker(palette_index)[at(i).c].r;
at(i).g = p_space->palette_picker(palette_index)[at(i).c].g;
at(i).b = p_space->palette_picker(palette_index)[at(i).c].b;
j++;
}
}
//----------------------------------------------------------------
else
{
span = p_space->palette_picker(p_space->target_palette_index).last
- p_space->palette_picker(p_space->target_palette_index).first,
offset = p_space->palette_picker(p_space->target_palette_index).first;
for(i = 0; i < size(); i++)
if( at(i).is_black(p_space->black_level)
&& is_index_selected(i)
)
{
at(i).c = (u_char) ( j
* p_space->recolor_span_factor
/ selected
* span
)
% span
+ offset;
at(i).r = p_space->palette_picker(p_space->target_palette_index)[at(i).c].r;
at(i).g = p_space->palette_picker(p_space->target_palette_index)[at(i).c].g;
at(i).b = p_space->palette_picker(p_space->target_palette_index)[at(i).c].b;
j++;
}
}
//----------------------------------------------------------------
}
return;
}
//############################################################################
void LaserBoy_frame::color_black_in_select()
{
if(size() > 1)
{
u_int i;
//----------------------------------------------------------------
if(palette_index != LASERBOY_TRUE_COLOR)
{
for(i = 0; i < size(); i++)
if(is_index_selected(i) && at(i).is_black(p_space->black_level))
{
at(i).c = p_space->selected_color_index;
at(i).r = p_space->palette_picker(palette_index)[p_space->selected_color_index].r;
at(i).g = p_space->palette_picker(palette_index)[p_space->selected_color_index].g;
at(i).b = p_space->palette_picker(palette_index)[p_space->selected_color_index].b;
}
}
//----------------------------------------------------------------
else
{
for(i = 0; i < size(); i++)
if(is_index_selected(i) && at(i).is_black(p_space->black_level))
{
at(i).r = p_space->palette_picker(palette_index)[p_space->selected_color_index].r;
at(i).g = p_space->palette_picker(palette_index)[p_space->selected_color_index].g;
at(i).b = p_space->palette_picker(palette_index)[p_space->selected_color_index].b;
}
}
//----------------------------------------------------------------
}
return;
}
//############################################################################
void LaserBoy_frame::color_cycle_select(int steps)
{
if(size() > 1)
{
u_int i,
span,
offset;
//----------------------------------------------------------------
if(palette_index != LASERBOY_TRUE_COLOR)
{
span = p_space->palette_picker(palette_index).last
- p_space->palette_picker(palette_index).first,
offset = p_space->palette_picker(palette_index).first;
while(span > 0 && steps < 0)
steps += span;
for(i = 0; i < size(); i++)
if( at(i).is_color(p_space->black_level)
&& is_index_selected(i)
)
{
at(i).c = (at(i).c - offset + steps) % span + offset;
at(i).r = p_space->palette_picker(palette_index)[at(i).c].r;
at(i).g = p_space->palette_picker(palette_index)[at(i).c].g;
at(i).b = p_space->palette_picker(palette_index)[at(i).c].b;
}
} // end if(palette_index != LASERBOY_TRUE_COLOR)
//----------------------------------------------------------------
else // palette_index == LASERBOY_TRUE_COLOR
{
LaserBoy_segment selected_vectors;
vector selected_vectors_index;
selected_vectors.palette_index = LASERBOY_TRUE_COLOR;
for(i = 0; i < size(); i++)
if( at(i).is_color(p_space->black_level)
&& is_index_selected(i)
)
{
selected_vectors.push_back(at(i));
selected_vectors_index.push_back(i);
}
while(selected_vectors.size() > 0 && steps < 0)
steps += selected_vectors.size();
for(i = 0; i < selected_vectors.size(); i++)
{
at(selected_vectors_index[i]).r = selected_vectors[(i + steps) % selected_vectors.size()].r;
at(selected_vectors_index[i]).g = selected_vectors[(i + steps) % selected_vectors.size()].g;
at(selected_vectors_index[i]).b = selected_vectors[(i + steps) % selected_vectors.size()].b;
}
}
//----------------------------------------------------------------
}
return;
}
//############################################################################
void LaserBoy_frame::blank_vertices()
{
if(size() > 1)
{
vector selected_indecies;
u_int i;
for(i = 1; i < size(); i++)
if(is_index_selected(i))
selected_indecies.push_back(i);
if(selected_indecies.size() == 1)
at(selected_indecies[0]).blank();
else if(selected_indecies.size() > 1)
{
if(selected_indecies[0] == 1)
at(selected_indecies[0]).blank();
for(i = 1; i < selected_indecies.size(); i++)
at(selected_indecies[i]).blank();
}
}
return;
}
//############################################################################
void LaserBoy_frame::unblank_vertices()
{
if(size() > 1)
{
vector selected_indecies;
u_int i;
for(i = 1; i < size(); i++)
if(is_index_selected(i))
selected_indecies.push_back(i);
if(selected_indecies.size() == 1)
at(selected_indecies[0]).unblank();
else if(selected_indecies.size() > 1)
{
if(selected_indecies[0] == 1)
at(selected_indecies[0]).unblank();
for(i = 1; i < selected_indecies.size(); i++)
at(selected_indecies[i]).unblank();
}
}
return;
}
//############################################################################
void LaserBoy_frame::black_vertices()
{
if(size() > 1)
{
vector selected_indecies;
u_int i;
for(i = 1; i < size(); i++)
if(is_index_selected(i))
selected_indecies.push_back(i);
if(selected_indecies.size() == 1 && at(selected_indecies[0]).is_blank())
{
at(selected_indecies[0]).r = 0x00;
at(selected_indecies[0]).g = 0x00;
at(selected_indecies[0]).b = 0x00;
at(selected_indecies[0]).c = p_space->palette_picker(palette_index).black;
at(selected_indecies[0]).unblank();
}
else if(selected_indecies.size() > 1)
for(i = 1; i < selected_indecies.size(); i++)
if(at(selected_indecies[i]).is_blank())
{
at(selected_indecies[i]).r = 0x00;
at(selected_indecies[i]).g = 0x00;
at(selected_indecies[i]).b = 0x00;
at(selected_indecies[i]).c = p_space->palette_picker(palette_index).black;
at(selected_indecies[i]).unblank();
}
}
return;
}
//############################################################################
void LaserBoy_frame::unblack_vertices()
{
if(size() > 1)
{
vector selected_indecies;
u_int i;
for(i = 1; i < size(); i++)
if(is_index_selected(i))
selected_indecies.push_back(i);
if(selected_indecies.size() == 1 && at(selected_indecies[0]).color_of(p_space->black_level) == 0x00) // lit black
{
at(selected_indecies[0]).r = 0xff;
at(selected_indecies[0]).g = 0xff;
at(selected_indecies[0]).b = 0xff;
at(selected_indecies[0]).c = p_space->palette_picker(palette_index).white;
at(selected_indecies[0]).blank();
}
else if(selected_indecies.size() > 1)
for(i = 1; i < selected_indecies.size(); i++)
if(at(selected_indecies[i]).color_of(p_space->black_level) == 0x00) // lit black
{
at(selected_indecies[i]).r = 0xff;
at(selected_indecies[i]).g = 0xff;
at(selected_indecies[i]).b = 0xff;
at(selected_indecies[i]).c = p_space->palette_picker(palette_index).white;
at(selected_indecies[i]).blank();
}
}
return;
}
//############################################################################
void LaserBoy_frame::minimize(int frame_index)
{
LaserBoy_vertex point_of_entry; // origin
LaserBoy_segment entry;
//------------------------------------------------------------------------
if(p_space->maintain_first_anchor)
point_of_entry = first_lit_anchor();
//------------------------------------------------------------------------
if(frame_index <= 0)
{
entry.push_back(point_of_entry);
entry.push_back(point_of_entry);
entry.back().unblank();
}
else
entry = p_space->frame_picker(frame_index - 1);
//------------------------------------------------------------------------
if(entry.size() < 2)
{
entry.push_back(point_of_entry);
entry.push_back(point_of_entry);
entry.back().unblank();
}
//------------------------------------------------------------------------
intro.clear();
bridge.clear();
coda.clear();
//------------------------------------------------------------------------
if(!p_space->allow_lit_black)
convert_black_to_blank();
//------------------------------------------------------------------------
reduce_blank_vectors ();
remove_dwell_vertices();
reduce_lit_vectors ();
remove_short_vectors ();
//------------------------------------------------------------------------
if(p_space->no_equivalent_vectors)
{
omit_equivalent_vectors ();
reduce_blank_vectors ();
}
//------------------------------------------------------------------------
if(p_space->dots_setting == LASERBOY_DOTS_REMOVE)
remove_dots();
//------------------------------------------------------------------------
if(p_space->conglomerate_in_minimize)
conglomerate_lit_segments();
//------------------------------------------------------------------------
reorder_segments(entry);
bond_segments ();
normalize_cursors();
//------------------------------------------------------------------------
quantity = size();
return;
}
//############################################################################
LaserBoy_Error_Code LaserBoy_frame::add_vertex(u_int vertex_index)
{
if( !LaserBoy_segment::add_vertex(vertex_index)
&& size() > 2
&& vertex_index < size()
)
{
if((at(vertex_index) | at(vertex_index + 1)) >= p_space->insignificant_distance)
spider = vertex_index + 1;
else
spider = vertex_index;
}
else
egg = spider = vertex_index = 0;
quantity = size();
return segment_error;
}
//############################################################################
LaserBoy_Error_Code LaserBoy_frame::break_segment()
{
LaserBoy_segment::break_segment(spider); // sets spider
quantity = size();
return segment_error;
}
//############################################################################
LaserBoy_Error_Code LaserBoy_frame::set_spider_to_egg()
{
at(spider) = (LaserBoy_3D_short)at(egg);
return segment_error;
}
//############################################################################
LaserBoy_Error_Code LaserBoy_frame::set_egg_to_spider()
{
at(egg) = (LaserBoy_3D_short)at(spider);
return segment_error;
}
//############################################################################
LaserBoy_Error_Code LaserBoy_frame::connect_the_dots()
{
LaserBoy_segment::connect_the_dots(egg, spider);
quantity = size();
return segment_error;
}
//############################################################################
LaserBoy_frame& LaserBoy_frame::to_dots()
{
if(size() > 1)
{
u_int i;
LaserBoy_frame frame(palette_index, false),
copy(*this);
//----------------------------------------------------------------
copy.reduce_blank_vectors();
frame.reserve(copy.size() + 1);
frame.push_back(copy.at(0));
frame.push_back(copy.at(1));
frame.back() = copy.at(0).as_3D_short();
//----------------------------------------------------------------
for(i = 1; i < copy.size(); i++)
{
if( (copy.at(i).is_lit() && copy.at_index_has_magnitude(i))
|| copy.at(i - 1).is_blank()
)
{
frame += copy.at(i);
frame.back().r = 0;
frame.back().g = 0;
frame.back().b = 0;
frame.back().c = p_space->palette_picker(palette_index).black;
}
frame += copy.at(i);
}
//----------------------------------------------------------------
if(at(0).as_3D_short() == frame.back().as_3D_short())
frame.pop_back();
*this = frame;
quantity = size();
//----------------------------------------------------------------
}
return *this;
}
//############################################################################
LaserBoy_frame& LaserBoy_frame::selected_to_dots()
{
u_int i,
new_spider = spider;
LaserBoy_frame frame(palette_index, false);
//------------------------------------------------------------------------
frame.reserve(size() + size_of_selection());
//------------------------------------------------------------------------
frame.push_back(front());
for(i = 1; i < size(); i++)
{
if( is_index_selected(i)
&& ( (at(i).is_lit() && at_index_has_magnitude(i))
|| at(i).is_blank()
)
)
{
frame += at(i);
frame.back().r = 0;
frame.back().g = 0;
frame.back().b = 0;
frame.back().c = p_space->palette_picker(palette_index).black;
new_spider++;
}
frame += at(i);
}
//------------------------------------------------------------------------
spider = new_spider;
*this = frame;
quantity = size();
//------------------------------------------------------------------------
return *this;
}
//############################################################################
LaserBoy_frame& LaserBoy_frame::remove_at_spider()
{
int new_spider = spider;
LaserBoy_segment::remove_vertex(spider);
spider = new_spider - 1;
normalize_cursors();
quantity = size();
return *this;
}
//############################################################################
LaserBoy_frame& LaserBoy_frame::remove_vertex(u_int vertex_index)
{
LaserBoy_segment::remove_vertex(vertex_index);
normalize_cursors();
quantity = size();
return *this;
}
//############################################################################
void LaserBoy_frame::to_ofstream_ild(std::ofstream& out, u_short& id_num, LaserBoy_ild_header_count& counter) // only called from LaserBoy_frame_set
{
if(size() > 1)
{
quantity = (u_short)size();
owner = "LaserBoy";
//--------------------------------------------------------------------
is_2D();
if(p_space->save_2D_as_3D)
format = LASERBOY_3D_FRAME;
//--------------------------------------------------------------------
if(name.size() == 0 || name == "ESI.....")
{
char number[12];
sprintf(number, "%05d", id_num);
name = "ESI" + string(number);
}
//--------------------------------------------------------------------
if(p_space->save_ild_fmt_4_5)
{
if(format == LASERBOY_3D_FRAME) format = LASERBOY_3D_FRAME_RGB;
if(format == LASERBOY_2D_FRAME) format = LASERBOY_2D_FRAME_RGB;
}
//--------------------------------------------------------------------
else if(palette_index == LASERBOY_TRUE_COLOR)
{
LaserBoy_ild_header header = (LaserBoy_ild_header)*this;
header.format = LASERBOY_COLOR_TABLE;
header.identity = id_num++;
header.to_ofstream_ild(out);
as_color_table().to_ofstream_ild_fmt3(out);
counter._3++;
}
//--------------------------------------------------------------------
identity = id_num++;
LaserBoy_ild_header::to_ofstream_ild(out); // *this
for(size_t i = 0; i < size() - 1; i++)
at(i).to_ofstream_ild(out, format, false);
back().to_ofstream_ild(out, format, true); // last vertex
switch(format)
{
case 0:
counter._0++;
break;
case 1:
counter._1++;
break;
case 4:
counter._4++;
break;
case 5:
counter._5++;
break;
default:
break;
}
//--------------------------------------------------------------------
}
return;
}
//############################################################################
void LaserBoy_frame::to_ofstream_ctn(std::ofstream& out)
{
u_int i,
j;
LaserBoy_frame copy(*this),
frame;
if(copy.palette_index != LASERBOY_ILDA_DEFAULT)
copy.best_match_palette(LASERBOY_ILDA_DEFAULT);
frame.clear();
if(copy.size() > 1)
{
if(p_space->auto_opti_ctn)
{
copy.flatten_z();
copy.minimize(0);
copy.optimize(0);
//-----------------------------------------------------------------
for(j = 0; j < (u_int)round(p_space->dwell_on_dot); j++)
frame.push_back(copy.at(0)); // copy the origin vector
//-----------------------------------------------------------------
for(i = 1; i < copy.size(); i++)
{
// if this vertex is lit and the previous one is not
if( copy.at(i - 1).is_blank() // look at the previous vertex
&& copy.at(i).is_lit()
)
{
for(j = 0; j < (u_int)round(p_space->dwell_on_dot); j++)
frame += copy.at(i - 1);
}
//-------------------------------------------------------------
// if this vertex is blank and the previous one is not
else if( copy.at(i - 1).is_lit() // look at the previous vertex
&& copy.at(i).is_blank()
)
{
for(j = 0; j < (u_int)round(p_space->dwell_on_dot); j++)
frame += copy.at(i - 1);
}
//-------------------------------------------------------------
frame += copy.at(i);
} // end for(i = 1; i < (int)copy.size(); i++)
//-----------------------------------------------------------------
for(j = 0; j < (u_int)round(p_space->dwell_on_dot); j++)
frame += copy.back();
//-----------------------------------------------------------------
} // end if(p_space->auto_opto_ctn)
else
frame = copy;
}
//------------------------------------------------------------------------
frame.quantity = (u_short)frame.size();
frame.LaserBoy_ild_header::to_ofstream_ctn(out);
//------------------------------------------------------------------------
for(size_t i = 0; i < frame.size() - 1; i++)
frame.at(i).to_ofstream_ild(out, LASERBOY_3D_FRAME, false);
frame.back().to_ofstream_ild(out, LASERBOY_3D_FRAME, true);
//------------------------------------------------------------------------
return;
}
//############################################################################
void LaserBoy_frame::to_ofstream_txt_color_table(std::ofstream& out)
{
out << "# ---------------------------------------------------------------"
<< ENDL
<< "table ";
if(p_space->save_txt_color_hex)
out << "hex";
else
out << "rgb";
out << ENDL;
//------------------------------------------------------------------------
for(size_t i = 0; i < size(); i++)
if(at(i).is_lit())
((LaserBoy_color)at(i)).to_ofstream_txt(out, p_space->save_txt_color_hex);
else
out << " -1"
<< ENDL;
//------------------------------------------------------------------------
out << ENDL;
return;
}
//############################################################################
void LaserBoy_frame::to_ofstream_txt(std::ofstream& out, int frame_index)
{
int output_format = ( (is_2D())
? ( (p_space->save_txt_with_color)
? (LASERBOY_2D_FRAME_RGB)
: ( (palette_index == LASERBOY_TRUE_COLOR)
? (LASERBOY_2D_FRAME_TABLE)
: (LASERBOY_2D_FRAME_PALETTE)
)
) // 3D
: ( (p_space->save_txt_with_color)
? (LASERBOY_3D_FRAME_RGB)
: ( (palette_index == LASERBOY_TRUE_COLOR)
? (LASERBOY_3D_FRAME_TABLE)
: (LASERBOY_3D_FRAME_PALETTE)
)
)
);
//------------------------------------------------------------------------
if(frame_index >= 0)
out << "# " << setw(6) << frame_index << " ---------------------------------------------------------" << ENDL;
out << "frame ";
//------------------------------------------------------------------------
switch(output_format)
{
case LASERBOY_2D_FRAME_RGB:
case LASERBOY_2D_FRAME_TABLE:
case LASERBOY_2D_FRAME_PALETTE:
out << "xy ";
break;
case LASERBOY_3D_FRAME_RGB:
case LASERBOY_3D_FRAME_TABLE:
case LASERBOY_3D_FRAME_PALETTE:
out << "xyz ";
break;
}
//------------------------------------------------------------------------
switch(output_format)
{
case LASERBOY_2D_FRAME_RGB:
case LASERBOY_3D_FRAME_RGB:
if(p_space->save_txt_color_hex)
out << "hex";
else
out << "rgb";
break;
case LASERBOY_2D_FRAME_TABLE:
case LASERBOY_3D_FRAME_TABLE:
out << "table";
break;
case LASERBOY_2D_FRAME_PALETTE:
case LASERBOY_3D_FRAME_PALETTE:
out << "palette";
break;
}
//------------------------------------------------------------------------
if(p_space->save_txt_unit)
{
out << " unit" << ENDL;
switch(output_format)
{
case LASERBOY_3D_FRAME_PALETTE:
for(size_t i = 0; i < size(); i++)
out << " "
<< showpos
<< setw(15) << left << at(i).x / (double)LASERBOY_MAX_SHORT
<< setw(15) << left << at(i).y / (double)LASERBOY_MAX_SHORT
<< setw(15) << left << at(i).z / (double)LASERBOY_MAX_SHORT
<< noshowpos
<< setw(7) << ((at(i).is_lit()) ? ((int)at(i).c) : (-1))
<< ENDL;
break;
//----------------------------------------------------------------
case LASERBOY_2D_FRAME_PALETTE:
for(size_t i = 0; i < size(); i++)
out << " "
<< showpos
<< setw(15) << left << at(i).x / (double)LASERBOY_MAX_SHORT
<< setw(15) << left << at(i).y / (double)LASERBOY_MAX_SHORT
<< noshowpos
<< setw(7) << ((at(i).is_lit()) ? ((int)at(i).c) : (-1))
<< ENDL;
break;
//----------------------------------------------------------------
case LASERBOY_3D_FRAME_TABLE: // nothing but x y z
for(size_t i = 0; i < size(); i++)
out << " "
<< showpos
<< setw(15) << left << at(i).x / (double)LASERBOY_MAX_SHORT
<< setw(15) << left << at(i).y / (double)LASERBOY_MAX_SHORT
<< setw(15) << left << at(i).z / (double)LASERBOY_MAX_SHORT
<< noshowpos
<< ENDL;
break;
//----------------------------------------------------------------
case LASERBOY_2D_FRAME_TABLE: // nothing but x y
for(size_t i = 0; i < size(); i++)
out << " "
<< showpos
<< setw(15) << left << at(i).x / (double)LASERBOY_MAX_SHORT
<< setw(15) << left << at(i).y / (double)LASERBOY_MAX_SHORT
<< noshowpos
<< ENDL;
break;
//----------------------------------------------------------------
case LASERBOY_3D_FRAME_RGB:
for(size_t i = 0; i < size(); i++)
{
out << " "
<< showpos
<< setw(15) << left << at(i).x / (double)LASERBOY_MAX_SHORT
<< setw(15) << left << at(i).y / (double)LASERBOY_MAX_SHORT
<< setw(15) << left << at(i).z / (double)LASERBOY_MAX_SHORT
<< noshowpos;
if(p_space->save_txt_color_hex)
{
if(at(i).is_lit())
out << " 0x"
<< hex
<< setw(6)
<< right
<< setfill('0')
<< at(i).as_uint()
<< dec
<< left
<< setfill(' ');
else
out << " -1";
}
else
{
if(at(i).is_lit())
out << setw(7) << (int)at(i).r
<< setw(7) << (int)at(i).g
<< setw(7) << (int)at(i).b;
else
out << " -1";
}
out << ENDL;
}
break;
//----------------------------------------------------------------
case LASERBOY_2D_FRAME_RGB:
for(size_t i = 0; i < size(); i++)
{
out << " "
<< showpos
<< setw(15) << left << at(i).x / (double)LASERBOY_MAX_SHORT
<< setw(15) << left << at(i).y / (double)LASERBOY_MAX_SHORT
<< noshowpos;
if(p_space->save_txt_color_hex)
{
if(at(i).is_lit())
out << " 0x"
<< hex
<< setw(6)
<< right
<< setfill('0')
<< at(i).as_uint()
<< dec
<< left
<< setfill(' ');
else
out << " -1";
}
else
{
if(at(i).is_lit())
out << setw(7) << (int)at(i).r
<< setw(7) << (int)at(i).g
<< setw(7) << (int)at(i).b;
else
out << " -1";
}
out << ENDL;
}
break;
} //----------------------------------------------------------------
}
else
{
out << " short" << ENDL;
switch(output_format)
{
case LASERBOY_3D_FRAME_PALETTE:
for(size_t i = 0; i < size(); i++)
out << setw(9) << at(i).x
<< setw(9) << at(i).y
<< setw(9) << at(i).z
<< setw(7) << ((at(i).is_lit()) ? ((int)at(i).c) : (-1))
<< ENDL;
break;
//----------------------------------------------------------------
case LASERBOY_2D_FRAME_PALETTE:
for(size_t i = 0; i < size(); i++)
out << setw(9) << at(i).x
<< setw(9) << at(i).y
<< setw(7) << ((at(i).is_lit()) ? ((int)at(i).c) : (-1))
<< ENDL;
break;
//----------------------------------------------------------------
case LASERBOY_3D_FRAME_TABLE:
for(size_t i = 0; i < size(); i++)
out << setw(9) << at(i).x
<< setw(9) << at(i).y
<< setw(9) << at(i).z
<< ENDL;
break;
//----------------------------------------------------------------
case LASERBOY_2D_FRAME_TABLE:
for(size_t i = 0; i < size(); i++)
out << setw(9) << at(i).x
<< setw(9) << at(i).y
<< ENDL;
break;
//----------------------------------------------------------------
case LASERBOY_3D_FRAME_RGB:
for(size_t i = 0; i < size(); i++)
{
out << dec
<< setw(9) << at(i).x
<< setw(9) << at(i).y
<< setw(9) << at(i).z;
if(p_space->save_txt_color_hex)
{
if(at(i).is_lit())
out << " 0x"
<< hex
<< setw(6)
<< right
<< setfill('0')
<< at(i).as_uint()
<< dec
<< left
<< setfill(' ');
else
out << " -1";
}
else
{
if(at(i).is_lit())
out << setw(7) << (int)at(i).r
<< setw(7) << (int)at(i).g
<< setw(7) << (int)at(i).b;
else
out << " -1";
}
out << ENDL;
}
break;
//----------------------------------------------------------------
case LASERBOY_2D_FRAME_RGB:
for(size_t i = 0; i < size(); i++)
{
out << dec
<< setw(9) << at(i).x
<< setw(9) << at(i).y;
if(p_space->save_txt_color_hex)
{
if(at(i).is_lit())
out << " 0x"
<< hex
<< setw(6)
<< right
<< setfill('0')
<< at(i).as_uint()
<< dec
<< left
<< setfill(' ');
else
out << " -1";
}
else
{
if(at(i).is_lit())
out << setw(7) << (int)at(i).r
<< setw(7) << (int)at(i).g
<< setw(7) << (int)at(i).b;
else
out << " -1";
}
out << ENDL;
}
break;
} //----------------------------------------------------------------
}
out << ENDL;
//------------------------------------------------------------------------
return;
}
//############################################################################
void LaserBoy_frame::render(int skin, struct LaserBoy_bmp *bmp) const
{
LaserBoy_3D_double _0,
_1;
LaserBoy_color lb_color;
bool rotate_view = (p_space->view_angle != 0.0),
offset_view = (p_space->view_offset != 0 ),
scale_view = (p_space->view_scale != 1.0);
u_int i,
bmp_color,
bmp_blank = bmp->make_rgb(p_space->rendered_blank.r,
p_space->rendered_blank.g,
p_space->rendered_blank.b
),
bmp_black = bmp->make_rgb(p_space->rendered_black.r,
p_space->rendered_black.g,
p_space->rendered_black.b
),
bmp_white = bmp->white,
bmp_bg_color = bmp->make_rgb(p_space->bg_color.r,
p_space->bg_color.g,
p_space->bg_color.b
);
int xx,
yy,
bmp_center = ( (p_space->show_quad_view)
? (bmp->yres / 4)
: (bmp->yres / 2)
),
bmp_3X_center = bmp_center * 3,
bigger = ( ((p_space->show_bridge) ? (bridge.size()) : (0))
> ((p_space->show_coda) ? (coda.size()) : (0))
)
? ((p_space->show_bridge) ? (bridge.size()) : (0))
: ((p_space->show_coda) ? (coda.size()) : (0));
double fade,
deep = LASERBOY_SHORT_SPAN,
half_deep = deep / 2.0,
z_depth_scale = deep
/ ( size()
+ ((p_space->show_intro) ? (intro.size()) : (0))
+ bigger
),
z_depth_body_offset = half_deep
- ( z_depth_scale
* ((p_space->show_intro) ? (intro.size()) : (0))
),
z_depth_coda_offset = half_deep
- ( (z_depth_scale * ((p_space->show_intro) ? (intro.size()) : (0)))
+ (z_depth_scale * size())
),
scale = ( (p_space->show_quad_view)
? (bmp->yres / (deep * 2.0))
: (bmp->yres / deep)
);
//------------------------------------------------------------------------
if(skin)
{
fade = p_space->onion_skin_fade + (skin - 1) * (p_space->onion_skin_fade / 10);
if(fade > 1.0)
fade = 1.0;
lb_color = p_space->rendered_blank;
lb_color = lb_color.blend(bmp_bg_color, fade);
bmp_blank = bmp->make_rgb(lb_color.r,
lb_color.g,
lb_color.b
);
lb_color = p_space->rendered_black;
lb_color = lb_color.blend(bmp_bg_color, fade);
bmp_black = bmp->make_rgb(lb_color.r,
lb_color.g,
lb_color.b
);
lb_color = bmp->white;
lb_color = lb_color.blend(bmp_bg_color, fade);
bmp_white = bmp->make_rgb(lb_color.r,
lb_color.g,
lb_color.b
);
}
//------------------------------------------------------------------------
//------------------------------------------------------------------------
// ACTUAL VECTOR ART !!!
//------------------------------------------------------------------------
//------------------------------------------------------------------------
// blank vectors
//------------------------------------------------------------------------
if( p_space->show_blanking
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
//----------------------------------------------------------------
// blank in intro
//----------------------------------------------------------------
if(p_space->show_intro)
{
for(i = 1; i < intro.size(); i++)
{
if(intro.at(i).is_blank())
{
_0 = intro.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = intro.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - half_deep;
_1.z = i * z_depth_scale - half_deep;
}
if(rotate_view)
{
_0 = rotate_vertex(_0, p_space->view_angle);
_1 = rotate_vertex(_1, p_space->view_angle);
}
if(offset_view)
{
_0 += p_space->view_offset;
_1 += p_space->view_offset;
}
if(scale_view)
{
_0 *= p_space->view_scale;
_1 *= p_space->view_scale;
}
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.y * scale) + bmp_center;
//--------------------------------------------------------
// normal view
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_blank, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
}
//--------------------------------------------------------
if(p_space->show_quad_view)
{
_0 = intro.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = intro.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - half_deep;
_1.z = i * z_depth_scale - half_deep;
}
//----------------------------------------------------
// front
xx = (int)(_1.x * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_blank, p_space->rendered_line_width);
//----------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//----------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
}
//----------------------------------------------------
// top
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.z * -scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.z * -scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_blank, p_space->rendered_line_width);
//----------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//----------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) + (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) - (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
}
//----------------------------------------------------
// side
xx = (int)(_1.z * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.z * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_blank, p_space->rendered_line_width);
//----------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//----------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) + (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) - (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
}
} // end if(p_space->show_quad_view)
} // end if(intro.at(i).is_blank())
} // end for(i = 1; i < (int)intro.size(); i++)
} // end if(p_space->show_intro)
//----------------------------------------------------------------
// blank in frame
//----------------------------------------------------------------
for(i = 1; i < size(); i++)
{
if(at(i).is_blank())
{
_0 = at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_body_offset;
_1.z = i * z_depth_scale - z_depth_body_offset;
}
if(rotate_view)
{
_0 = rotate_vertex(_0, p_space->view_angle);
_1 = rotate_vertex(_1, p_space->view_angle);
}
if(offset_view)
{
_0 += p_space->view_offset;
_1 += p_space->view_offset;
}
if(scale_view)
{
_0 *= p_space->view_scale;
_1 *= p_space->view_scale;
}
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.y * scale) + bmp_center;
//--------------------------------------------------------
// normal view
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_blank, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
}
//------------------------------------------------------------
if( p_space->show_cursors
&& is_index_selected(i)
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_select(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_indices
&& (skin == 0)
)
bmp_printf(bmp,
xx,
bmp->yres - yy,
bmp_blank,
bmp_bg_color,
0,
p_space->font_size_factor,
"%d",
i
);
//------------------------------------------------------------
if(p_space->show_quad_view)
{
_0 = at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_body_offset;
_1.z = i * z_depth_scale - z_depth_body_offset;
}
//--------------------------------------------------------
// front
xx = (int)(_1.x * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_blank, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
}
//--------------------------------------------------------
if( p_space->show_cursors
&& is_index_selected(i)
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_select(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_indices
&& (skin == 0)
)
bmp_printf(bmp,
xx,
bmp->yres - yy,
bmp_blank,
bmp_bg_color,
0,
p_space->font_size_factor,
"%d",
i
);
//--------------------------------------------------------
// top
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.z * -scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.z * -scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_blank, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) + (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) - (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
}
//--------------------------------------------------------
if( p_space->show_cursors
&& is_index_selected(i)
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_select(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_indices
&& (skin == 0)
)
bmp_printf(bmp,
xx,
bmp->yres - yy,
bmp_blank,
bmp_bg_color,
0,
p_space->font_size_factor,
"%d",
i
);
//--------------------------------------------------------
// side
xx = (int)(_1.z * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.z * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_blank, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) + (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) - (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
}
//--------------------------------------------------------
if( p_space->show_cursors
&& is_index_selected(i)
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_select(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_indices
&& (skin == 0)
)
bmp_printf(bmp,
xx,
bmp->yres - yy,
bmp_blank,
bmp_bg_color,
0,
p_space->font_size_factor,
"%d",
i
);
} // end if(p_space->show_quad_view)
} // end if(at(i).is_blank())
} // end for(i = 1; i < size(); i++)
//----------------------------------------------------------------
// blank in bridge
//----------------------------------------------------------------
if(p_space->show_bridge)
for(i = 1; i < bridge.size(); i++)
{
if(bridge.at(i).is_blank())
{
_0 = bridge.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = bridge.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_coda_offset;
_1.z = i * z_depth_scale - z_depth_coda_offset;
}
if(rotate_view)
{
_0 = rotate_vertex(_0, p_space->view_angle);
_1 = rotate_vertex(_1, p_space->view_angle);
}
if(offset_view)
{
_0 += p_space->view_offset;
_1 += p_space->view_offset;
}
if(scale_view)
{
_0 *= p_space->view_scale;
_1 *= p_space->view_scale;
}
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.y * scale) + bmp_center;
//--------------------------------------------------------
// normal view
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_blank, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
}
//--------------------------------------------------------
if(p_space->show_quad_view)
{
_0 = bridge.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = bridge.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_coda_offset;
_1.z = i * z_depth_scale - z_depth_coda_offset;
}
//----------------------------------------------------
// front
xx = (int)(_1.x * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_blank, p_space->rendered_line_width);
//----------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//----------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
}
//----------------------------------------------------
// top
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.z * -scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.z * -scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_blank, p_space->rendered_line_width);
//----------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//----------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) + (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) - (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
}
//----------------------------------------------------
// side
xx = (int)(_1.z * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.z * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_blank, p_space->rendered_line_width);
//----------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//----------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) + (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) - (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
}
} // end if(p_space->show_quad_view)
} // if(bridge.at(i).is_blank())
} // end for(i = 1; i < (int)bridge.size(); i++)
//----------------------------------------------------------------
// blank in coda
//----------------------------------------------------------------
if(p_space->show_coda)
for(i = 1; i < coda.size(); i++)
{
if(coda.at(i).is_blank())
{
_0 = coda.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = coda.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_coda_offset;
_1.z = i * z_depth_scale - z_depth_coda_offset;
}
if(rotate_view)
{
_0 = rotate_vertex(_0, p_space->view_angle);
_1 = rotate_vertex(_1, p_space->view_angle);
}
if(offset_view)
{
_0 += p_space->view_offset;
_1 += p_space->view_offset;
}
if(scale_view)
{
_0 *= p_space->view_scale;
_1 *= p_space->view_scale;
}
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.y * scale) + bmp_center;
//--------------------------------------------------------
// normal view
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_blank, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
}
//--------------------------------------------------------
if(p_space->show_quad_view)
{
_0 = coda.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = coda.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_coda_offset;
_1.z = i * z_depth_scale - z_depth_coda_offset;
}
//----------------------------------------------------
// front
xx = (int)(_1.x * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_blank, p_space->rendered_line_width);
//----------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//----------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
}
//----------------------------------------------------
// top
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.z * -scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.z * -scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_blank, p_space->rendered_line_width);
//----------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//----------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) + (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) - (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
}
//----------------------------------------------------
// side
xx = (int)(_1.z * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.z * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_blank, p_space->rendered_line_width);
//----------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_blank,
p_space->rendered_line_width
);
//----------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) + (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) - (pi / 8),
bmp_blank,
p_space->rendered_line_width
);
}
} // end if(p_space->show_quad_view)
} // end if(coda.at(i).is_blank())
} // end for(i = 1; i < (int)coda.size(); i++)
} // end if(p_space->show_blanking)
//------------------------------------------------------------------------
// black vectors
//------------------------------------------------------------------------
if(p_space->show_intro)
{
//----------------------------------------------------------------
// black in intro
//----------------------------------------------------------------
for(i = 1; i < intro.size(); i++)
{
if(intro.at(i).is_black(p_space->black_level))
{
_0 = intro.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = intro.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - half_deep;
_1.z = i * z_depth_scale - half_deep;
}
if(rotate_view)
{
_0 = rotate_vertex(_0, p_space->view_angle);
_1 = rotate_vertex(_1, p_space->view_angle);
}
if(offset_view)
{
_0 += p_space->view_offset;
_1 += p_space->view_offset;
}
if(scale_view)
{
_0 *= p_space->view_scale;
_1 *= p_space->view_scale;
}
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.y * scale) + bmp_center;
//------------------------------------------------------------
// normal view
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_black, p_space->rendered_line_width);
//------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_black,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_black,
p_space->rendered_line_width
);
}
//------------------------------------------------------------
if(p_space->show_quad_view)
{
_0 = intro.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = intro.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - half_deep;
_1.z = i * z_depth_scale - half_deep;
}
//--------------------------------------------------------
// front
xx = (int)(_1.x * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_black, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_black,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_black,
p_space->rendered_line_width
);
}
//--------------------------------------------------------
// top
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.z * -scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.z * -scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_black, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) + (pi / 8),
bmp_black,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) - (pi / 8),
bmp_black,
p_space->rendered_line_width
);
}
//--------------------------------------------------------
// side
xx = (int)(_1.z * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.z * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_black, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) + (pi / 8),
bmp_black,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) - (pi / 8),
bmp_black,
p_space->rendered_line_width
);
}
} // end if(p_space->show_quad_view)
} // if(intro.at(i).is_black(p_space->black_level))
} // end for(i = 1; i < (int)intro.size(); i++)
} // end if(p_space->show_intro)
//------------------------------------------------------------------------
// black in frame
//------------------------------------------------------------------------
for(i = 1; i < size(); i++)
{
if(at(i).is_black(p_space->black_level))
{
_0 = at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_body_offset;
_1.z = i * z_depth_scale - z_depth_body_offset;
}
if(rotate_view)
{
_0 = rotate_vertex(_0, p_space->view_angle);
_1 = rotate_vertex(_1, p_space->view_angle);
}
if(offset_view)
{
_0 += p_space->view_offset;
_1 += p_space->view_offset;
}
if(scale_view)
{
_0 *= p_space->view_scale;
_1 *= p_space->view_scale;
}
// normal view
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.y * scale) + bmp_center;
//----------------------------------------------------------------
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_black, p_space->rendered_line_width);
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//----------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_black,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_black,
p_space->rendered_line_width
);
}
//----------------------------------------------------------------
if( p_space->show_cursors
&& is_index_selected(i)
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_select(bmp,
xx,
bmp->yres - yy,
bmp_white,
p_space->rendered_line_width
);
//----------------------------------------------------------------
if( p_space->show_indices
&& (skin == 0)
)
bmp_printf(bmp,
xx,
bmp->yres - yy,
bmp_white,
bmp_bg_color,
0,
p_space->font_size_factor,
"%d",
i
);
//----------------------------------------------------------------
if(p_space->show_quad_view)
{
_0 = at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_body_offset;
_1.z = i * z_depth_scale - z_depth_body_offset;
}
// front
xx = (int)(_1.x * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_3X_center;
bmp_color = bmp->make_rgb(p_space->rendered_black.r,
p_space->rendered_black.g,
p_space->rendered_black.b
);
//----------------------------------------------------------------
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_black, p_space->rendered_line_width);
//----------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//----------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_black,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_black,
p_space->rendered_line_width
);
}
//----------------------------------------------------------------
if( p_space->show_cursors
&& is_index_selected(i)
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_select(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//----------------------------------------------------------------
if( p_space->show_indices
&& (skin == 0)
)
bmp_printf(bmp,
xx,
bmp->yres - yy,
bmp_white,
bmp_bg_color,
0,
p_space->font_size_factor,
"%d",
i
);
//----------------------------------------------------------------
// top
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.z * -scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.z * -scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_black, p_space->rendered_line_width);
//----------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//----------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) + (pi / 8),
bmp_black,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) - (pi / 8),
bmp_black,
p_space->rendered_line_width
);
}
//----------------------------------------------------------------
if( p_space->show_cursors
&& is_index_selected(i)
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_select(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//----------------------------------------------------------------
if( p_space->show_indices
&& (skin == 0)
)
bmp_printf(bmp,
xx,
bmp->yres - yy,
bmp_white,
bmp_bg_color,
0,
p_space->font_size_factor,
"%d",
i
);
//----------------------------------------------------------------
// side
xx = (int)(_1.z * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.z * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_black, p_space->rendered_line_width);
//----------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//----------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) + (pi / 8),
bmp_black,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) - (pi / 8),
bmp_black,
p_space->rendered_line_width
);
}
//----------------------------------------------------------------
if( p_space->show_cursors
&& is_index_selected(i)
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_select(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//----------------------------------------------------------------
if( p_space->show_indices
&& (skin == 0)
)
bmp_printf(bmp,
xx,
bmp->yres - yy,
bmp_white,
bmp_bg_color,
0,
p_space->font_size_factor,
"%d",
i
);
}
} // if(at(i).is_black(p_space->black_level))
} // end for(i = 1; i < size(); i++)
//------------------------------------------------------------------------
// black in bridge
//------------------------------------------------------------------------
if(p_space->show_bridge)
{
for(i = 1; i < bridge.size(); i++)
{
if(bridge.at(i).is_black(p_space->black_level))
{
_0 = bridge.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = bridge.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_coda_offset;
_1.z = i * z_depth_scale - z_depth_coda_offset;
}
if(rotate_view)
{
_0 = rotate_vertex(_0, p_space->view_angle);
_1 = rotate_vertex(_1, p_space->view_angle);
}
if(offset_view)
{
_0 += p_space->view_offset;
_1 += p_space->view_offset;
}
if(scale_view)
{
_0 *= p_space->view_scale;
_1 *= p_space->view_scale;
}
//------------------------------------------------------------
// normal view
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.y * scale) + bmp_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_black, p_space->rendered_line_width);
//------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//----------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_black,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_black,
p_space->rendered_line_width
);
}
//------------------------------------------------------------
if(p_space->show_quad_view)
{
_0 = bridge.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = bridge.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_coda_offset;
_1.z = i * z_depth_scale - z_depth_coda_offset;
}
//------------------------------------------------------------
// front
xx = (int)(_1.x * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_black, p_space->rendered_line_width);
//------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_black,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_black,
p_space->rendered_line_width
);
}
//------------------------------------------------------------
// top
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.z * -scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.z * -scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_black, p_space->rendered_line_width);
//------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) + (pi / 8),
bmp_black,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) - (pi / 8),
bmp_black,
p_space->rendered_line_width
);
}
//------------------------------------------------------------
// side
xx = (int)(_1.z * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.z * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_black, p_space->rendered_line_width);
//------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) + (pi / 8),
bmp_black,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) - (pi / 8),
bmp_black,
p_space->rendered_line_width
);
}
} // end if(p_space->show_quad_view)
} // if(bridge.at(i).is_black(p_space->black_level))
} // end for(i = 1; i < (int)bridge.size(); i++)
} // end if(p_space->show_bridge)
//------------------------------------------------------------------------
// black in coda
//------------------------------------------------------------------------
if(p_space->show_coda)
{
for(i = 1; i < coda.size(); i++)
{
if(coda.at(i).is_black(p_space->black_level))
{
_0 = coda.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = coda.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_coda_offset;
_1.z = i * z_depth_scale - z_depth_coda_offset;
}
if(rotate_view)
{
_0 = rotate_vertex(_0, p_space->view_angle);
_1 = rotate_vertex(_1, p_space->view_angle);
}
if(offset_view)
{
_0 += p_space->view_offset;
_1 += p_space->view_offset;
}
if(scale_view)
{
_0 *= p_space->view_scale;
_1 *= p_space->view_scale;
}
//----------------------------------------------------------------
// normal view
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.y * scale) + bmp_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_black, p_space->rendered_line_width);
//----------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//----------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_black,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_black,
p_space->rendered_line_width
);
}
//------------------------------------------------------------
if(p_space->show_quad_view)
{
_0 = coda.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = coda.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_coda_offset;
_1.z = i * z_depth_scale - z_depth_coda_offset;
}
//------------------------------------------------------------
// front
xx = (int)(_1.x * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_black, p_space->rendered_line_width);
//------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_black,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_black,
p_space->rendered_line_width
);
}
//------------------------------------------------------------
// top
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.z * -scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.z * -scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_black, p_space->rendered_line_width);
//------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) + (pi / 8),
bmp_black,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) - (pi / 8),
bmp_black,
p_space->rendered_line_width
);
}
//------------------------------------------------------------
// side
xx = (int)(_1.z * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.z * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_black, p_space->rendered_line_width);
//------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_black,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) + (pi / 8),
bmp_black,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) - (pi / 8),
bmp_black,
p_space->rendered_line_width
);
}
} // end if(p_space->show_quad_view)
} // if(coda.at(i).is_black(p_space->black_level))
} // end for(i = 1; i < (int)coda.size(); i++)
} // end if(p_space->show_coda)
//------------------------------------------------------------------------
//------------------------------------------------------------------------
// color vectors
//------------------------------------------------------------------------
//------------------------------------------------------------------------
// color in intro
//------------------------------------------------------------------------
if(p_space->show_intro)
{
for(i = 1; i < intro.size(); i++)
{
if(intro.at(i).is_color(p_space->black_level))
{
_0 = intro.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = intro.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - half_deep;
_1.z = i * z_depth_scale - half_deep;
}
if(rotate_view)
{
_0 = rotate_vertex(_0, p_space->view_angle);
_1 = rotate_vertex(_1, p_space->view_angle);
}
if(offset_view)
{
_0 += p_space->view_offset;
_1 += p_space->view_offset;
}
if(scale_view)
{
_0 *= p_space->view_scale;
_1 *= p_space->view_scale;
}
//------------------------------------------------------------
// normal view
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.y * scale) + bmp_center;
bmp_color = bmp->make_rgb(intro.at(i).bit_masked_color(p_space->signal_bit_mask).r,
intro.at(i).bit_masked_color(p_space->signal_bit_mask).g,
intro.at(i).bit_masked_color(p_space->signal_bit_mask).b
);
if(skin)
{
fade = p_space->onion_skin_fade + (skin - 1) * (p_space->onion_skin_fade / 10);
if(fade > 1.0)
fade = 1.0;
lb_color = intro.at(i).bit_masked_color(p_space->signal_bit_mask);
lb_color = lb_color.blend(bmp_bg_color, fade);
bmp_color = bmp->make_rgb(lb_color.r,
lb_color.g,
lb_color.b
);
}
//------------------------------------------------------------
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_color, p_space->rendered_line_width);
//------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_color,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_color,
p_space->rendered_line_width
);
}
//------------------------------------------------------------
if(p_space->show_quad_view)
{
_0 = intro.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = intro.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - half_deep;
_1.z = i * z_depth_scale - half_deep;
}
//--------------------------------------------------------
// front
xx = (int)(_1.x * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_color, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_color,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_color,
p_space->rendered_line_width
);
}
//--------------------------------------------------------
// top
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.z * -scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.z * -scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_color, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) + (pi / 8),
bmp_color,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) - (pi / 8),
bmp_color,
p_space->rendered_line_width
);
}
//--------------------------------------------------------
// side
xx = (int)(_1.z * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.z * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_color, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) + (pi / 8),
bmp_color,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) - (pi / 8),
bmp_color,
p_space->rendered_line_width
);
}
//--------------------------------------------------------
} // end if(p_space->show_quad_view)
} // if(intro.at(i).is_color(p_space->black_level))
} // end for(i = 1; i < (int)intro.size(); i++)
} // end if(p_space->show_intro)
//------------------------------------------------------------------------
// color in frame
//------------------------------------------------------------------------
for(i = 1; i < size(); i++)
{
if(at(i).is_color(p_space->black_level))
{
_0 = at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_body_offset;
_1.z = i * z_depth_scale - z_depth_body_offset;
}
if(rotate_view)
{
_0 = rotate_vertex(_0, p_space->view_angle);
_1 = rotate_vertex(_1, p_space->view_angle);
}
if(offset_view)
{
_0 += p_space->view_offset;
_1 += p_space->view_offset;
}
if(scale_view)
{
_0 *= p_space->view_scale;
_1 *= p_space->view_scale;
}
//----------------------------------------------------------------
// normal view
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.y * scale) + bmp_center;
bmp_color = bmp->make_rgb(at(i).bit_masked_color(p_space->signal_bit_mask).r,
at(i).bit_masked_color(p_space->signal_bit_mask).g,
at(i).bit_masked_color(p_space->signal_bit_mask).b
);
if(skin)
{
fade = p_space->onion_skin_fade + (skin - 1) * (p_space->onion_skin_fade / 10);
if(fade > 1.0)
fade = 1.0;
lb_color = at(i).bit_masked_color(p_space->signal_bit_mask);
lb_color = lb_color.blend(bmp_bg_color, fade);
bmp_color = bmp->make_rgb(lb_color.r,
lb_color.g,
lb_color.b
);
}
//----------------------------------------------------------------
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_color, p_space->rendered_line_width);
//----------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//----------------------------------------------------------------
if( p_space->show_cursors
&& is_index_selected(i)
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_select(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//----------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_color,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_color,
p_space->rendered_line_width
);
}
//----------------------------------------------------------------
if( p_space->show_indices
&& (skin == 0)
)
bmp_printf(bmp,
xx,
bmp->yres - yy,
bmp_color,
bmp_bg_color,
0,
p_space->font_size_factor,
"%d",
i
);
//----------------------------------------------------------------
if(p_space->show_quad_view)
{
_0 = at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_body_offset;
_1.z = i * z_depth_scale - z_depth_body_offset;
}
//------------------------------------------------------------
// front
xx = (int)(_1.x * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_color, p_space->rendered_line_width);
//------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_color,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_color,
p_space->rendered_line_width
);
}
//------------------------------------------------------------
if( p_space->show_cursors
&& is_index_selected(i)
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_select(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_indices
&& (skin == 0)
)
bmp_printf(bmp,
xx,
bmp->yres - yy,
bmp_color,
bmp_bg_color,
0,
p_space->font_size_factor,
"%d",
i
);
//------------------------------------------------------------
// top
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.z * -scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.z * -scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_color, p_space->rendered_line_width);
//------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) + (pi / 8),
bmp_color,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) - (pi / 8),
bmp_color,
p_space->rendered_line_width
);
}
//------------------------------------------------------------
if( p_space->show_cursors
&& is_index_selected(i)
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_select(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_indices
&& (skin == 0)
)
bmp_printf(bmp,
xx,
bmp->yres - yy,
bmp_color,
bmp_bg_color,
0,
p_space->font_size_factor,
"%d",
i
);
//------------------------------------------------------------
// side
xx = (int)(_1.z * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.z * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_color, p_space->rendered_line_width);
//------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) + (pi / 8),
bmp_color,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) - (pi / 8),
bmp_color,
p_space->rendered_line_width
);
}
//------------------------------------------------------------
if( p_space->show_cursors
&& is_index_selected(i)
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_select(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_indices
&& (skin == 0)
)
bmp_printf(bmp,
xx,
bmp->yres - yy,
bmp_color,
bmp_bg_color,
0,
p_space->font_size_factor,
"%d",
i
);
} // end if(p_space->show_quad_view)
} // if(at(i).is_color(p_space->black_level))
} // end for(i = 1; i < size(); i++)
//------------------------------------------------------------------------
// color in bridge
//------------------------------------------------------------------------
if(p_space->show_bridge)
{
for(i = 1; i < bridge.size(); i++)
{
if(bridge.at(i).is_color(p_space->black_level))
{
_0 = bridge.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = bridge.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_coda_offset;
_1.z = i * z_depth_scale - z_depth_coda_offset;
}
if(rotate_view)
{
_0 = rotate_vertex(_0, p_space->view_angle);
_1 = rotate_vertex(_1, p_space->view_angle);
}
if(offset_view)
{
_0 += p_space->view_offset;
_1 += p_space->view_offset;
}
if(scale_view)
{
_0 *= p_space->view_scale;
_1 *= p_space->view_scale;
}
//------------------------------------------------------------
// normal view
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.y * scale) + bmp_center;
bmp_color = bmp->make_rgb(bridge.at(i).bit_masked_color(p_space->signal_bit_mask).r,
bridge.at(i).bit_masked_color(p_space->signal_bit_mask).g,
bridge.at(i).bit_masked_color(p_space->signal_bit_mask).b
);
if(skin)
{
fade = p_space->onion_skin_fade + (skin - 1) * (p_space->onion_skin_fade / 10);
if(fade > 1.0)
fade = 1.0;
lb_color = bridge.at(i).bit_masked_color(p_space->signal_bit_mask);
lb_color = lb_color.blend(bmp_bg_color, fade);
bmp_color = bmp->make_rgb(lb_color.r,
lb_color.g,
lb_color.b
);
}
//------------------------------------------------------------
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_color, p_space->rendered_line_width);
//------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_color,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_color,
p_space->rendered_line_width
);
}
//------------------------------------------------------------
if(p_space->show_quad_view)
{
_0 = bridge.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = bridge.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_coda_offset;
_1.z = i * z_depth_scale - z_depth_coda_offset;
}
//--------------------------------------------------------
// front
xx = (int)(_1.x * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_3X_center;
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_color,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_color,
p_space->rendered_line_width
);
}
//--------------------------------------------------------
// top
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.z * -scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.z * -scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_color, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) + (pi / 8),
bmp_color,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) - (pi / 8),
bmp_color,
p_space->rendered_line_width
);
}
//--------------------------------------------------------
// side
xx = (int)(_1.z * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.z * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_color, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) + (pi / 8),
bmp_color,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) - (pi / 8),
bmp_color,
p_space->rendered_line_width
);
}
}
} // if(bridge.at(i).is_color(p_space->black_level))
} // end for(i = 1; i < (int)bridge.size(); i++)
} // end if(p_space->show_bridge)
//------------------------------------------------------------------------
// color in coda
//------------------------------------------------------------------------
if(p_space->show_coda)
{
for(i = 1; i < coda.size(); i++)
{
if(coda.at(i).is_color(p_space->black_level))
{
_0 = coda.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = coda.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_coda_offset;
_1.z = i * z_depth_scale - z_depth_coda_offset;
}
if(rotate_view)
{
_0 = rotate_vertex(_0, p_space->view_angle);
_1 = rotate_vertex(_1, p_space->view_angle);
}
if(offset_view)
{
_0 += p_space->view_offset;
_1 += p_space->view_offset;
}
if(scale_view)
{
_0 *= p_space->view_scale;
_1 *= p_space->view_scale;
}
//------------------------------------------------------------
// normal view
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.y * scale) + bmp_center;
bmp_color = bmp->make_rgb(coda.at(i).bit_masked_color(p_space->signal_bit_mask).r,
coda.at(i).bit_masked_color(p_space->signal_bit_mask).g,
coda.at(i).bit_masked_color(p_space->signal_bit_mask).b
);
if(skin)
{
fade = p_space->onion_skin_fade + (skin - 1) * (p_space->onion_skin_fade / 10);
if(fade > 1.0)
fade = 1.0;
lb_color = coda.at(i).bit_masked_color(p_space->signal_bit_mask);
lb_color = lb_color.blend(bmp_bg_color, fade);
bmp_color = bmp->make_rgb(lb_color.r,
lb_color.g,
lb_color.b
);
}
//------------------------------------------------------------
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_color, p_space->rendered_line_width);
//------------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//------------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_color,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_color,
p_space->rendered_line_width
);
}
//------------------------------------------------------------
if(p_space->show_quad_view)
{
_0 = coda.at(i - 1).bit_masked_position(p_space->signal_bit_mask);
_1 = coda.at(i ).bit_masked_position(p_space->signal_bit_mask);
if(p_space->show_Z_as_order)
{
_0.z = (i - 1) * z_depth_scale - z_depth_coda_offset;
_1.z = i * z_depth_scale - z_depth_coda_offset;
}
//--------------------------------------------------------
// front
xx = (int)(_1.x * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_color, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) + (pi / 8),
bmp_color,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - z_direction(_0, _1) - (pi / 8),
bmp_color,
p_space->rendered_line_width
);
}
//--------------------------------------------------------
// top
xx = (int)(_1.x * scale) + bmp_center;
yy = (int)(_1.z * -scale) + bmp_3X_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.x * scale) + bmp_center,
bmp->yres - ((int)(_0.z * -scale) + bmp_3X_center),
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_color, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) + (pi / 8),
bmp_color,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - y_direction(_0, _1) - (pi / 8),
bmp_color,
p_space->rendered_line_width
);
}
//--------------------------------------------------------
// side
xx = (int)(_1.z * scale) + bmp_3X_center;
yy = (int)(_1.y * scale) + bmp_center;
if(p_space->show_vectors)
bmp_put_thick_line_fast(bmp,
(int)(_0.z * scale) + bmp_3X_center,
bmp->yres - ((int)(_0.y * scale) + bmp_center),
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
else
bmp_put_thick_pixel(bmp, xx, bmp->yres - yy, bmp_color, p_space->rendered_line_width);
//--------------------------------------------------------
if( p_space->show_vertices
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
bmp_put_vertex(bmp,
xx,
bmp->yres - yy,
bmp_color,
p_space->rendered_line_width
);
//--------------------------------------------------------
if( p_space->show_direction
&& ( skin == 0
|| p_space->show_onion_visuals
)
)
{
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) + (pi / 8),
bmp_color,
p_space->rendered_line_width
);
bmp_put_thick_ray_fast(bmp,
xx,
bmp->yres - yy,
700 * scale,
pi - x_direction(_0, _1) - (pi / 8),
bmp_color,
p_space->rendered_line_width
);
}
}
} // if(coda.at(i).is_color(p_space->black_level))
} // end for(i = 1; i < (int)coda.size(); i++)
} // end if(p_space->show_coda)
//------------------------------------------------------------------------
// END ACTUAL VECTOR ART !!!
//------------------------------------------------------------------------
return;
}
//############################################################################
bool LaserBoy_frame::save_as_wav(const string& file, bool optimized, bool timed, bool clip)
{
std::fstream out(file.c_str(), ios::out | ios::binary);
//------------------------------------------------------------------------
if(out.is_open() && size() > 1)
{
LaserBoy_frame copy(*this);
LaserBoy_wav_header header;
//--------------------------------------------------------------------
if(p_space->view_angle != 0.0)
copy.rotate_around_origin();
//--------------------------------------------------------------------
p_space->set_wav_out_header(header, optimized, timed);
//--------------------------------------------------------------------
if(optimized)
{
double max_wag_microsec_was = p_space->max_wag_microsec;
LaserBoy_vertex origin;
header.to_fstream_wav(out); // take up the space!
if(clip)
p_space->max_wag_microsec = 0;
copy.optimize(0); // as a single frame
copy.add_coda(origin);
copy.coda += LaserBoy_segment(copy.coda.back(), origin);
copy.to_fstream_wav(out, header, true, timed, clip);
p_space->max_wag_microsec = max_wag_microsec_was;
}
else
{
header.to_fstream_wav(out); // take up the space!
copy.to_fstream_wav(out, header, false, timed, false);
}
//----------------------------------------------------------------
header.to_fstream_wav(out); // rewrite the header with the correct chunk sizes
//----------------------------------------------------------------
out.close();
return true;
}
if(out.is_open())
out.close();
return false;
}
//############################################################################
void LaserBoy_frame::to_fstream_wav(std::fstream& out,
LaserBoy_wav_header& header,
bool optimized,
bool timed,
bool clip
)
{
if(optimized)
{
int chill_samples = (int)ceil( p_space->sample_rate
* ( p_space->max_dwell_microsec
/ 500000.0 // make it twice the max_dwell_microsec
)
);
LaserBoy_vertex origin;
LaserBoy_segment chill;
if(chill_samples < 10)
chill_samples = 10;
for(int i = 0; i < chill_samples; i++)
chill.push_back(origin);
//----------------------------------------------------------------
p_space->p_GUI->display_state("saving frame as wav");
//----------------------------------------------------------------
if(timed) // still_frame_duration
{
int total_frame_scans = (int)ceil( (p_space->sample_rate * p_space->still_frame_duration)
/ (size() + bridge.size())
);
chill.to_fstream_wav(out, header, false, false);
intro.to_fstream_wav(out, header, false, false);
LaserBoy_segment::to_fstream_wav(out, header, is_wagged, is_wagged);
if(total_frame_scans > 1)
{
for(int frame_scan = 1; frame_scan < total_frame_scans; frame_scan++)
{
bridge.to_fstream_wav(out, header, true, (!is_wagged) && (frame_scan == 1)); // frame scan 1 is unique
LaserBoy_segment::to_fstream_wav(out, header, is_wagged && (frame_scan < (total_frame_scans - 1)), false);
p_space->p_GUI->display_progress(total_frame_scans - frame_scan);
}
coda.to_fstream_wav(out, header, false, false);
}
chill.to_fstream_wav(out, header, true, total_frame_scans == 1);
} // end if(timed)
else // single frame
{
if(clip)
{
bridge.to_fstream_wav(out, header, false, false);
LaserBoy_segment::to_fstream_wav(out, header, true, true);
}
else // with lead and tail
{
chill.to_fstream_wav(out, header, false, false);
intro.to_fstream_wav(out, header, false, false);
LaserBoy_segment::to_fstream_wav(out, header, false, false);
coda.to_fstream_wav(out, header, false, false);
chill.to_fstream_wav(out, header, true, true);
}
}
} // end if(optimized)
//------------------------------------------------------------------------
else if(timed) // no intro, bridge or coda!
{
p_space->p_GUI->display_state("saving frame as wav");
//----------------------------------------------------------------
int total_frame_scans = (int)ceil( ( p_space->sample_rate
* p_space->still_frame_duration
)
/ size()
);
LaserBoy_segment::to_fstream_wav(out, header, true, true);
for(int frame_scan = 1; frame_scan < total_frame_scans; frame_scan++)
{
LaserBoy_segment::to_fstream_wav(out, header, true, false);
p_space->p_GUI->display_progress(total_frame_scans - frame_scan);
}
} // end else if(timed)
//------------------------------------------------------------------------
else // no intro, bridge or coda!
LaserBoy_segment::to_fstream_wav(out, header, true, true);
//------------------------------------------------------------------------
return;
}
//############################################################################
bool LaserBoy_frame::save_as_dxf(const string& file) const
{
std::ofstream out(file.c_str(), ios::out);
if(out.is_open())
{
u_int segment_vector_index,
vertex_index;
LaserBoy_frame_set segments;
//----------------------------------------------------------------
if(p_space->auto_minimize)
{
LaserBoy_frame copy(*this);
copy.minimize(0);
segments = copy.explode_segments();
}
else
segments = explode_segments();
//----------------------------------------------------------------
out << " 0\n"
"SECTION\n"
" 2\n"
"ENTITIES\n";
//----------------------------------------------------------------
for(segment_vector_index = 0; segment_vector_index < segments.size(); segment_vector_index++)
{
if(segments[segment_vector_index].number_of_color_vectors() == 1)
{
if( ( segments[segment_vector_index].first_lit_anchor().as_3D_short()
| segments[segment_vector_index].first_lit_vertex().as_3D_short()
)
<= p_space->insignificant_distance
)
{
out << " 0\n"
"POINT\n";
if(p_space->save_true_color_dxf)
out << " 420\n"
<< segments[segment_vector_index].first_lit_vertex().color_of(p_space->black_level);
else
out << " 62\n"
<< p_space->
palette_picker(LASERBOY_DXF)
.best_match(segments[segment_vector_index].first_lit_vertex());
out << "\n 10\n"
<< segments[segment_vector_index].first_lit_anchor().x
<< ".00\n 20\n"
<< segments[segment_vector_index].first_lit_anchor().y
<< ".00\n 30\n"
<< segments[segment_vector_index].first_lit_anchor().z
<< ".00\n";
}
else
{
out << " 0\n"
"LINE\n";
if(p_space->save_true_color_dxf)
out << " 420\n"
<< segments[segment_vector_index].first_lit_vertex().color_of(p_space->black_level);
else
out << " 62\n"
<< p_space->
palette_picker(LASERBOY_DXF)
.best_match(segments[segment_vector_index].first_lit_vertex());
out << "\n 10\n"
<< segments[segment_vector_index].first_lit_anchor().x
<< ".00\n 20\n"
<< segments[segment_vector_index].first_lit_anchor().y
<< ".00\n 30\n"
<< segments[segment_vector_index].first_lit_anchor().z
<< ".00\n 11\n"
<< segments[segment_vector_index].first_lit_vertex().x
<< ".00\n 21\n"
<< segments[segment_vector_index].first_lit_vertex().y
<< ".00\n 31\n"
<< segments[segment_vector_index].first_lit_vertex().z
<< ".00\n";
}
}
//----------------------------------------------------------------
else
{
out << " 0\n"
"POLYLINE\n"
" 70\n"
<< segments[segment_vector_index].is_closed_polygon()
<< "\n 10\n"
"0.00\n"
" 20\n"
"0.00\n"
" 30\n"
"0.00\n"
//---------
" 0\n"
"VERTEX\n";
if(p_space->save_true_color_dxf)
out << " 420\n"
<< segments[segment_vector_index].at(1).color_of(p_space->black_level);
else
out << " 62\n"
<< p_space->
palette_picker(LASERBOY_DXF)
.best_match(segments[segment_vector_index].at(1));
out << "\n 10\n"
<< segments[segment_vector_index].first_lit_anchor().x
<< ".00\n 20\n"
<< segments[segment_vector_index].first_lit_anchor().y
<< ".00\n 30\n"
<< segments[segment_vector_index].first_lit_anchor().z
<< ".00\n";
for(vertex_index = 1; vertex_index < segments[segment_vector_index].size() - 1; vertex_index++)
{
out << " 0\n"
<< "VERTEX\n";
if(p_space->save_true_color_dxf)
out << " 420\n"
<< segments[segment_vector_index].at(vertex_index + 1).color_of(p_space->black_level);
else
out << " 62\n"
<< p_space->
palette_picker(LASERBOY_DXF)
.best_match(segments[segment_vector_index].at(vertex_index + 1));
out << "\n 10\n"
<< segments[segment_vector_index].at(vertex_index).x
<< ".00\n 20\n"
<< segments[segment_vector_index].at(vertex_index).y
<< ".00\n 30\n"
<< segments[segment_vector_index].at(vertex_index).z
<< ".00\n";
}
out << " 0\n"
"VERTEX\n";
if(p_space->save_true_color_dxf)
out << " 420\n";
else
out << " 62\n";
out << "0\n"
" 10\n"
<< segments[segment_vector_index].at(vertex_index).x
<< ".00\n 20\n"
<< segments[segment_vector_index].at(vertex_index).y
<< ".00\n 30\n"
<< segments[segment_vector_index].at(vertex_index).z
<< ".00\n";
}
}
//----------------------------------------------------------------
out << " 0\n"
"ENDSEC\n"
" 0\n"
"EOF\n";
//----------------------------------------------------------------
out.close();
return true;
}
return false;
}
//############################################################################
bool LaserBoy_frame::save_as_bmp(const string& file) const
{
char file_name[80];
struct LaserBoy_bmp bmp_out = {0};
LaserBoy_frame copy(*this);
if(size() > 1)
{
//----------------------------------------------------------------
p_space->p_GUI->display_state("rendering bmp file " + file);
//----------------------------------------------------------------
if(copy.number_of_unique_colors() == 1)
{
bmp_init(&bmp_out, p_space->output_bmp_size, p_space->output_bmp_size, 1);
bmp_clear(&bmp_out, 1);
copy.promote_to_true_color();
copy.best_reduce_to_palette();
if(p_space->palette_picker(copy.palette_index).to_bmp_palette(&bmp_out))
{
bmp_set_palette_index(&bmp_out, 0, 255, 255, 255);
bmp_set_palette_index(&bmp_out, 1, 0, 0, 0);
}
}
else if(copy.number_of_unique_colors() <= 15)
{
bmp_init(&bmp_out, p_space->output_bmp_size, p_space->output_bmp_size, 4);
bmp_clear(&bmp_out, 15);
copy.promote_to_true_color();
copy.best_reduce_to_palette();
if(p_space->palette_picker(copy.palette_index).to_bmp_palette(&bmp_out))
return false;
}
else if(copy.number_of_unique_colors() <= 255)
{
if(copy.palette_index == LASERBOY_TRUE_COLOR)
copy.best_reduce_to_palette();
bmp_init(&bmp_out, p_space->output_bmp_size, p_space->output_bmp_size, 8);
bmp_clear(&bmp_out, 255);
p_space->palette_picker(copy.palette_index).to_bmp_palette(&bmp_out);
}
else
{
bmp_init(&bmp_out, p_space->output_bmp_size, p_space->output_bmp_size, 24);
bmp_clear(&bmp_out, 0x00000000);
}
//----------------------------------------------------------------
u_int i;
LaserBoy_3D_double _0,
_1;
int bmp_center = bmp_out.yres / 2;
double scale = bmp_out.yres / 65535.0;
//----------------------------------------------------------------
for(i = 1; i < copy.size(); i++)
{
if(copy.at(i).is_color(p_space->black_level))
{
_0 = copy.at(i - 1);
_1 = copy.at(i );
//------------------------------------------------------------
if(copy.palette_index == LASERBOY_TRUE_COLOR)
bmp_put_thick_line_fast( &bmp_out
, (int)(_0.x * scale) + bmp_center
, ((int)(_0.y * scale) + bmp_center)
, (int)(_1.x * scale) + bmp_center
, ((int)(_1.y * scale) + bmp_center)
, bmp_out.make_rgb(copy.at(i).r, copy.at(i).g, copy.at(i).b)
, p_space->rendered_line_width
);
else
bmp_put_thick_line_fast( &bmp_out
, (int)(_0.x * scale) + bmp_center
, ((int)(_0.y * scale) + bmp_center)
, (int)(_1.x * scale) + bmp_center
, ((int)(_1.y * scale) + bmp_center)
, copy.at(i).c
, p_space->rendered_line_width
);
}
}
} // end if(size() > 1)
else
{
bmp_init(&bmp_out, p_space->output_bmp_size, p_space->output_bmp_size, 1);
bmp_set_palette_index(&bmp_out, 0, 255, 255, 255);
bmp_set_palette_index(&bmp_out, 1, 0, 0, 0);
bmp_clear(&bmp_out, 1);
}
sprintf(file_name, "%s", file.c_str());
p_space->p_GUI->display_state("writing bmp file " + string(file_name));
bmp_save_as(&bmp_out, file_name);
bmp_free(&bmp_out);
return true;
}
//############################################################################
void LaserBoy_frame::dump() const
{
cout << "format = " << (int)format << ENDL;
cout << "palette = " << (int)palette_index << ENDL;
cout << "name = " << name << ENDL;
cout << "owner = " << owner << ENDL;
cout << "quantity = " << quantity << ENDL;
cout << "identity = " << identity << ENDL;
cout << "total = " << total << ENDL;
// cout << "scanner = " << (int)scanner << ENDL;
// cout << "future = " << (int)future << ENDL;
cout << ENDL << ENDL;
}
//############################################################################
//////////////////////////////////////////////////////////////////////////////
//############################################################################