void uiSequenceNode::draw (uiNode_t *node) { if (EXTRADATA(node).context != NULL && EXTRADATA(node).playing) { bool finished = false; vec2_t pos; vec2_t screenPos; UI_GetNodeAbsPos(node, pos); UI_GetNodeScreenPos(node, screenPos); R_PushMatrix(); R_CleanupDepthBuffer(pos[0], pos[1], node->box.size[0], node->box.size[1]); R_PushClipRect(screenPos[0], screenPos[1], node->box.size[0], node->box.size[1]); SEQ_SetView(EXTRADATA(node).context, pos, node->box.size); finished = !SEQ_Render(EXTRADATA(node).context); R_PopClipRect(); R_PopMatrix(); if (finished && EXTRADATA(node).onEnd) { UI_ExecuteEventActions(node, EXTRADATA(node).onEnd); EXTRADATA(node).playing = true; } } }
void UI_PopClipRect (void) { R_PopClipRect(); }
/** * @todo need to merge UI model case, and the common case (look to be a copy-pasted code) */ void UI_DrawModelNode (uiNode_t *node, const char *source) { modelInfo_t mi; uiModel_t *model; vec3_t nodeorigin; vec3_t autoScale; vec3_t autoCenter; assert(UI_NodeInstanceOf(node, "model")); /**< We use model extradata */ if (source[0] == '\0') return; model = UI_GetUIModel(source); /* direct model name - no UI model definition */ if (!model) { /* prevent the searching for a model def in the next frame */ mi.model = R_FindModel(source); mi.name = source; if (!mi.model) { Com_Printf("Could not find model '%s'\n", source); return; } } /* compute the absolute origin ('origin' property is relative to the node center) */ UI_GetNodeAbsPos(node, nodeorigin); R_CleanupDepthBuffer(nodeorigin[0], nodeorigin[1], node->size[0], node->size[1]); if (EXTRADATA(node).clipOverflow) R_PushClipRect(nodeorigin[0], nodeorigin[1], node->size[0], node->size[1]); nodeorigin[0] += node->size[0] / 2 + EXTRADATA(node).origin[0]; nodeorigin[1] += node->size[1] / 2 + EXTRADATA(node).origin[1]; nodeorigin[2] = EXTRADATA(node).origin[2]; VectorMA(EXTRADATA(node).angles, cls.frametime, EXTRADATA(node).omega, EXTRADATA(node).angles); mi.origin = nodeorigin; mi.angles = EXTRADATA(node).angles; mi.scale = EXTRADATA(node).scale; mi.center = nullVector; mi.color = node->color; mi.mesh = 0; /* special case to draw models with UI model */ if (model) { UI_DrawModelNodeWithUIModel(node, source, &mi, model); if (EXTRADATA(node).clipOverflow) R_PopClipRect(); return; } /* if the node is linked to a parent, the parent will display it */ if (EXTRADATA(node).tag) { if (EXTRADATA(node).clipOverflow) R_PopClipRect(); return; } /* autoscale? */ if (EXTRADATA(node).autoscale) { const vec2_t size = {node->size[0] - node->padding, node->size[1] - node->padding}; R_ModelAutoScale(size, &mi, autoScale, autoCenter); } /* no animation */ mi.frame = 0; mi.oldframe = 0; mi.backlerp = 0; /* get skin */ if (EXTRADATA(node).skin && *EXTRADATA(node).skin) mi.skin = atoi(UI_GetReferenceString(node, EXTRADATA(node).skin)); else mi.skin = 0; /* do animations */ if (EXTRADATA(node).animation && *EXTRADATA(node).animation) { animState_t *as; const char *ref; ref = UI_GetReferenceString(node, EXTRADATA(node).animation); /* check whether the cvar value changed */ if (strncmp(EXTRADATA(node).oldRefValue, source, MAX_OLDREFVALUE)) { Q_strncpyz(EXTRADATA(node).oldRefValue, source, MAX_OLDREFVALUE); /* model has changed but mem is already reserved in pool */ if (EXTRADATA(node).animationState) { Mem_Free(EXTRADATA(node).animationState); EXTRADATA(node).animationState = NULL; } } if (!EXTRADATA(node).animationState) { as = (animState_t *) Mem_PoolAlloc(sizeof(*as), cl_genericPool, 0); if (!as) Com_Error(ERR_DROP, "Model %s should have animState_t for animation %s - but doesn't\n", mi.name, ref); R_AnimChange(as, mi.model, ref); EXTRADATA(node).animationState = as; } else { const char *anim; /* change anim if needed */ as = EXTRADATA(node).animationState; if (!as) Com_Error(ERR_DROP, "Model %s should have animState_t for animation %s - but doesn't\n", mi.name, ref); anim = R_AnimGetName(as, mi.model); if (anim && !Q_streq(anim, ref)) R_AnimChange(as, mi.model, ref); R_AnimRun(as, mi.model, cls.frametime * 1000); } mi.frame = as->frame; mi.oldframe = as->oldframe; mi.backlerp = as->backlerp; } /* draw the main model on the node */ R_DrawModelDirect(&mi, NULL, NULL); /* draw all children */ if (node->firstChild) { uiNode_t *child; modelInfo_t pmi = mi; for (child = node->firstChild; child; child = child->next) { const char *tag; char childSource[MAX_VAR]; const char* childRef; /* skip non "model" nodes */ if (child->behaviour != node->behaviour) continue; /* skip invisible child */ if (child->invis || !UI_CheckVisibility(child)) continue; OBJZERO(mi); mi.angles = EXTRADATA(child).angles; mi.scale = EXTRADATA(child).scale; mi.center = nullVector; mi.origin = EXTRADATA(child).origin; mi.color = pmi.color; /* get the anchor name to link the model into the parent */ tag = EXTRADATA(child).tag; /* init model name */ childRef = UI_GetReferenceString(child, EXTRADATA(child).model); if (Q_strnull(childRef)) childSource[0] = '\0'; else Q_strncpyz(childSource, childRef, sizeof(childSource)); mi.model = R_FindModel(childSource); mi.name = childSource; /* init skin */ if (EXTRADATA(child).skin && *EXTRADATA(child).skin) mi.skin = atoi(UI_GetReferenceString(child, EXTRADATA(child).skin)); else mi.skin = 0; R_DrawModelDirect(&mi, &pmi, tag); } } if (EXTRADATA(node).clipOverflow) R_PopClipRect(); }