summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/glrender.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/asymptote/glrender.cc')
-rw-r--r--Build/source/utils/asymptote/glrender.cc144
1 files changed, 74 insertions, 70 deletions
diff --git a/Build/source/utils/asymptote/glrender.cc b/Build/source/utils/asymptote/glrender.cc
index 28bfdb8a472..5de13b70dfa 100644
--- a/Build/source/utils/asymptote/glrender.cc
+++ b/Build/source/utils/asymptote/glrender.cc
@@ -228,8 +228,8 @@ glm::vec4 vec4(double *v)
void setDimensions(int Width, int Height, double X, double Y)
{
double Aspect=((double) Width)/Height;
- double xshift=X/Width*lastzoom+Shift.getx()*Xfactor;
- double yshift=Y/Height*lastzoom+Shift.gety()*Yfactor;
+ double xshift=(X/Width+Shift.getx()*Xfactor)*Zoom;
+ double yshift=(Y/Height+Shift.gety()*Yfactor)*Zoom;
double Zoominv=1.0/lastzoom;
if(orthographic) {
double xsize=Xmax-Xmin;
@@ -420,6 +420,60 @@ void wait(pthread_cond_t& signal, pthread_mutex_t& lock)
}
#endif
+void initshaders()
+{
+ Nlights=nlights == 0 ? 0 : max(Nlights,nlights);
+
+ Nmaterials=max(Nmaterials,nmaterials);
+ shaderProg=glCreateProgram();
+ string vs=locateFile("shaders/vertex.glsl");
+ string fs=locateFile("shaders/fragment.glsl");
+ if(vs.empty() || fs.empty()) {
+ cerr << "GLSL shaders not found." << endl;
+ exit(-1);
+ }
+
+ std::vector<std::string> shaderParams;
+
+#if HAVE_LIBOPENIMAGEIO
+ if (getSetting<bool>("envmap")) {
+ shaderParams.push_back("ENABLE_TEXTURE");
+ envMapBuf=initHDR();
+ }
+#endif
+
+ std::vector<ShaderfileModePair> shaders;
+ shaders.push_back(ShaderfileModePair(vs.c_str(),GL_VERTEX_SHADER));
+ shaders.push_back(ShaderfileModePair(fs.c_str(),GL_FRAGMENT_SHADER));
+ if(orthographic)
+ shaderParams.push_back("ORTHOGRAPHIC");
+
+ shaderParams.push_back("WIDTH");
+ camp::pixelShader=compileAndLinkShader(shaders,Nlights,Nmaterials,
+ shaderParams);
+ shaderParams.pop_back();
+ camp::noNormalShader=compileAndLinkShader(shaders,Nlights,Nmaterials,
+ shaderParams);
+ shaderParams.push_back("NORMAL");
+ camp::materialShader=compileAndLinkShader(shaders,Nlights,Nmaterials,
+ shaderParams);
+ shaderParams.push_back("COLOR");
+ camp::colorShader=compileAndLinkShader(shaders,Nlights,Nmaterials,
+ shaderParams);
+ shaderParams.push_back("TRANSPARENT");
+ camp::transparentShader=compileAndLinkShader(shaders,Nlights,Nmaterials,
+ shaderParams);
+}
+
+void deleteshaders()
+{
+ glDeleteProgram(camp::transparentShader);
+ glDeleteProgram(camp::colorShader);
+ glDeleteProgram(camp::materialShader);
+ glDeleteProgram(camp::pixelShader);
+ glDeleteProgram(camp::noNormalShader);
+}
+
void drawscene(int Width, int Height)
{
#ifdef HAVE_PTHREAD
@@ -431,6 +485,13 @@ void drawscene(int Width, int Height)
}
#endif
+ if((nlights == 0 && Nlights > 0) || nlights > Nlights ||
+ nmaterials > Nmaterials) {
+ deleteshaders();
+ initshaders();
+ lastshader=-1;
+ }
+
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
triple m(xmin,ymin,zmin);
@@ -468,7 +529,6 @@ void Export()
glFinish();
try {
size_t ndata=3*fullWidth*fullHeight;
- unsigned border=1;
unsigned char *data=new unsigned char[ndata];
if(data) {
TRcontext *tr=trNew();
@@ -480,6 +540,7 @@ void Export()
<< fullHeight << " image" << " using tiles of size "
<< width << "x" << height << endl;
+ unsigned border=min(min(1,width/2),height/2);
trTileSize(tr,width,height,border);
trImageSize(tr,fullWidth,fullHeight);
trImageBuffer(tr,GL_RGB,GL_UNSIGNED_BYTE,data);
@@ -753,9 +814,6 @@ void display()
queueScreen=false;
}
- maxvertices=getSetting<Int>("maxvertices");
- if(maxvertices == 0) maxvertices=Maxvertices;
-
bool fps=settings::verbose > 2;
drawscene(Width,Height);
if(fps) {
@@ -841,7 +899,7 @@ void animate()
togglefitscreen();
}
update();
- }
+ } else idle();
}
void reshape(int width, int height)
@@ -1224,7 +1282,7 @@ void showCamera()
if(!orthographic)
cout << "," << endl << "angle=" << P.angle;
if(P.viewportshift != pair(0.0,0.0))
- cout << "," << endl << "viewportshift=" << P.viewportshift;
+ cout << "," << endl << "viewportshift=" << P.viewportshift*Zoom;
if(!orthographic)
cout << "," << endl << "autoadjust=false";
cout << ");" << endl;
@@ -1386,6 +1444,9 @@ void init()
glutInit(&argc,argv);
screenWidth=glutGet(GLUT_SCREEN_WIDTH);
screenHeight=glutGet(GLUT_SCREEN_HEIGHT);
+
+ maxvertices=getSetting<Int>("maxvertices");
+ if(maxvertices == 0) maxvertices=Maxvertices;
#endif
}
@@ -1428,58 +1489,6 @@ void init_osmesa()
}
#endif // HAVE_LIBOSMESA
}
-void initshader()
-{
- Nlights=max(Nlights,nlights);
- Nmaterials=max(Nmaterials,nmaterials);
- shaderProg=glCreateProgram();
- string vs=locateFile("shaders/vertex.glsl");
- string fs=locateFile("shaders/fragment.glsl");
- if(vs.empty() || fs.empty()) {
- cerr << "GLSL shaders not found." << endl;
- exit(-1);
- }
-
- std::vector<std::string> shaderParams;
-
-#if HAVE_LIBOPENIMAGEIO
- if (getSetting<bool>("envmap")) {
- shaderParams.push_back("ENABLE_TEXTURE");
- envMapBuf=initHDR();
- }
-#endif
-
- std::vector<ShaderfileModePair> shaders;
- shaders.push_back(ShaderfileModePair(vs.c_str(),GL_VERTEX_SHADER));
- shaders.push_back(ShaderfileModePair(fs.c_str(),GL_FRAGMENT_SHADER));
- if(orthographic)
- shaderParams.push_back("ORTHOGRAPHIC");
-
- shaderParams.push_back("WIDTH");
- camp::pixelShader=compileAndLinkShader(shaders,Nlights,Nmaterials,
- shaderParams);
- shaderParams.pop_back();
- camp::noNormalShader=compileAndLinkShader(shaders,Nlights,Nmaterials,
- shaderParams);
- shaderParams.push_back("NORMAL");
- camp::materialShader=compileAndLinkShader(shaders,Nlights,Nmaterials,
- shaderParams);
- shaderParams.push_back("COLOR");
- camp::colorShader=compileAndLinkShader(shaders,Nlights,Nmaterials,
- shaderParams);
- shaderParams.push_back("TRANSPARENT");
- camp::transparentShader=compileAndLinkShader(shaders,Nlights,Nmaterials,
- shaderParams);
-}
-
-void deleteshader()
-{
- glDeleteProgram(camp::transparentShader);
- glDeleteProgram(camp::colorShader);
- glDeleteProgram(camp::materialShader);
- glDeleteProgram(camp::pixelShader);
- glDeleteProgram(camp::noNormalShader);
-}
#endif /* HAVE_GL */
@@ -1511,7 +1520,7 @@ void glrender(const string& prefix, const picture *pic, const string& format,
Angle=angle*radians;
Zoom0=zoom;
Oldpid=oldpid;
- Shift=shift;
+ Shift=shift/zoom;
Margin=margin;
Background=background;
@@ -1561,7 +1570,9 @@ void glrender(const string& prefix, const picture *pic, const string& format,
#endif
static bool initialized=false;
- if(!initialized || !interact::interactive) {
+
+ if(!(initialized && (interact::interactive ||
+ getSetting<bool>("animating")))) {
antialias=getSetting<Int>("antialias") > 1;
double expand;
if(webgl)
@@ -1609,7 +1620,6 @@ void glrender(const string& prefix, const picture *pic, const string& format,
home(webgl);
setProjection();
-
if(webgl) return;
ArcballFactor=1+8.0*hypot(Margin.getx(),Margin.gety())/hypot(Width,Height);
@@ -1733,7 +1743,7 @@ void glrender(const string& prefix, const picture *pic, const string& format,
exit(-1);
}
- initshader();
+ initshaders();
}
glClearColor(Background[0],Background[1],Background[2],Background[3]);
@@ -1814,12 +1824,6 @@ string getCenterIndex(size_t const& index) {
void setUniforms(GLint shader)
{
- if(gl::nlights > gl::Nlights || nmaterials > Nmaterials) {
- gl::deleteshader();
- gl::initshader();
- gl::lastshader=-1;
- }
-
bool normal=shader != pixelShader && shader != noNormalShader;
if(shader != gl::lastshader) {