layer2/RepSphereGenerate.cpp (94 lines of code) (raw):
/*
A* -------------------------------------------------------------------
B* This file contains source code for the PyMOL computer program
C* Copyright (c) Schrodinger, LLC.
D* -------------------------------------------------------------------
E* It is unlawful to modify or remove this copyright notice.
F* -------------------------------------------------------------------
G* Please see the accompanying LICENSE file for further information.
H* -------------------------------------------------------------------
I* Additional authors of this source file include:
-*
-*
-*
Z* -------------------------------------------------------------------
*/
#include "RepSphere.h"
#include "RepSphereGenerate.h"
#include "CGO.h"
#include "Feedback.h"
#include "ShaderMgr.h"
#include "Err.h"
extern CShaderPrg *sphereARBShaderPrg;
void RepSphere_Generate_Triangles(PyMOLGlobals *G, RepSphere *I,
RenderInfo *info) {
short use_shader;
int ok = true;
int sphere_quality = SettingGet_i(G, I->R.cs->Setting, I->R.obj->Setting,
cSetting_sphere_quality);
use_shader = SettingGetGlobal_b(G, cSetting_sphere_use_shader) &&
SettingGetGlobal_b(G, cSetting_use_shaders);
// generate the CGO
if (use_shader) {
CGO *convertcgo = CGOSimplify(I->primitiveCGO, 0, sphere_quality);
CGO *convertcgo2 = nullptr;
CHECKOK(ok, convertcgo);
if (ok)
convertcgo2 = CGOCombineBeginEnd(convertcgo, 0);
CHECKOK(ok, convertcgo2);
if (ok){
I->renderCGO = CGOOptimizeToVBONotIndexed(convertcgo2, 0);
I->renderCGO->use_shader = use_shader;
}
CGOFree(convertcgo2);
CGOFree(convertcgo);
} else {
I->renderCGO = I->primitiveCGO;
}
CHECKOK(ok, I->renderCGO);
if (!ok) {
CGOFree(I->renderCGO);
I->R.fInvalidate(&I->R, I->R.cs, cRepInvPurge);
I->R.cs->Active[cRepSphere] = false;
} else {
I->renderCGO->sphere_quality = sphere_quality;
}
}
void RepSphere_Generate_Impostor_Spheres(PyMOLGlobals *G, RepSphere *I,
RenderInfo *info) {
if (!I->renderCGO) {
CGO *convertcgo = NULL;
convertcgo = CGOOptimizeSpheresToVBONonIndexed(I->primitiveCGO, 0, true);
if (convertcgo) {
I->renderCGO = convertcgo;
I->renderCGO->use_shader = true;
}
}
}
#ifdef _PYMOL_ARB_SHADERS
void RepSphere_Generate_ARB_Spheres(PyMOLGlobals *G, RepSphere *I,
RenderInfo *info) {
float fog_info[3];
RenderSphereComputeFog(G, info, fog_info);
if (Feedback(G, FB_OpenGL, FB_Debugging))
PyMOLCheckOpenGLErr("before shader");
G->ShaderMgr->Enable_SphereShaderARB();
CGORenderSpheresARB(info, I->primitiveCGO, fog_info);
sphereARBShaderPrg->DisableARB();
if (Feedback(G, FB_OpenGL, FB_Debugging)) PyMOLCheckOpenGLErr("after shader");
}
#endif
/* simple, default point width points -- modes 1 or 6 */
void RepSphere_Generate_Point_Sprites(PyMOLGlobals *G, RepSphere *I,
RenderInfo *info, int sphere_mode) {
short use_shader;
use_shader = SettingGetGlobal_b(G, cSetting_sphere_use_shader) &
SettingGetGlobal_b(G, cSetting_use_shaders);
CGO *pointCGO = CGOConvertSpheresToPoints(I->primitiveCGO);
// generate the CGO
if (use_shader) {
CGO *convertcgo = CGOCombineBeginEnd(pointCGO, 0);
I->renderCGO = CGOOptimizeToVBONotIndexed(convertcgo, 0);
CGOFree(convertcgo);
CGO *newcgo = CGONew(G);
CGOSpecialWithArg(newcgo, SPHERE_MODE_OPS, sphere_mode);
CGOAppendNoStop(newcgo, I->renderCGO);
CGOSpecialWithArg(newcgo, SPHERE_MODE_OPS, -sphere_mode);
CGOStop(newcgo);
CGOFreeWithoutVBOs(I->renderCGO);
I->renderCGO = newcgo;
I->renderCGO->use_shader = true;
CGOFree(pointCGO);
} else {
CGO *newcgo = CGONew(G);
CGOSpecialWithArg(newcgo, SPHERE_MODE_OPS, sphere_mode);
CGOAppendNoStop(newcgo, pointCGO);
CGOSpecialWithArg(newcgo, SPHERE_MODE_OPS, -sphere_mode);
CGOStop(newcgo);
I->renderCGO = newcgo;
CGOFree(pointCGO);
}
return;
}