void uiSequenceNode::draw (uiNode_t* node) { if (EXTRADATA(node).context != nullptr && 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]); UI_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); UI_PopClipRect(); R_PopMatrix(); if (finished) { if (EXTRADATA(node).onEnd != nullptr) { UI_ExecuteEventActions(node, EXTRADATA(node).onEnd); } else if (EXTRADATA(node).lua_onEnd != LUA_NOREF) { UI_ExecuteLuaEventScript(node, EXTRADATA(node).lua_onEnd); } EXTRADATA(node).playing = false; } } }
/** * @brief Draw the inventory of the base */ static void UI_BaseInventoryNodeDraw2 (uiNode_t* node, const objDef_t* highlightType) { bool updateScroll = false; int visibleHeight = 0; int needHeight = 0; vec2_t screenPos; UI_GetNodeScreenPos(node, screenPos); UI_PushClipRect(screenPos[0], screenPos[1], node->box.size[0], node->box.size[1]); needHeight = UI_BaseInventoryNodeDrawItems(node, highlightType); UI_PopClipRect(); visibleHeight = node->box.size[1]; #if 0 R_FontDrawString("f_verysmall", ALIGN_UL, node->box.pos[0], node->box.pos[1], node->box.pos[0], node->box.pos[1], 0, 0, /* maxWidth/maxHeight */ 0, va("%i %i/%i", EXTRADATA(node).scrollCur, visibleRows, totalRows), 0, 0, nullptr, false, 0); #endif /* Update display of scroll buttons if something changed. */ if (visibleHeight != EXTRADATA(node).scrollY.viewSize || needHeight != EXTRADATA(node).scrollY.fullSize) { EXTRADATA(node).scrollY.fullSize = needHeight; EXTRADATA(node).scrollY.viewSize = visibleHeight; updateScroll = true; } if (EXTRADATA(node).scrollY.viewPos > needHeight - visibleHeight) { EXTRADATA(node).scrollY.viewPos = needHeight - visibleHeight; updateScroll = true; } if (EXTRADATA(node).scrollY.viewPos < 0) { EXTRADATA(node).scrollY.viewPos = 0; updateScroll = true; } if (updateScroll) UI_BaseInventoryNodeUpdateScroll(node); }
/** * @sa CMod_GetMapSize * @note we only need to handle the 2d plane and can ignore the z level * @param[in] node Node description of the radar */ void uiRadarNode::draw (uiNode_t* node) { vec2_t pos; vec2_t screenPos; #ifdef RADARSIZE_DEBUG int textposy = 40; static const vec4_t red = {1, 0, 0, 0.5}; #endif static const vec4_t backgroundColor = {0.0, 0.0, 0.0, 1}; const float mapWidth = cl.mapData->mapBox.getWidthX(); const float mapHeight = cl.mapData->mapBox.getWidthY(); /** @todo use the same coef for x and y */ const float mapCoefX = (float) node->box.size[0] / (float) mapWidth; const float mapCoefY = (float) node->box.size[1] / (float) mapHeight; if (cls.state != ca_active) return; UI_GetNodeAbsPos(node, pos); UI_GetNodeScreenPos(node, screenPos); R_CleanupDepthBuffer(pos[0], pos[1], node->box.size[0], node->box.size[1]); UI_DrawFill(pos[0], pos[1], mapWidth * mapCoefX, mapHeight * mapCoefY, backgroundColor); #ifndef RADARSIZE_DEBUG UI_PushClipRect(screenPos[0], screenPos[1], node->box.size[0], node->box.size[1]); #endif /* the cl struct is wiped with every new map */ if (!cl.radarInitialized) { UI_InitRadar(node); cl.radarInitialized = true; } /* update context */ radar.x = pos[0]; radar.y = pos[1]; radar.w = node->box.size[0]; radar.h = node->box.size[1]; if (radar.gridWidth < 6) radar.gridWidth = 6; if (radar.gridHeight < 6) radar.gridHeight = 6; #ifdef RADARSIZE_DEBUG UI_DrawStringInBox("f_small", ALIGN_UL, 50, textposy, 500, 25, va("%fx%f %fx%f map", cl.mapData->mapBox.getMinX(), cl.mapData->mapBox.getMinY(), cl.mapData->getMaxX(), cl.mapData->getMaxY())); textposy += 25; UI_DrawStringInBox("f_small", ALIGN_UL, 50, textposy, 500, 25, va("%fx%f map", mapWidth, mapHeight)); textposy += 25; #endif /* draw background */ for (int i = 0; i < radar.numImages; i++) { vec2_t imagePos; hudRadarImage_t* tile = &radar.images[i]; int maxlevel = cl_worldlevel->integer; /* check the max level value for this map tile */ if (maxlevel >= tile->maxlevel) maxlevel = tile->maxlevel - 1; assert(tile->path[maxlevel]); imagePos[0] = radar.x + mapCoefX * (tile->mapX - cl.mapData->mapBox.getMinX()); imagePos[1] = radar.y + mapCoefY * (tile->mapY - cl.mapData->mapBox.getMinY()); UI_DrawNormImageByName(false, imagePos[0], imagePos[1], mapCoefX * tile->mapWidth, mapCoefY * tile->mapHeight, 0, 0, 0, 0, tile->path[maxlevel]); #ifdef RADARSIZE_DEBUG UI_DrawStringInBox("f_small", ALIGN_UL, 50, textposy, 500, 25, va("%dx%d %dx%d %s", tile->x, tile->y, tile->width, tile->height, tile->path[maxlevel])); textposy += 25; UI_DrawStringInBox("f_small", ALIGN_UL, imagePos[0], imagePos[1], 500, 25, va("%dx%d", tile->gridX, tile->gridY)); #endif } #ifdef RADARSIZE_DEBUG UI_DrawFill(pos[0], pos[1], 100.0f * mapCoefX, 100.0f * mapCoefY, red); UI_DrawFill(pos[0], pos[1], UNIT_SIZE * mapCoefX, UNIT_SIZE * mapCoefY, red); #endif le_t* le = nullptr; while ((le = LE_GetNextInUse(le))) { vec3_t itempos; if (LE_IsInvisible(le)) continue; /* convert to radar area coordinates */ itempos[0] = pos[0] + (le->origin[0] - cl.mapData->mapBox.getMinX()) * mapCoefX; itempos[1] = pos[1] + (mapHeight - (le->origin[1] - cl.mapData->mapBox.getMinY())) * mapCoefY; switch (le->type) { case ET_ACTOR: case ET_ACTOR2x2: UI_RadarNodeDrawActor(le, itempos); break; case ET_ITEM: UI_RadarNodeDrawItem(le, itempos); break; default: break; } #ifdef RADARSIZE_DEBUG UI_DrawStringInBox("f_small", ALIGN_UL, 50, textposy, 500, 25, va("%fx%f %dx%d actor", le->origin[0], le->origin[1], le->pos[0], le->pos[1])); textposy += 25; UI_DrawFill(itempos[0], itempos[1], UNIT_SIZE * mapCoefX, 1, red); UI_DrawFill(itempos[0], itempos[1], 1, UNIT_SIZE * mapCoefY, red); #endif } #ifndef RADARSIZE_DEBUG UI_PopClipRect(); #endif }
void uiGeoscapeNode::draw (uiNode_t* node) { vec2_t screenPos; geoscapeNode = node; UI_MAPEXTRADATA(node).flatgeoscape = cl_3dmap->integer == 0; UI_MAPEXTRADATA(node).radarOverlay = Cvar_GetValue("geo_overlay_radar"); UI_MAPEXTRADATA(node).nationOverlay = Cvar_GetValue("geo_overlay_nation"); UI_MAPEXTRADATA(node).xviOverlay = Cvar_GetValue("geo_overlay_xvi"); UI_MAPEXTRADATA(node).ambientLightFactor = cl_3dmapAmbient->value; UI_MAPEXTRADATA(node).mapzoommin = cl_mapzoommin->value; UI_MAPEXTRADATA(node).mapzoommax = cl_mapzoommax->value; UI_GetNodeAbsPos(node, UI_MAPEXTRADATA(node).mapPos); Vector2Copy(node->box.size, UI_MAPEXTRADATA(node).mapSize); if (!UI_MAPEXTRADATACONST(node).flatgeoscape) { /* remove the left padding */ UI_MAPEXTRADATA(node).mapSize[0] -= UI_MAPEXTRADATACONST(node).paddingRight; } /* Draw geoscape */ UI_GetNodeScreenPos(node, screenPos); UI_PushClipRect(screenPos[0], screenPos[1], node->box.size[0], node->box.size[1]); if (UI_MAPEXTRADATACONST(node).smoothRotation) { if (UI_MAPEXTRADATACONST(node).flatgeoscape) smoothTranslate(node); else smoothRotate(node); } geoscapeData_t& data = *UI_MAPEXTRADATA(node).geoscapeData; data.geoscapeNode = node; GAME_DrawMap(&data); if (!data.active) return; const char* map = data.map; date_t& date = data.date; /* Draw the map and markers */ if (UI_MAPEXTRADATACONST(node).flatgeoscape) { /* the last q value for the 2d geoscape night overlay */ static float lastQ = 0.0f; /* the sun is not always in the plane of the equator on earth - calculate the angle the sun is at */ const float q = (date.day % DAYS_PER_YEAR + (float)(date.sec / (SECONDS_PER_HOUR * 6)) / 4) * 2 * M_PI / DAYS_PER_YEAR - M_PI; if (lastQ != q) { calcAndUploadDayAndNightTexture(node, q); lastQ = q; } R_DrawFlatGeoscape(UI_MAPEXTRADATACONST(node).mapPos, UI_MAPEXTRADATACONST(node).mapSize, (float) date.sec / SECONDS_PER_DAY, UI_MAPEXTRADATACONST(node).center[0], UI_MAPEXTRADATACONST(node).center[1], 0.5 / UI_MAPEXTRADATACONST(node).zoom, map, data.nationOverlay, data.xviOverlay, data.radarOverlay, r_dayandnightTexture, r_xviTexture, r_radarTexture); GAME_DrawMapMarkers(node); } else { bool disableSolarRender = false; if (UI_MAPEXTRADATACONST(node).zoom > 3.3) disableSolarRender = true; R_EnableRenderbuffer(true); R_Draw3DGlobe(UI_MAPEXTRADATACONST(node).mapPos, UI_MAPEXTRADATACONST(node).mapSize, date.day, date.sec, UI_MAPEXTRADATACONST(node).angles, UI_MAPEXTRADATACONST(node).zoom, map, disableSolarRender, UI_MAPEXTRADATACONST(node).ambientLightFactor, UI_MAPEXTRADATA(node).nationOverlay, UI_MAPEXTRADATA(node).xviOverlay, UI_MAPEXTRADATA(node).radarOverlay, r_xviTexture, r_radarTexture, true); GAME_DrawMapMarkers(node); R_DrawBloom(); R_EnableRenderbuffer(false); } UI_PopClipRect(); }
/** * @todo need to merge UI model case, and the common case (looks to be a copy-pasted code) */ void UI_DrawModelNode (uiNode_t* node, const char* source) { modelInfo_t mi; uiModel_t* model; vec3_t nodeorigin; vec2_t screenPos; assert(UI_NodeInstanceOf(node, "model")); /**< We use model extradata */ if (!source || 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_GetNodeScreenPos(node, screenPos); UI_GetNodeAbsPos(node, nodeorigin); R_CleanupDepthBuffer(nodeorigin[0], nodeorigin[1], node->box.size[0], node->box.size[1]); if (EXTRADATA(node).clipOverflow) { UI_PushClipRect(screenPos[0], screenPos[1], node->box.size[0], node->box.size[1]); } nodeorigin[0] += node->box.size[0] / 2 + EXTRADATA(node).origin[0]; nodeorigin[1] += node->box.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) UI_PopClipRect(); return; } /* if the node is linked to a parent, the parent will display it */ if (EXTRADATA(node).tag) { if (EXTRADATA(node).clipOverflow) UI_PopClipRect(); return; } /* autoscale? */ if (EXTRADATA(node).autoscale) { vec3_t autoScale; vec3_t autoCenter; const vec2_t size = {node->box.size[0] - node->padding, node->box.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) { 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 */ Mem_Free(EXTRADATA(node).animationState); EXTRADATA(node).animationState = nullptr; } animState_t* as = EXTRADATA(node).animationState; if (!as) { as = Mem_PoolAllocType(animState_t, cl_genericPool); 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 */ 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, nullptr, nullptr); /* 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) UI_PopClipRect(); }