| 125 | } |
| 126 | |
| 127 | void MeshRenderer::afterAsyncLoad(void* param) |
| 128 | { |
| 129 | MeshRenderer::AsyncLoadParam* asyncParam = (MeshRenderer::AsyncLoadParam*)param; |
| 130 | autorelease(); |
| 131 | if (asyncParam) |
| 132 | { |
| 133 | if (asyncParam->result) |
| 134 | { |
| 135 | _meshes.clear(); |
| 136 | _meshVertexDatas.clear(); |
| 137 | AX_SAFE_RELEASE_NULL(_skeleton); |
| 138 | removeAllAttachNode(); |
| 139 | |
| 140 | // create in the main thread |
| 141 | auto& meshdatas = asyncParam->meshdatas; |
| 142 | auto& materialdatas = asyncParam->materialdatas; |
| 143 | auto& nodeDatas = asyncParam->nodeDatas; |
| 144 | if (initFrom(*nodeDatas, *meshdatas, *materialdatas)) |
| 145 | { |
| 146 | auto meshdata = MeshRendererCache::getInstance()->getMeshRenderData(asyncParam->modelPath); |
| 147 | if (meshdata == nullptr) |
| 148 | { |
| 149 | // add to cache |
| 150 | auto data = new MeshRendererCache::MeshRenderData(); |
| 151 | data->materialdatas = materialdatas; |
| 152 | data->nodedatas = nodeDatas; |
| 153 | data->meshVertexDatas = _meshVertexDatas; |
| 154 | for (const auto mesh : _meshes) |
| 155 | { |
| 156 | data->programStates.pushBack(mesh->getProgramState()); |
| 157 | } |
| 158 | |
| 159 | MeshRendererCache::getInstance()->addMeshRenderData(asyncParam->modelPath, data); |
| 160 | |
| 161 | AX_SAFE_DELETE(meshdatas); |
| 162 | materialdatas = nullptr; |
| 163 | nodeDatas = nullptr; |
| 164 | } |
| 165 | } |
| 166 | AX_SAFE_DELETE(meshdatas); |
| 167 | AX_SAFE_DELETE(materialdatas); |
| 168 | AX_SAFE_DELETE(nodeDatas); |
| 169 | |
| 170 | setModelTexture(asyncParam->modelPath, asyncParam->texPath); |
| 171 | } |
| 172 | else |
| 173 | { |
| 174 | AXLOGW("file load failed: {}\n", asyncParam->modelPath); |
| 175 | } |
| 176 | asyncParam->afterLoadCallback(this, asyncParam->callbackParam); |
| 177 | } |
| 178 | } |
| 179 | |
| 180 | AABB MeshRenderer::getAABBRecursivelyImp(Node* node) |
| 181 | { |
no test coverage detected