ObjectMap.cpp (pymol-v2.1.0.tar.bz2) | : | ObjectMap.cpp (pymol-open-source-2.2.0) | ||
---|---|---|---|---|
skipping to change at line 1787 | skipping to change at line 1787 | |||
{ | { | |||
ObjectStatePurge(&I->State); | ObjectStatePurge(&I->State); | |||
if(I->Field) { | if(I->Field) { | |||
IsosurfFieldFree(G, I->Field); | IsosurfFieldFree(G, I->Field); | |||
I->Field = NULL; | I->Field = NULL; | |||
} | } | |||
FreeP(I->Origin); | FreeP(I->Origin); | |||
FreeP(I->Dim); | FreeP(I->Dim); | |||
FreeP(I->Range); | FreeP(I->Range); | |||
FreeP(I->Grid); | FreeP(I->Grid); | |||
CGOFree(I->shaderCGO); | ||||
if(I->Symmetry) { | if(I->Symmetry) { | |||
SymmetryFree(I->Symmetry); | SymmetryFree(I->Symmetry); | |||
I->Symmetry = NULL; | I->Symmetry = NULL; | |||
} | } | |||
I->Active = false; | I->Active = false; | |||
} | } | |||
static void ObjectMapFree(ObjectMap * I) | static void ObjectMapFree(ObjectMap * I) | |||
skipping to change at line 1828 | skipping to change at line 1829 | |||
static void ObjectMapInvalidate(ObjectMap * I, int rep, int level, int state) | static void ObjectMapInvalidate(ObjectMap * I, int rep, int level, int state) | |||
{ | { | |||
if(level >= cRepInvExtents) { | if(level >= cRepInvExtents) { | |||
I->Obj.ExtentFlag = false; | I->Obj.ExtentFlag = false; | |||
} | } | |||
if((rep < 0) || (rep == cRepDot)) { | if((rep < 0) || (rep == cRepDot)) { | |||
int a; | int a; | |||
for(a = 0; a < I->NState; a++) { | for(a = 0; a < I->NState; a++) { | |||
if(I->State[a].Active) | if(I->State[a].Active) | |||
I->State[a].have_range = false; | I->State[a].have_range = false; | |||
CGOFree(I->State[a].shaderCGO); | ||||
} | } | |||
} | } | |||
SceneInvalidate(I->Obj.G); | SceneInvalidate(I->Obj.G); | |||
} | } | |||
/* Has no prototype */ | ||||
static CGO* ObjectMapCGOGenerate(PyMOLGlobals *G, float* corner) | ||||
{ | ||||
int ok = true; | ||||
CGO *convertCGO = NULL; | ||||
CGO *shaderCGO = CGONewSized(G, 0); | ||||
CGOBegin(shaderCGO, GL_LINES); | ||||
CGOVertexv(shaderCGO, corner + 3 * 0); | ||||
CGOVertexv(shaderCGO, corner + 3 * 1); | ||||
CGOVertexv(shaderCGO, corner + 3 * 0); | ||||
CGOVertexv(shaderCGO, corner + 3 * 2); | ||||
CGOVertexv(shaderCGO, corner + 3 * 2); | ||||
CGOVertexv(shaderCGO, corner + 3 * 3); | ||||
CGOVertexv(shaderCGO, corner + 3 * 1); | ||||
CGOVertexv(shaderCGO, corner + 3 * 3); | ||||
CGOVertexv(shaderCGO, corner + 3 * 0); | ||||
CGOVertexv(shaderCGO, corner + 3 * 4); | ||||
CGOVertexv(shaderCGO, corner + 3 * 1); | ||||
CGOVertexv(shaderCGO, corner + 3 * 5); | ||||
CGOVertexv(shaderCGO, corner + 3 * 2); | ||||
CGOVertexv(shaderCGO, corner + 3 * 6); | ||||
CGOVertexv(shaderCGO, corner + 3 * 3); | ||||
CGOVertexv(shaderCGO, corner + 3 * 7); | ||||
CGOVertexv(shaderCGO, corner + 3 * 4); | ||||
CGOVertexv(shaderCGO, corner + 3 * 5); | ||||
CGOVertexv(shaderCGO, corner + 3 * 4); | ||||
CGOVertexv(shaderCGO, corner + 3 * 6); | ||||
CGOVertexv(shaderCGO, corner + 3 * 6); | ||||
CGOVertexv(shaderCGO, corner + 3 * 7); | ||||
CGOVertexv(shaderCGO, corner + 3 * 5); | ||||
CGOVertexv(shaderCGO, corner + 3 * 7); | ||||
CGOEnd(shaderCGO); | ||||
CGOStop(shaderCGO); | ||||
convertCGO = CGOCombineBeginEnd(shaderCGO, 0); | ||||
CHECKOK(ok, convertCGO); | ||||
CGOFree(shaderCGO); | ||||
shaderCGO = convertCGO; | ||||
if (ok) | ||||
convertCGO = CGOOptimizeToVBONotIndexedWithReturnedData(shaderCGO, 0, 0, NUL | ||||
L); | ||||
else | ||||
return NULL; | ||||
CHECKOK(ok, convertCGO); | ||||
if (!ok) | ||||
return NULL; | ||||
CGOFree(shaderCGO); | ||||
shaderCGO = convertCGO; | ||||
shaderCGO->use_shader = true; | ||||
return shaderCGO; | ||||
} | ||||
static void ObjectMapRender(ObjectMap * I, RenderInfo * info) | static void ObjectMapRender(ObjectMap * I, RenderInfo * info) | |||
{ | { | |||
PyMOLGlobals *G = I->Obj.G; | PyMOLGlobals *G = I->Obj.G; | |||
int state = info->state; | int state = info->state; | |||
CRay *ray = info->ray; | CRay *ray = info->ray; | |||
Picking **pick = info->pick; | Picking **pick = info->pick; | |||
int pass = info->pass; | int pass = info->pass; | |||
ObjectMapState *ms = NULL; | ObjectMapState *ms = NULL; | |||
if(pass) | if(pass) | |||
skipping to change at line 1854 | skipping to change at line 1924 | |||
for(StateIterator iter(G, I->Obj.Setting, state, I->NState); | for(StateIterator iter(G, I->Obj.Setting, state, I->NState); | |||
iter.next();) { | iter.next();) { | |||
state = iter.state; | state = iter.state; | |||
if(I->State[state].Active) | if(I->State[state].Active) | |||
ms = &I->State[state]; | ms = &I->State[state]; | |||
if(ms) { | if(ms) { | |||
float *corner = ms->Corner; | float *corner = ms->Corner; | |||
float tr_corner[24]; | float tr_corner[24]; | |||
ObjectPrepareContext(&I->Obj, ray); | ObjectPrepareContext(&I->Obj, info); | |||
if(ms->State.Matrix) { /* transform the corners before drawing */ | if(ms->State.Matrix) { /* transform the corners before drawing */ | |||
int a; | int a; | |||
for(a = 0; a < 8; a++) { | for(a = 0; a < 8; a++) { | |||
transform44d3f(ms->State.Matrix, corner + 3 * a, tr_corner + 3 * a); | transform44d3f(ms->State.Matrix, corner + 3 * a, tr_corner + 3 * a); | |||
} | } | |||
corner = tr_corner; | corner = tr_corner; | |||
} | } | |||
if((I->Obj.visRep & cRepExtentBit)) { | if((I->Obj.visRep & cRepExtentBit)) { | |||
if(ray) { | if(ray) { | |||
float *vc; | const float *vc; | |||
float radius = ray->PixelRadius / 1.4142F; | float radius = ray->PixelRadius / 1.4142F; | |||
vc = ColorGet(G, I->Obj.Color); | vc = ColorGet(G, I->Obj.Color); | |||
ray->color3fv(vc); | ray->color3fv(vc); | |||
ray->sausage3fv(corner + 3 * 0, corner + 3 * 1, radius, vc, vc); | ray->sausage3fv(corner + 3 * 0, corner + 3 * 1, radius, vc, vc); | |||
ray->sausage3fv(corner + 3 * 0, corner + 3 * 2, radius, vc, vc); | ray->sausage3fv(corner + 3 * 0, corner + 3 * 2, radius, vc, vc); | |||
ray->sausage3fv(corner + 3 * 2, corner + 3 * 3, radius, vc, vc); | ray->sausage3fv(corner + 3 * 2, corner + 3 * 3, radius, vc, vc); | |||
ray->sausage3fv(corner + 3 * 1, corner + 3 * 3, radius, vc, vc); | ray->sausage3fv(corner + 3 * 1, corner + 3 * 3, radius, vc, vc); | |||
ray->sausage3fv(corner + 3 * 0, corner + 3 * 4, radius, vc, vc); | ray->sausage3fv(corner + 3 * 0, corner + 3 * 4, radius, vc, vc); | |||
ray->sausage3fv(corner + 3 * 1, corner + 3 * 5, radius, vc, vc); | ray->sausage3fv(corner + 3 * 1, corner + 3 * 5, radius, vc, vc); | |||
ray->sausage3fv(corner + 3 * 2, corner + 3 * 6, radius, vc, vc); | ray->sausage3fv(corner + 3 * 2, corner + 3 * 6, radius, vc, vc); | |||
ray->sausage3fv(corner + 3 * 3, corner + 3 * 7, radius, vc, vc); | ray->sausage3fv(corner + 3 * 3, corner + 3 * 7, radius, vc, vc); | |||
ray->sausage3fv(corner + 3 * 4, corner + 3 * 5, radius, vc, vc); | ray->sausage3fv(corner + 3 * 4, corner + 3 * 5, radius, vc, vc); | |||
ray->sausage3fv(corner + 3 * 4, corner + 3 * 6, radius, vc, vc); | ray->sausage3fv(corner + 3 * 4, corner + 3 * 6, radius, vc, vc); | |||
ray->sausage3fv(corner + 3 * 6, corner + 3 * 7, radius, vc, vc); | ray->sausage3fv(corner + 3 * 6, corner + 3 * 7, radius, vc, vc); | |||
ray->sausage3fv(corner + 3 * 5, corner + 3 * 7, radius, vc, vc); | ray->sausage3fv(corner + 3 * 5, corner + 3 * 7, radius, vc, vc); | |||
} else if(G->HaveGUI && G->ValidContext) { | } else if(G->HaveGUI && G->ValidContext) { | |||
if(pick) { | if(pick) { | |||
} else { | #ifndef PURE_OPENGL_ES_2 | |||
} else if (!info->use_shaders) { | ||||
// immediate | ||||
ObjectUseColor(&I->Obj); | ObjectUseColor(&I->Obj); | |||
glDisable(GL_LIGHTING); | glDisable(GL_LIGHTING); | |||
glBegin(GL_LINES); | glBegin(GL_LINES); | |||
glVertex3fv(corner + 3 * 0); | glVertex3fv(corner + 3 * 0); | |||
glVertex3fv(corner + 3 * 1); | glVertex3fv(corner + 3 * 1); | |||
glVertex3fv(corner + 3 * 0); | glVertex3fv(corner + 3 * 0); | |||
glVertex3fv(corner + 3 * 2); | glVertex3fv(corner + 3 * 2); | |||
glVertex3fv(corner + 3 * 2); | glVertex3fv(corner + 3 * 2); | |||
skipping to change at line 1926 | skipping to change at line 1998 | |||
glVertex3fv(corner + 3 * 6); | glVertex3fv(corner + 3 * 6); | |||
glVertex3fv(corner + 3 * 6); | glVertex3fv(corner + 3 * 6); | |||
glVertex3fv(corner + 3 * 7); | glVertex3fv(corner + 3 * 7); | |||
glVertex3fv(corner + 3 * 5); | glVertex3fv(corner + 3 * 5); | |||
glVertex3fv(corner + 3 * 7); | glVertex3fv(corner + 3 * 7); | |||
glEnd(); | glEnd(); | |||
glEnable(GL_LIGHTING); | glEnable(GL_LIGHTING); | |||
} else { | ||||
#endif | ||||
// shader | ||||
if (!ms->shaderCGO) { | ||||
ms->shaderCGO = ObjectMapCGOGenerate(G, corner); | ||||
} | ||||
if (ms->shaderCGO) { | ||||
CShaderPrg* shaderPrg = G->ShaderMgr->Enable_DefaultShader(info->p | ||||
ass); | ||||
if (shaderPrg) { | ||||
shaderPrg->SetLightingEnabled(0); | ||||
CGORenderGL(ms->shaderCGO, ColorGet(G, I->Obj.Color), | ||||
NULL, NULL, info, NULL); | ||||
shaderPrg->Disable(); | ||||
} | ||||
} | ||||
} | } | |||
} | } | |||
} | } | |||
if((I->Obj.visRep & cRepDotBit)) { | if((I->Obj.visRep & cRepDotBit)) { | |||
if(!ms->have_range) { | if(!ms->have_range) { | |||
double sum = 0.0, sumsq = 0.0; | double sum = 0.0, sumsq = 0.0; | |||
CField *data = ms->Field->data; | CField *data = ms->Field->data; | |||
int cnt = data->dim[0] * data->dim[1] * data->dim[2]; | int cnt = data->dim[0] * data->dim[1] * data->dim[2]; | |||
float *raw_data = (float *) data->data; | float *raw_data = (float *) data->data; | |||
skipping to change at line 1988 | skipping to change at line 2077 | |||
float width = | float width = | |||
SettingGet_f(G, NULL, I->Obj.Setting, cSetting_dot_width); | SettingGet_f(G, NULL, I->Obj.Setting, cSetting_dot_width); | |||
if(ray) { | if(ray) { | |||
float radius = ray->PixelRadius * width / 1.4142F; | float radius = ray->PixelRadius * width / 1.4142F; | |||
float vc[3]; | float vc[3]; | |||
int color = I->Obj.Color; | int color = I->Obj.Color; | |||
int ramped = ColorCheckRamped(G, I->Obj.Color); | int ramped = ColorCheckRamped(G, I->Obj.Color); | |||
{ | { | |||
float *tmp = ColorGet(G, I->Obj.Color); | const float *tmp = ColorGet(G, I->Obj.Color); | |||
copy3f(tmp, vc); | copy3f(tmp, vc); | |||
} | } | |||
for(a = 0; a < cnt; a++) { | for(a = 0; a < cnt; a++) { | |||
float f_val = *(raw_data++); | float f_val = *(raw_data++); | |||
RAW_POINT_TRANSFORM(raw_point_ptr, raw_point); | RAW_POINT_TRANSFORM(raw_point_ptr, raw_point); | |||
if((f_val >= high_cut) || (f_val <= low_cut)) { | if((f_val >= high_cut) || (f_val <= low_cut)) { | |||
if(ramped) { | if(ramped) { | |||
ColorGetRamped(G, color, raw_point, vc, state); | ColorGetRamped(G, color, raw_point, vc, state); | |||
ray->color3fv(vc); | ray->color3fv(vc); | |||
} | } | |||
ray->sphere3fv(raw_point, radius); | ray->sphere3fv(raw_point, radius); | |||
} | } | |||
} | } | |||
} else if(G->HaveGUI && G->ValidContext) { | } else if(G->HaveGUI && G->ValidContext) { | |||
if(pick) { | if(pick) { | |||
} else { | } else if (ALWAYS_IMMEDIATE_OR(!info->use_shaders)) { | |||
if(gradients) { | if(gradients) { | |||
raw_gradient = (float *) gradients->data; | raw_gradient = (float *) gradients->data; | |||
} else { | } else { | |||
glDisable(GL_LIGHTING); | glDisable(GL_LIGHTING); | |||
} | } | |||
{ | { | |||
int ramped = ColorCheckRamped(G, I->Obj.Color); | int ramped = ColorCheckRamped(G, I->Obj.Color); | |||
float vc[3]; | float vc[3]; | |||
int color = I->Obj.Color; | int color = I->Obj.Color; | |||
float gt[3]; | float gt[3]; | |||
End of changes. 9 change blocks. | ||||
5 lines changed or deleted | 96 lines changed or added |