diff options
author | Karl Berry <karl@freefriends.org> | 2019-10-06 17:17:34 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2019-10-06 17:17:34 +0000 |
commit | 7f9f7dad00ea5f025578c491005835740f9ffd90 (patch) | |
tree | 011a87a78042a82ea3a18f5c08e60f6a3930bf0b /Build/source/utils/asymptote/jsfile.cc | |
parent | 37d8fb68e502daabe6aa5f5ae9fb78191f275742 (diff) |
asy 2.56 sources
git-svn-id: svn://tug.org/texlive/trunk@52300 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/utils/asymptote/jsfile.cc')
-rw-r--r-- | Build/source/utils/asymptote/jsfile.cc | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/Build/source/utils/asymptote/jsfile.cc b/Build/source/utils/asymptote/jsfile.cc new file mode 100644 index 00000000000..02a1f7f9c32 --- /dev/null +++ b/Build/source/utils/asymptote/jsfile.cc @@ -0,0 +1,222 @@ +#include "jsfile.h" + +#include "settings.h" +#include "glrender.h" +#include "drawelement.h" + +#ifdef HAVE_LIBGLM + +using namespace settings; + +namespace camp { + +void jsfile::copy(string name) { + std::ifstream fin(locateFile(name).c_str()); + string s; + while(getline(fin,s)) + out << s << newl; +} + +void jsfile::open(string name) { + out.open(name); + out << "<!DOCTYPE html>" << newl << newl; + + bool absolute=getSetting<bool>("absolute"); + if(!absolute) + out << "<!-- Use the following line to include this file within another web page:" << newl + << newl + << "<object data=\"" << name <<"\" style=\"width:" + << gl::fullWidth << ";height:" << gl::fullHeight + << ";position:relative;top:0;left:0;\"></object>" << newl << newl + << "-->" << newl << newl; + + out.precision(getSetting<Int>("digits")); + copy(locateFile(WebGLheader)); + + if(getSetting<bool>("offline")) { + out << "<script>" << newl; + copy(locateFile(AsyGL)); + out << "</script>" << newl; + } else { + out << "<script type=\"text/javascript\"" << newl << "src=\"" + << getSetting<string>("asygl") << "\"></script>" << newl; + } + out << "<script type=\"text/javascript\">" << newl; + out << newl + << "canvasWidth=" << gl::fullWidth << ";" << newl + << "canvasHeight=" << gl::fullHeight << ";" << newl + << "absolute=" << std::boolalpha << absolute << ";" << newl + << newl + << "b=[" << gl::xmin << "," << gl::ymin << "," << gl::zmin << "];" + << newl + << "B=[" << gl::xmax << "," << gl::ymax << "," << gl::zmax << "];" + << newl + << "orthographic=" << gl::orthographic << ";" + << newl + << "angle=" << gl::Angle << ";" + << newl + << "Zoom0=" << gl::Zoom0 << ";" << newl + << "zoomFactor=" << getSetting<double>("zoomfactor") << ";" << newl + << "zoomPinchFactor=" << getSetting<double>("zoomPinchFactor") << ";" + << newl + << "zoomPinchCap=" << getSetting<double>("zoomPinchCap") << ";" << newl + << "zoomStep=" << getSetting<double>("zoomstep") << ";" << newl + << "shiftHoldDistance=" << getSetting<double>("shiftHoldDistance") << ";" + << newl + << "shiftWaitTime=" << getSetting<double>("shiftWaitTime") << ";" + << newl + << "vibrateTime=" << getSetting<double>("vibrateTime") << ";" + << newl + << "viewportmargin=" << gl::Margin << ";" << newl << newl + << "Lights=["; + for(size_t i=0; i < gl::nlights; ++i) { + size_t i4=4*i; + out << "new Light(" << newl + << "direction=" << gl::Lights[i] << "," << newl + << "color=[" << gl::Diffuse[i4] << "," << gl::Diffuse[i4+1] << "," + << gl::Diffuse[i4+2] << "])," << newl; + } + out << "];" << newl << newl; + out << "Background=[" << gl::Background[0] << "," << gl::Background[1] << "," + << gl::Background[2] << "," << gl::Background[3] << "];" + << newl; + + size_t nmaterials=material.size(); + out << "Materials=["; + for(size_t i=0; i < nmaterials; ++i) + out << "new Material(" << newl + << material[i] + << ")," << newl; + out << "];" << newl << newl; +} + +jsfile::~jsfile() { + size_t ncenters=drawElement::center.size(); + if(ncenters > 0) { + out << "Centers=["; + for(size_t i=0; i < ncenters; ++i) + out << newl << drawElement::center[i] << ","; + out << newl << "];" << newl; + } + copy(locateFile(WebGLfooter)); +} + +void jsfile::addColor(const prc::RGBAColour& c) +{ + out << "[" << byte(c.R) << "," << byte(c.G) << "," << byte(c.B) + << "," << byte(c.A) << "]"; +} + +void jsfile::addIndices(const uint32_t *I) +{ + out << "[" << I[0] << "," << I[1] << "," << I[2] << "]"; +} + +bool distinct(const uint32_t *I, const uint32_t *J) +{ + return I[0] != J[0] || I[1] != J[1] || I[2] != J[2]; +} + +void jsfile::addPatch(triple const* controls, size_t n, + const triple& Min, const triple& Max, + const prc::RGBAColour *c, size_t nc) +{ + out << "P.push(new BezierPatch([" << newl; + size_t last=n-1; + for(size_t i=0; i < last; ++i) + out << controls[i] << "," << newl; + out << controls[last] << newl << "]," + << drawElement::centerIndex << "," << materialIndex << "," + << Min << "," << Max; + if(c) { + out << ",[" << newl; + for(size_t i=0; i < nc; ++i) { + addColor(c[i]); + out << "," << newl; + } + out << "]"; + } + out << "));" << newl << newl; +} + +void jsfile::addCurve(const triple& z0, const triple& c0, + const triple& c1, const triple& z1, + const triple& Min, const triple& Max) +{ + out << "P.push(new BezierCurve([" << newl; + out << z0 << "," << newl + << c0 << "," << newl + << c1 << "," << newl + << z1 << newl << "]," + << drawElement::centerIndex << "," << materialIndex << "," + << Min << "," << Max << "));" << newl << newl; +} + +void jsfile::addCurve(const triple& z0, const triple& z1, + const triple& Min, const triple& Max) +{ + out << "P.push(new BezierCurve([" << newl; + out << z0 << "," << newl + << z1 << newl << "]," + << drawElement::centerIndex << "," << materialIndex << "," + << Min << "," << Max << "));" << newl << newl; +} + +void jsfile::addPixel(const triple& z0, double width, + const triple& Min, const triple& Max) +{ + out << "P.push(new Pixel(" << newl; + out << z0 << "," << width << "," << newl + << materialIndex << "," << Min << "," << Max << "));" << newl << newl; +} + +void jsfile::addMaterial(size_t index) +{ + out << "Materials.push(new Material(" << newl + << material[index] + << "));" << newl << newl; +} + +void jsfile::addTriangles(size_t nP, const triple* P, size_t nN, + const triple* N, size_t nC, const prc::RGBAColour* C, + size_t nI, const uint32_t (*PI)[3], + const uint32_t (*NI)[3], const uint32_t (*CI)[3], + const triple& Min, const triple& Max) +{ + for(size_t i=0; i < nP; ++i) + out << "Positions.push(" << P[i] << ");" << newl; + + for(size_t i=0; i < nN; ++i) + out << "Normals.push(" << N[i] << ");" << newl; + + for(size_t i=0; i < nC; ++i) { + out << "Colors.push("; + addColor(C[i]); + out << ");" << newl; + } + + for(size_t i=0; i < nI; ++i) { + out << "Indices.push(["; + const uint32_t *PIi=PI[i]; + const uint32_t *NIi=NI[i]; + bool keepNI=distinct(NIi,PIi); + bool keepCI=nC && distinct(CI[i],PIi); + addIndices(PIi); + if(keepNI || keepCI) { + out << ","; + if(keepNI) addIndices(NIi); + } + if(keepCI) { + out << ","; + addIndices(CI[i]); + } + out << "]);" << newl; + } + out << "P.push(new Triangles(" + << materialIndex << "," << newl + << Min << "," << Max << "));" << newl; + out << newl; +} + +} +#endif |